<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"  xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>技术开发交流_讨论区_Open-Lib.Com</title>
    <link>http://www.open-lib.com/</link>
    <description>做最好的UI插件资源网站</description>
    <language>zh-cn</language>
    <ttl>2</ttl> 
    <pubDate>Tue,15 May 2012 02:49:36 GMT</pubDate>
    <lastBuildDate>Tue,15 May 2012 02:49:36 GMT</lastBuildDate>
    <generator>www.open-lib.com</generator>
	<atom:link href="http://www.open-lib.com/RSS/Forum/Forum_1.action" rel="self" type="application/rss+xml" />
    <managingEditor>admin@open-lib.com</managingEditor>
    <webMaster>admin@open-lib.com</webMaster>
	
	    <item>
		<title><![CDATA[189邮箱,拒绝接收本站的订阅]]></title>
		<link>http://www.open-lib.com/Forum/Read_143_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2012-01-09 16:16:29&nbsp;&nbsp;点击：<b>208</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>您的邮件被收件人（xxxxx@189.cn）所在服务商判为垃圾邮件，对方不予接收。 各位用户可以尝试下，将本站域名open-lib.com添加到白名单。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_143_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,9 Jan 2012 08:16:29 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_143_1.action</link>
		<category><![CDATA[短信订阅平台]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[本站发布开源的ol.loading遮罩插件]]></title>
		<link>http://www.open-lib.com/Forum/Read_42_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2010-08-26 10:05:00&nbsp;&nbsp;点击：<b>3865</b>&nbsp;&nbsp;回复：<b>21</b>
		<p>ol.loading是基于jquery的loading mask遮罩控件，轻量，且功能强大。 支持主流浏览器：ie6+，firefox等。 基于MIT和GPL协议下开源。 使用方法： 加载需要支持的类库： &lt;script type=&quot;text/javascript&quot; src=&quot;loading-min.js&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt; &lt;script type=&quot;text/javascript&quot; src=&quot;jquery.bgiframe.min.js&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt; &lt;link href=&quot;loading.css&quot; type=&quot;text/css&quot; rel=&quot;stylesheet&quot;&gt; 调用：  var loading=new ol.loading({id:&quot;table1&quot;});//初始化对象 loading.show();//显示遮罩 loading.hide();//隐藏遮罩  支持属性： new ol.loading({ id:&quot;table1&quot;,//需显示遮罩对象的id loadingClass:null,//外加样式 zIndex:800//z-index }); &nbsp; 演示地址：http://open-lib.googlecode.com/svn/trunk/ol.loading_0.1/demo.html 下载地址：http://open-lib.googlecode.com/svn/trunk/ol.loading_0.1/ol.loading.rar</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_42_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Tue,15 May 2012 01:43:12 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_42_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[再次请教下dhtmlxScheduler的问题]]></title>
		<link>http://www.open-lib.com/Forum/Read_153_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>墨</b></span>&nbsp;&nbsp;发表于 2012-05-03 16:10:30&nbsp;&nbsp;点击：<b>16</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>控件最上面的几个按钮，包括今天、前、后、日、月、周的点击事件怎么写？找了半天没找到。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_153_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Fri,4 May 2012 05:35:02 GMT</pubDate>
		<author>墨</author> 
		<link>http://www.open-lib.com/Forum/Read_153_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[请教下dhtmlxScheduler的页面显示问题]]></title>
		<link>http://www.open-lib.com/Forum/Read_152_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>墨</b></span>&nbsp;&nbsp;发表于 2012-04-18 18:31:02&nbsp;&nbsp;点击：<b>45</b>&nbsp;&nbsp;回复：<b>4</b>
		<p>现在想要实现的是在日和周界面显示的时间是从一个特定的时间（例如早上7点）开始，而不是从最上面的0点，但是又不能把起始时间设为7点（那样就舍弃了7点之前的时间）。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_152_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Thu,19 Apr 2012 01:29:58 GMT</pubDate>
		<author>墨</author> 
		<link>http://www.open-lib.com/Forum/Read_152_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[管理员，我收不到邮件，请帮忙查看一下是什么原因？]]></title>
		<link>http://www.open-lib.com/Forum/Read_149_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>luf06</b></span>&nbsp;&nbsp;发表于 2012-03-14 15:52:07&nbsp;&nbsp;点击：<b>17</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>管理员，我收不到邮件，请帮忙查看一下是什么原因？</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_149_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Thu,15 Mar 2012 03:02:12 GMT</pubDate>
		<author>luf06</author> 
		<link>http://www.open-lib.com/Forum/Read_149_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[大虾，在你分享的资料中有wdContextMenu,类别:Context Menu-右键菜单,请问一下第二级右键菜单怎么动态获取]]></title>
		<link>http://www.open-lib.com/Forum/Read_141_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>skyle19870810</b></span>&nbsp;&nbsp;发表于 2011-12-30 14:33:48&nbsp;&nbsp;点击：<b>74</b>&nbsp;&nbsp;回复：<b>5</b>
		<p>你这个富文本框我不知道怎么插入图片，我就用文字表述吧，我要做的效果就是查询数据库看是否有数据，有数据就显示第二层右键菜单，没有数据就不显示，有没有好的实现方式，谢谢</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_141_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Sun,19 Feb 2012 01:00:44 GMT</pubDate>
		<author>skyle19870810</author> 
		<link>http://www.open-lib.com/Forum/Read_141_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[不支持IE9]]></title>
		<link>http://www.open-lib.com/Forum/Read_148_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>xulavigne</b></span>&nbsp;&nbsp;发表于 2012-02-15 09:44:58&nbsp;&nbsp;点击：<b>98</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>这插件相当好，界面简洁、熟悉，操作流畅，唯一的不足就是不支持IE9。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_148_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Wed,15 Feb 2012 02:35:07 GMT</pubDate>
		<author>xulavigne</author> 
		<link>http://www.open-lib.com/Forum/Read_148_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[请教一个dhtmlxScheduler页面刷新的问题]]></title>
		<link>http://www.open-lib.com/Forum/Read_146_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>levy</b></span>&nbsp;&nbsp;发表于 2012-01-21 22:22:00&nbsp;&nbsp;点击：<b>124</b>&nbsp;&nbsp;回复：<b>8</b>
		<p>页面第一次加载的时候用的ajax向后台读取数据形成XML后,数据库里更新了但是页面无论怎么刷新都是第一次加载的数据,无论我是直接改数据库还是对event更新事件更新都是这样读取不了最新数据!&nbsp;我后来调试的时候到scheduler.load()这个方法里看了一下,从后台传过了的XML文件被解析的时候一直是第一次加载的数据,但是我打开XML看到的确实更新后的数据!求帮帮忙 &nbsp; //update事件 art.dialog.open('Details.aspx?eventID=' + id + '&amp;sDate=' + CurentTime(scheduler.getEventStartDate(id)) + '&amp;eDate=' + CurentTime(scheduler.getEventEndDate(id)), { width: 797, height: 400, lock: true, background: '#eeeeee', // 背景色 opacity: 0.5, // 透明度 title: stime + ' - ' + etime + ' ' + Title, yesFn: function() { var o = scheduler.getEvent(id); var iframe = this.iframe.contentWindow; iframe.$('butsav').click(); var f = iframe.document; o.text = f.getElementById(&quot;txtDetails&quot;).value; o.content = f.getElementById(&quot;txtDetails&quot;).value; o.start_date = f.getElementById(&quot;txteventDate_s&quot;).value + &quot; &quot; + f.getElementById(&quot;droeventTime_s&quot;).options[f.getElementById(&quot;droeventTime_s&quot;).selectedIndex].value + &quot;:00&quot;; o.end_date = f.getElementById(&quot;txteventDate_e&quot;).value + &quot; &quot; + f.getElementById(&quot;droeventTime_e&quot;).options[f.getElementById(&quot;droeventTime_e&quot;).selectedIndex].value + &quot;:00&quot;; o.start_date = new Date(o.start_date.replace(/-/, &quot;/&quot;)) o.end_date = new Date(o.end_date.replace(/-/, &quot;/&quot;)) o._timed = scheduler.is_one_day_event(o); o.startTime = f.getElementById(&quot;droeventTime_s&quot;).options[f.getElementById(&quot;droeventTime_s&quot;).selectedIndex].value; o.endTime = f.getElementById(&quot;droeventTime_e&quot;).options[f.getElementById(&quot;droeventTime_e&quot;).selectedIndex].value; CelendarBoxCloseing(id, o); //更新界面event }, yesText: '保存', noFn: true, noText: '关闭' }, false) } function CelendarBoxCloseing(id, data) { scheduler.setEvent(id, data); scheduler.event_updated(data); //更新显示的对象 scheduler.callEvent(&quot;onAfterLightbox&quot;, [])//调用为onAfterLightbox的动作 } //init事件$.ajax( { type: &quot;POST&quot;, url: &quot;init.aspx?r=&quot; + Math.random(), //后台 data: '', //参数 success: function(data) { if (data) scheduler.load(data); //读取成功时，用后台传来的xml文件地址，让dhtmlxScheduler加载 }, error: function() { alert('无法连接服务器'); } });</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_146_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Wed,1 Feb 2012 06:55:40 GMT</pubDate>
		<author>levy</author> 
		<link>http://www.open-lib.com/Forum/Read_146_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[ol.wordCount仿微博字数统计的插件]]></title>
		<link>http://www.open-lib.com/Forum/Read_145_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2012-01-11 15:28:03&nbsp;&nbsp;点击：<b>55</b>&nbsp;&nbsp;回复：<b>0</b>
		<p><strong>简介</strong>  基于Jquery实现的仿微博字数统计的插件，兼容多种浏览器。 1个中文字统计1个字，2个英文字统计为1个字，3个英文字统计为2个字。 地址：http://www.open-lib.com/Lib/1671.jsp &nbsp;  <strong>方法摘要</strong> 方法名：ol.wordCount(selector:String, callback:String/Function,options:Object/Array) 返回值：无 参数说明： <strong>selector</strong>：绑定对象（jQuery选择表达式）<strong>callback</strong>: 回填已经输入的字数的对象或方法<strong>options</strong>：参数设置(见下表)，可以是一个对象，针对所有要统计的输入框设置同一个参数，或者是一个数组，数组里每个元素对应一个输入框的设置 &nbsp;  <strong>参数</strong>     参数名   类型   默认值   是否必填   备注     max   int   Number.MAX_VALUE   可选   允许输入的最大字符数     exceedCallback   function   null   可选   超过最大字符数时执行的回调方法     &nbsp; <strong>示例</strong> html代码： &nbsp; &lt;textarea id=&quot;inputText&quot;&gt;test测试&lt;/textarea&gt; &lt;div&gt;您输入了&lt;span id=&quot;wordCountTips&quot;&gt;&lt;/span&gt;个字&lt;/div&gt;  js代码：  ol.wordCount(&quot;#inputText&quot;, &quot;#wordCountTips&quot;, { max:100,//100字节 exceedCallback:function(){ //alert(&quot;字符超过限制&quot;); } });</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_145_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Wed,11 Jan 2012 07:21:32 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_145_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[大哥。。。救命啊。。。jQuery Dialog 2.1的拖拽坐标怎么取啊]]></title>
		<link>http://www.open-lib.com/Forum/Read_144_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>tf</b></span>&nbsp;&nbsp;发表于 2012-01-10 20:25:50&nbsp;&nbsp;点击：<b>44</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>大哥。。。救命啊。。。jQuery Dialog 2.1的拖拽完得动态坐标怎么取啊</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_144_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Wed,11 Jan 2012 06:02:17 GMT</pubDate>
		<author>tf</author> 
		<link>http://www.open-lib.com/Forum/Read_144_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[遇到一个API 问题 看不懂   大家来看看]]></title>
		<link>http://www.open-lib.com/Forum/Read_139_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>炉坊巷</b></span>&nbsp;&nbsp;发表于 2011-12-12 19:14:54&nbsp;&nbsp;点击：<b>38</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>var data = new Array();try{ &nbsp;for( var i in JSONHOUSEINFO1.items) {&nbsp;&nbsp;if( !isNaN(i) ) {&nbsp;&nbsp;&nbsp;var tmp = HTML.replace(&quot;{chamber_f}&quot;,JSONHOUSEINFO1.items[i].chamber_f);&nbsp;&nbsp;&nbsp;tmp = tmp.replace(&quot;{chamber_t}&quot;,JSONHOUSEINFO1.items[i].chamber_t);&nbsp;&nbsp;&nbsp;tmp = tmp.replace(&quot;{hid}&quot;,JSONHOUSEINFO1.items[i].hid);&nbsp;&nbsp;&nbsp;tmp = tmp.replace(&quot;{fPlot}&quot;,JSONHOUSEINFO1.items[i].plot);&nbsp;&nbsp;&nbsp;tmp = tmp.replace(&quot;{plot}&quot;,JSONHOUSEINFO1.items[i].plot.substr(0,4));&nbsp;&nbsp;&nbsp;tmp = tmp.replace(&quot;{id}&quot;,JSONHOUSEINFO1.items[i].id);&nbsp;&nbsp;&nbsp;tmp = tmp.replace(&quot;{fInfoName}&quot;,JSONHOUSEINFO1.items[i].name);&nbsp;&nbsp;&nbsp;tmp = tmp.replace(&quot;{infoName}&quot;,JSONHOUSEINFO1.items[i].name.substr(0,16));&nbsp;&nbsp;&nbsp;tmp = tmp.replace(&quot;{pay}&quot;,JSONHOUSEINFO1.items[i].pay);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.push(tmp);&nbsp;&nbsp;}&nbsp;}&nbsp;document.getElementById(&quot;topic1_1&quot;).innerHTML = data.join(&quot; &quot;);} catch(e) {&nbsp;alert(e.toString());}</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_139_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,12 Dec 2011 11:38:19 GMT</pubDate>
		<author>炉坊巷</author> 
		<link>http://www.open-lib.com/Forum/Read_139_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[温故知新 javascript 正则表达式]]></title>
		<link>http://www.open-lib.com/Forum/Read_132_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-12-02 07:56:21&nbsp;&nbsp;点击：<b>42</b>&nbsp;&nbsp;回复：<b>3</b>
		<p>很长时间没看 正则表达式了，碰巧今天用到，温故知新了一把 看书学习吧 50% 的举一反三练习中的原创。 &nbsp; 一 javascript正则表达式的基本知识 &nbsp; 1 &nbsp; &nbsp; javascript 正则对象创建 和用法 &nbsp; &nbsp; 声明javascript 正则表达式  var reCat = new RegExp(&quot;cat&quot;); &nbsp; &nbsp; &nbsp; 你也可以&nbsp;  var reCat = /cat/; //Perl 风格 （推荐） 2 学习最常用的 test exec match search &nbsp;replace &nbsp;split 6个方法 &nbsp; &nbsp;1） test &nbsp;检查指定的字符串是否存在  var data = &quot;123123&quot;; var reCat = /123/gi; alert(reCat.test(data)); //true //检查字符是否存在 g 继续往下走 i 不区分大小写 &nbsp; &nbsp;2） exec 返回查询值  var data = &quot;123123,213,12312,312,3,Cat,cat,dsfsdfs,&quot;; var reCat = /cat/i; alert(reCat.exec(data)); //Cat &nbsp; &nbsp; &nbsp;3）match &nbsp;得到查询数组  var data = &quot;123123,213,12312,312,3,Cat,cat,dsfsdfs,&quot;; var reCat = /cat/gi; var arrMactches = data.match(reCat) for (var i=0;i &lt; arrMactches.length ; i++) { alert(arrMactches[i]); //Cat cat } &nbsp; &nbsp; &nbsp;4） search &nbsp;返回搜索位置 &nbsp;类似于indexof  var data = &quot;123123,213,12312,312,3,Cat,cat,dsfsdfs,&quot;; var reCat = /cat/gi; alert(data.search(reCat)); //23 &nbsp; &nbsp; 5） replace &nbsp;替换字符 &nbsp;利用正则替换  var data = &quot;123123,213,12312,312,3,Cat,cat,dsfsdfs,&quot;; var reCat = /cat/gi; alert(data.replace(reCat,&quot;libinqq&quot;)); &nbsp; &nbsp; 6）split &nbsp; 利用正则分割数组  var data = &quot;123123,213,12312,312,3,Cat,cat,dsfsdfs,&quot;; var reCat = /\,/; var arrdata = data.split(reCat); for (var i = 0; i &lt; arrdata.length; i++) { alert(arrdata[i]); } 3 &nbsp;学习下 &nbsp;简单类 &nbsp; 负向类 &nbsp;范围类 &nbsp;组合类  //简单类 var data = &quot;1libinqq,2libinqq,3libinqq,4libinqq&quot;; var reCat = /[123]libinqq/gi; var arrdata = data.match(reCat); for (var i = 0; i &lt; arrdata.length; i++) { alert(arrdata[i]); // 1libinqq 2libinqq 3libinqq } //负向类 var data = &quot;alibinqq,1libinqq,2libinqq,3libinqq,4libinqq&quot;; var reCat = /[^a123]libinqq/gi; var arrdata = data.match(reCat); for (var i = 0; i &lt; arrdata.length; i++) { alert(arrdata[i]); //4libinqq } //范围类 var data = &quot;libinqq1,libinqq2,libinqq3,libinqq4,libinqq5&quot;; var reCat = /libinqq[2-3]/gi; var arrdata = data.match(reCat); for (var i = 0; i &lt; arrdata.length; i++) { alert(arrdata[i]); // libinqq2 libinqq3 } //组合类 var data = &quot;a,b,c,w,1,2,3,5&quot;; var reCat = /[a-q1-4\n]/gi; var arrdata = data.match(reCat); for (var i = 0; i &lt; arrdata.length; i++) { alert(arrdata[i]); // a b c 1 2 3 }</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_132_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,5 Dec 2011 09:32:23 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_132_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[Yahoo!网站性能最佳体验的34条黄金守则  / 雅虎军规 / 前端优化]]></title>
		<link>http://www.open-lib.com/Forum/Read_131_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-12-01 14:01:50&nbsp;&nbsp;点击：<b>68</b>&nbsp;&nbsp;回复：<b>0</b>
		<p><strong>1.Minimize HTTP Requests 减少HTTP请求</strong> 图片、css、script、flash等等这些都会增加http请求数，减少这些元素的数量就能减少响应时间。把多个JS、CSS在可能的情况下写进一个文件，页面里直接写入图片也是不好的做法，应该写进CSS里，利用 CSS sprites 将小图拼合后利用background来定位。 <strong>2.Use a Content Delivery Network 利用CDN技术</strong> CDN 确实是好东西，8过服务器提供商的这项服务一般是要收费的，我以前买的国内空间是有这个的但是我当时根本不知道啥用，现在没了。。。 <strong>3.Add an Expires or a Cache-Control Header 设置头文件过期或者静态缓存</strong> 浏览器会用缓存来减少http请求数来加快页面加载的时间，如果页面头部加一个很长的过期时间，浏览器就会一直缓存页面里的元素。不过这样如果页面里的东西变动的话就要改名字了，否则用户端不会主动刷新，看自己衡量了~ 这项可以通过修改.htaccess文件来实现。 <strong>4.Gzip Components Gzip压缩</strong> Gzip格式是一种很普遍的压缩技术，几乎所有的浏览器都有解压Gzip格式的能力，而且它可以压缩的比例非常大，一般压缩率为85%。压缩没压缩，可以到 这里 做下测试。 <strong>5.Put Stylesheets at the Top 把CSS放顶部</strong> 让浏览者能尽早的看到网站的完整样式。 <strong>6.Put Scripts at the Bottom 把JS放底部</strong> 网站呈现完毕后再进行功能设置，当然这些JS要在你的加载过程中不影响内容表现。 <strong>7.Avoid CSS Expressions 避免CSS Expressions</strong> CSS表达式很可怕，这个只被IE支持的东西执行时候的运算量非常大，你移动一下鼠标它都要进行重计算的，但有时候为了做浏览器的兼容必须要用到这个||| IE6去死去死!~ <strong>8.Make JavaScript and CSS External 将JS和CSS外链</strong> 前面讲到了缓存这个事情，一些较为公用的JS和CSS，我们可以使用外链的形式，譬如我就是从Google外链来的Jquery文件，如果我的浏览者在浏览别的使用了这个外链文件的网站时已经下载并缓存了这个文件，那么他在浏览我的网站的时候就不需要再进行下载了!~ <strong>9.Reduce DNS Lookups 减少DNS查找</strong> 貌似是要减少网站从外部调用资源，我的Google分析和picasa的外链图片都算在里面了。 <strong>10.Minify JavaScript and CSS 减小JS和CSS的体积</strong> 写JS和CSS都是有技巧的，用最少的代码实现同样的功能，减少空白，增强逻辑性，用缩写方式等等，当然也有不少工具也能够帮你实现这一点。 <strong>11. Avoid Redirects 避免重定向</strong> 再写入链接时，虽然”http://www. today-s-ooxx. com”和”http://www. today-s-ooxx. com/” 仅有一个最后的”/”只差，但是结果是不同的，服务器需要花时间把前者重定向为后者然后进行跳转，这个要自己注意，也可以在Apache里用Alias 或者mod_rewrite或者DirectorySlash解决。 <strong>12. Remove Duplicate Scripts 删除重复脚本</strong> 重复调用的代码浏览器并不会识别忽略，而是会再次运算一遍，这当然是大大的浪费。 <strong>13. Configure ETags 配置ETags</strong> 搞不清楚咋回事，总之我是在. htaccess里把它删除了。 <strong>14. Make Ajax Cacheable 缓存Ajax</strong> Ajax是实时响应的，在浏览器接收到新的数据前，旧的数据被缓存，这样能够更好的提高效率。 <strong>15. Flush the Buffer Early 尽早的释放缓冲</strong> 当用户进行页面请求时，服务器端需要花费200到500毫秒时间来拼合HTML，将写在head与body之间，释放缓冲，这样可以将文件头先发送出去，然后再发送文件内容，提高效率。 <strong>16. Use GET for AJAX Requests 用GET方式进行AJAX请求</strong> Get 方法和服务器只有一次交互(发送数据)，而 Post 要两次(发送头部再发送数据)。 <strong>17. Post-load Components 延迟加载组件</strong> 最先加载必须的组件进行页面初始化，然后再加载其他，YUI Image Loader 是很好的例子。 <strong>18. Preload components 预加载组件</strong> 提前加载以后可能用到的东西，和延迟加载并不冲突，它的目的是为后续请求提供更快的响应，参见Google首页上的CSS sprites应用。 <strong>19. Reduce the Number of DOM Elements 减少DOM元素数量</strong> 复杂的页面结构意味着更长的下载及响应时间，更合理更高效的使用标签来架构页面，是好的前端的必备条件。 <strong>20. Split Components Across Domains 跨域分离组件</strong> 页面组件多个来源可以增大你的平行下载量，但注意不要过多，超过2-4个域名会引起上面说到的DNS查找浪费。 <strong>21. Minimize the Number of iframes 减少iframe数量</strong> 需要更有效的利用 ifames。 iframe 优点：有利于下载缓慢的广告等第三方内容，安全沙箱，并行下载脚本 iframe 缺点：即使为空也会有较大资源消耗，会阻止页面的onload，非语义 <strong>22. No 404s 不要出现404页面</strong> 站点本身里(非搜索结果)出现404页面，无意义的404页面会影响用户体验并且会消耗服务器资源。 <strong>23. Reduce Cookie Size 减小Cookie</strong> Cookie在服务器及浏览器之间的通过文件头进行交换，尽可能减小Cookie体积，设置合理的过期时间，能够很好的提高效率。 <strong>24. Use Cookie-free Domains for Components 对组件使用无Cookie的域名</strong> 对静态组件的Cookie读取是一种浪费，使用另一个无Cookie的域名来存放你的静态组件式一个好方法，或者也可以在Cookie中只存放带www的域名。 <strong>25. Minimize DOM Access 减少DOM的访问次数</strong> JS访问DOM是很慢的，尽量不要用JS来设置页面布局。 <strong>26. Develop Smart Event Handlers 开发灵活的事件处理句柄</strong> DOM树上过多的元素被加入事件句柄的话，反应效率肯定会低，YUI事件工具有一个 onAvailable 方法可以帮助你灵活的设置DOM事件句柄 <strong>27. Choose &lt; link &gt;over @import 使用&lt; link &gt;而非 @import</strong> 在IE中使用@import就和在页面底部用&lt; link &gt;一样，我们前面说要把&lt; link &gt;放顶部的。 <strong>28. Avoid Filters 避免过滤器的使用</strong> 如果需要Alpha透明，不要使用AlphaImageLoader，它效率低下而且只对IE6及以下的版本适用，用PNG8图片。如果你非要使用，加上_filter以免影响IE7+用户。 <strong>29. Optimize Images 优化图片</strong> 将你的GIF转为PNG8会是个减小体积的好办法，另外有很多方法处理你的JPG及PNG图片以达到优化效果。 <strong>30. Optimize CSS Sprites 优化CSS Sprites</strong> 在CSS Sprites中竖直并尽量紧凑的排列图片，尽量将颜色相似的图片排在一起，会减小图片本身的大小及提高页面图片显示速度。 <strong>31. Don’t Scale Images in HTML 不要在HTML中缩放图片</strong> 图片要用多大的就用多大的，1000X1000的图片被width=”100′ height=”100′以后，本身的KB数是不会减少的。 <strong>32. Make favicon. ico Small and Cacheable 缩小favicon. ico的大小并缓存它</strong> 站点的浏览器ICO应该不是经常换吧，那就长时间的缓存它，并且最好控制在1K以下。 <strong>33. Keep Components under 25K 保证组件在25K以下</strong> iPhone不能缓存25K以上的组件，并且这还是要在被压缩前。 <strong>34. Pack Components into a Multipart Document 将组件打包进一个多部分的文档中</strong> 就好像在邮件中加入附件一样，一个HTTP请求就够了，但是这一技术需要确保你的代理支持，iPhone就不支持。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_131_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Thu,1 Dec 2011 05:24:37 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_131_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[HTTP中Get与Post的区别]]></title>
		<link>http://www.open-lib.com/Forum/Read_129_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-28 09:09:31&nbsp;&nbsp;点击：<b>41</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>1. GET请求的数据会附在URL之后（就是把数据放置在HTTP协议头中），以?分割URL和传输数据，参数之间以&amp;相连，如：login.action?name=xxx&amp;verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字，原样发送，如果是空格，转换为+，如果是中文/其他字符，则直接把字符串用BASE64编码，得出如：%E4%BD%A0%E5%A5%BD，其中%XX中的XX为该符号以16进制表示的ASCII。 &nbsp; POST把提交的数据则放置在是HTTP包的包体中。 &nbsp; &nbsp; &nbsp; 2. GET方式请求在的URL在HTTP协议规范中没有做限制，但不同浏览器有不同的长度限制。 &nbsp; POST方式请求在HTTP规范中同样没有做限制，起限制的一般是服务器的处理能力。 &nbsp; &nbsp; &nbsp; 3. GET请求可能给浏览器、代理缓存；POST则不会。 &nbsp; &nbsp; 4. GET安全性比较低。例如：可以在浏览器历史、服务器日志看到请求的URL（包括所有参数）。 POST则不会看到post提交的内容，仅仅是请求的URL。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_129_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,28 Nov 2011 01:08:50 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_129_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[在文本框,光标处,插入文本]]></title>
		<link>http://www.open-lib.com/Forum/Read_128_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-28 08:21:13&nbsp;&nbsp;点击：<b>24</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>function Insert(str) { var obj = document.getElementById('content'); //IE support if (document.selection) { obj.focus(); sel = document.selection.createRange(); sel.text = str; sel.select(); } //MOZILLA/NETSCAPE support else if (obj.selectionStart || obj.selectionStart == '0') { var startPos = obj.selectionStart; var endPos = obj.selectionEnd; // save scrollTop before insert var restoreTop = obj.scrollTop; obj.value = obj.value.substring(0, startPos) + str + obj.value.substring(endPos,obj.value.length); if (restoreTop &gt; 0) { // restore previous scrollTop obj.scrollTop = restoreTop; } obj.focus(); obj.selectionStart = startPos + str.length; obj.selectionEnd = startPos + str.length; } else { obj.value += str; obj.focus(); } }</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_128_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,28 Nov 2011 12:21:13 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_128_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[站长问下，你的登陆和注册用的弹出窗口是哪个插件？？]]></title>
		<link>http://www.open-lib.com/Forum/Read_121_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>E-freer</b></span>&nbsp;&nbsp;发表于 2011-11-19 08:23:30&nbsp;&nbsp;点击：<b>38</b>&nbsp;&nbsp;回复：<b>3</b>
		<p>老兄，你用的注册和登陆弹出窗口是用的哪个插件？？网站里面有吗？？？ &nbsp;</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_121_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Sun,27 Nov 2011 03:05:16 GMT</pubDate>
		<author>E-freer</author> 
		<link>http://www.open-lib.com/Forum/Read_121_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[[面试题]一个经理有三个女儿，三个女儿的年龄加起来等于13……]]></title>
		<link>http://www.open-lib.com/Forum/Read_127_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-27 00:26:36&nbsp;&nbsp;点击：<b>50</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>一个经理有三个女儿，三个女儿的年龄加起来等于13，三个女儿的年龄乘起来等于经理自己的年龄，有一个下属已知道经理的年龄，但仍不能确定经理三个女儿的年龄，这时经理说只有一个女儿的头发是黑的，然后这个下属就知道了经理三个女儿的年龄。请问三个女儿的年龄分别是多少？为什么？ &nbsp; &nbsp; &nbsp; ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ &nbsp; 此经理有一对双胞胎女儿，她们的年龄分别是：2岁、2岁、9岁；经理的年龄是32岁。 与生物学关系较密切. 发色与年龄之间的关系。 下属知道经理的年龄, 只要把13分成三个数, 三数乘积等于经理年龄有多种可能性&nbsp; 所以, 令下属猜不出答案的原因是: 缺乏附加条件, 三元方程无确定解，一定要转换成二元方程&nbsp; 假设三个女儿中没有双胞胎, 那么三个人年龄之间的差距应该大于一个值(生物学常识)&nbsp; 黑发是显性基因, 如果经理夫妇都不是黑发,那么这黑发的女孩就是...&nbsp; 真相只有一个: 女孩中没有双胞胎, 但是有有两个女孩的年龄是相同的!&nbsp; 然后, 解二元方程 &nbsp; 显然3个女儿的年龄都不为0，要不爸爸就为0岁了，因此女儿的年龄都大于等于1岁。这样可以得下面的情况：1*1*11=11，1*2**10=20，1*3*9=27，1*4*8=32，1*5*7=35，{1*6*6=36}，{2*2*9=36}，2*3*8=48，2*4*7=56，2*5*6=60，3*3*7=63，3*4*6=72，3*5*5=75，4*4*5=80因为下属已知道经理的年龄，但仍不能确定经理三个女儿的年龄，说明经理是36岁（因为{1*6*6=36}，{2*2*9=36}），所以3个女儿的年龄只有2种情况，经理又说只有一个女儿的头发是黑的，说明只有一个女儿是比较大的，其他的都比较小，头发还没有长成黑色的，所以3个女儿的年龄分别为2，2，9！&nbsp;</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_127_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Sat,26 Nov 2011 04:26:36 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_127_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[主流浏览器下&nbsp;(IE&nbsp;/&nbsp;FF&nbsp;/&nbsp;Chrome)&nbsp;的CSS&nbsp;Hack]]></title>
		<link>http://www.open-lib.com/Forum/Read_125_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-24 09:37:54&nbsp;&nbsp;点击：<b>45</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>.test{ color:#000000; /* FF,OP支持 */ color:#0000FF9; /* 所有IE浏览器(ie6+)支持 ；但是IE8不能识别“*”和“_”的css hack；所以我们可以这样写hack */ [color:#000000;color:#00FF00; /* SF,CH支持 */ *color:#FFFF00; /* IE7支持 */ _color:#FF0000; /* IE6支持 */ color:#FF0000 ; /* IE8支持 */ } color:#0000FF9;在IE浏览器下都支持哦，不过暂时测试了(IE6 - IE8)。 &nbsp; 至于为什么使用“9”我真的不清楚原因，但是网友丸子测试了其他0-13的数字，最终结果如下：  其中：OP表示Opera，SA表示Safari，Ch表示Chrome。 &nbsp;   body:nth-of-type(1) .CH{ color: #FF0000;/* 这是专门针对Chrome和Safari的CSS hack */ } &nbsp; 整理自：http://www.css88.com/archives/1681</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_125_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Thu,24 Nov 2011 01:37:54 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_125_1.action</link>
		<category><![CDATA[浏览器兼容]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[前端的DNS Prefetch / DNS 预解析 / DNS预取]]></title>
		<link>http://www.open-lib.com/Forum/Read_119_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-24 09:53:07&nbsp;&nbsp;点击：<b>59</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>DNS 实现域名到IP的映射。通过域名访问站点，每次请求都要做DNS解析。目前每次DNS解析，通常在200ms以下。针对DNS解析耗时问题，一些浏览器通过DNS Prefetch 来提高访问的流畅性。&nbsp; &nbsp; <strong>什么是 DNS Prefetch ?&nbsp;</strong> DNS Prefetch 是一种DNS 预解析技术，当你浏览网页时，浏览器会在加载网页时对网页中的域名进行解析缓存，这样在你单击当前网页中的连接时就无需进行DNS的解析，减少用户等待时间，提高用户体验。&nbsp; &nbsp; 目前支持 DNS Prefetch 的浏览器有 google chrome 和 firefox 3.5+ &nbsp; &nbsp;怎么个预取呢? 就是在浏览器加载网页时, 对网页中的&lt;link&gt;或者&lt;a&gt;的href属性中的域名进行后台的预解析,并且将解析结果缓存在浏览器端, 当用户在真正点击链接时, 省去在当下的DNS解析消耗, 把这个消耗过程转嫁到用户无法感知的浏览过程中去. &nbsp; 第一, 现代浏览器已经支持且默认打开了DNS Prefetch的功能. 当然也可以通过浏览器的配置来管理该功能: 	用Firefox3.5+可以这样: 浏览器默认就打开了HTTP协议下的DNS预取功能, 默认关闭HTTPS协议下的DNS预取功能, 可通过 about:config 的 network.dns.disablePrefetch 和 network.dns.disablePrefetchFromHTTPS 两个选项来控制两种协议下的预取功能. 	Chrome管理DNS Prefetch方法暂时缺少. &nbsp; 第二, 可以通过用meta信息来告知浏览器, 我这页面要做DNS预取:&nbsp; 	&lt;meta http-equiv=&quot;x-dns-prefetch-control&quot; content=&quot;on&quot; /&gt; &nbsp; 第三,可以使用link标签来强制对DNS做预取:&nbsp; 	&lt;link rel=&quot;dns-prefetch&quot; href=&quot;http://www.open-lib.com/&quot; /&gt;</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_119_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Fri,18 Nov 2011 07:01:39 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_119_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[编写高性能的Javascript代码]]></title>
		<link>http://www.open-lib.com/Forum/Read_117_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-18 12:01:01&nbsp;&nbsp;点击：<b>55</b>&nbsp;&nbsp;回复：<b>1</b>
		<p><strong>1.避免Javascript加载时Block引起的阻塞</strong> 在雅虎的高性能网页开发的14条军规中已经对这样的情况提出了解决方案。   第1条: 尽可能的减少 HTTP 的请求数 =&gt; 合并JS,减少Block的次数  第6条: 将脚本移动到底部（包括内联的）=&gt; 减少阻塞对网页加载页面渲染的影响  第10条: 压缩 JavaScript 和 CSS (包括内联的) =&gt; 减少阻塞的时间  <strong>2. 变量</strong>  <strong>1.重复使用的调用结果（如：循环控制量），事先保存到局部变量</strong> 	说明：避免多次取值的调用开销。 <strong>2.顺序无关的遍历时，用 while 替代 for</strong> 	说明：该方法可以减少局部变量的使用。比起效率优化，更能直接看到的是字符数量的优化。该做法有程序员强迫症的嫌疑。     <strong>3. 多使用ID选择器，少使用CSS选择器</strong> &nbsp; <strong>4. DOM</strong>  <strong>1.使用 DocumentFragment 优化多次 append</strong>   <strong>2.通过模板元素 clone ，替代 createElement</strong>   	说明：通过一个模板 dom 对象 cloneNode ，效率比直接创建 element 高。性能提高不明显，约为 10% 左右。在低于 100 个元素 create 和 append 操作时，没有优势。   <strong>3.使用一次 innerHTML 赋值代替构建 dom 元素</strong>   	说明：根据数据构建列表样式的时候，使用设置列表容器 innerHTML 的方式，比构建 dom 元素并 append 到页面中的方式，效率有数量级上的提高。 <strong>4.使用 firstChild 和 nextSibling 代替 childNodes 遍历 dom 元素</strong> 	说明：约能获得 30%-50% 的性能提高。逆向遍历时使用 lastChild 和 previousSibling 。 <strong></strong>  <strong>5. 使用冒泡机制减少事件绑定次数</strong> //不使用冒泡，绑定多次，性能较差 $(&quot;ul li&quot;).onclick(function(){ &nbsp;&nbsp;alert(this.html()); }); &nbsp; //使用冒泡，绑定1次，性能较好 $(&quot;ul&quot;).onclick(function(event){ &nbsp;&nbsp;&nbsp;alert($(event.target).html()); }); &nbsp; <strong>6. 定时器</strong> 定时器（timer）是作为监听或者定时执行经常用到的，因为循环定时执行，所以其对网页的性能消耗非常的大，所以，首先要注意控制定时器的间隔时间，不可过于密集，增添客户端的压力，同时也注意尽量使用一个定时器控制多件动作，而不是每个动作一个定时器。  &nbsp; <strong>1.需要不断执行的时候，优先考虑使用 setInterval</strong> 	说明： setTimeout 每一次都会初始化一个定时器。 setInterval 只会在开始的时候初始化一个定时器 <strong>2.setTimeout和setInterval&nbsp;使用 function 而不是 string</strong> 	说明：如果把字符串作为 setTimeout 和 setInterval 的参数，浏览器会先用这个字符串构建一个 function 。  <strong>7.其他</strong>  <strong>1.使用 Array 做为 StringBuffer ，代替字符串拼接的操作</strong> 	说明： IE 在对字符串拼接的时候，会创建临时的 String 对象;经测试，在 IE 下，当拼接的字符串越来越大时，运行效率会急剧下降。 Fx 和 Opera 都 对字符串拼接操作进行了优化;经测试，在 Fx 下，使用 Array 的 join 方式执行时间约为直接字符串拼接的 1.4 倍。 <strong>2.将条件分支，按可能性顺序从高到低排列</strong> 	说明：可以减少解释器对条件的探测次数。 <strong>3.在同一条件子的多( &gt;2 )条件分支时，使用 switch 优于 if</strong> 	说明： switch 分支选择的效率高于 if ，在 IE 下尤为明显。 4 分支的测试， IE 下 switch 的执行时间约为 if 的一半。 <strong>4.使用三目运算符替代条件分支</strong> <strong>5.尽量不使用动态语法元素</strong> 	说明： eval 、 Function 、 execScript 等语句会再次使用 javascript 解析引擎进行解析，需要消耗大量的执行时间。 <strong>6.使用直接量&nbsp;</strong>  var a = new Array(param,param,...) -&gt; var a = [] var foo = new Object() -&gt; var foo = {} var reg = new RegExp() -&gt; var reg = /.../    <strong>7.避免使用 with</strong>   	说明： with 虽然可以缩短代码量，但是会在运行时构造一个新的 scope 。 OperaDev 上还有这样的解释，使用 with 语句会使得解释器无法在语法解析阶段对代码进行优化。对此说法，无法验证。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_117_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Fri,18 Nov 2011 03:51:15 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_117_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[setCapture和releaseCapture的小应用]]></title>
		<link>http://www.open-lib.com/Forum/Read_116_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-17 23:16:09&nbsp;&nbsp;点击：<b>25</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>&nbsp;web开发和windows开发最大的区别就是windows开发是有状态的,而web开发是无状态的,在windows中,一切操作都可以由程序来控制 ,除非强制执行ctrl+alt+del;但web操作就不一样了,即使执行很重要的操作,用户一点击浏览器关闭按钮,就将前面操作成果化为乌有.尽管可以在onunload事件中加些代码,让用户可以选择是否退出,但不能从根本上解决问题!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前几天,从网上看到setCapture方法,了解了一下,大体是这样的意思,当在IE文档某个区域中使用了这个方法,并且写了onclick或者onmouse***等有关的鼠标事件方法,那么它就会监视相应的鼠标操作,即使你的鼠标移出了IE,它也一样能捕获到.如果你在某div中的onclick事件中写了一个alert命令,这时,你点击的关闭按钮,它也一样会弹出alert窗口.releaseCapture与setCapture方法相反,释放鼠标监控.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用这个特性,我们可以延缓IE的关闭窗口等破坏性操作,将一些重要的操作能够在破坏性操作执行之前得到处理.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有一点遗憾:setCapture和releaseCapture 不支持键盘事件.只对onmousedown, onmouseup, onmousemove, onclick, ondblclick, onmouseover, onmouseout这样的鼠标事件起作用.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是一个小例子,若我们要对divMain这个div元素里面的内容进行保护:&nbsp;1). 对divMain执行setCapture方法:&nbsp; document.getElementById(&quot;divMain&quot;).setCapture(); 2).加入一按钮btnChange,可以进行setCapture和releaseCapture切换,定义一全局变量;var isFreeze = true;&nbsp;3).在btnChange的onclick事件中,加入下列代码: function change_capture(obj) { isFreeze = !isFreeze; if(isFreeze) { obj.value = &quot;releaseCapture&quot;; document.getElementById(&quot;divMain&quot;).setCapture(); } else { obj.value = &quot;setCapture&quot;; alert('保存！'); //可以执行重要操作 document.getElementById(&quot;divMain&quot;).releaseCapture(); } } &nbsp;  4).divMain的onclick事件中,加入下列代码: function click_func() { if(event.srcElement.id == &quot;divMain&quot;) { alert(&quot;处理中...&quot;); //常规操作 document.getElementById(&quot;divMain&quot;).setCapture(); } else { if(isFreeze &amp;&amp; event.srcElement.id != &quot;btnChange&quot;) { alert('未执行releaseCapture,不能点击'); document.getElementById(&quot;divMain&quot;).setCapture(); } } }  5).对ALT+F4进行处理,在body的onkeydown事件中加入下列代码: function keydown_func() { if (event.keyCode==115 &amp;&amp; event.altKey) //ALT+F4 { if(isFreeze) { alert('保存！'); //可以执行重要操作 } //window.showModelessDialog(&quot;about:blank&quot;,&quot;&quot;,&quot;dialogWidth:1px;dialogheight:1px&quot;); //return false; } document.getElementById(&quot;divMain&quot;).setCapture(); }  完整代码如下: &lt;HTML&gt; &lt;head&gt; &lt;title&gt;setCapture和releaseCapture的小应用&lt;/title&gt; &lt;SCRIPT LANGUAGE=&quot;JavaScript&quot;&gt; &lt;!-- var isFreeze = true; function click_func() { if(event.srcElement.id == &quot;divMain&quot;) { alert(&quot;处理中...&quot;); //常规操作 document.getElementById(&quot;divMain&quot;).setCapture(); } else { if(isFreeze &amp;&amp; event.srcElement.id != &quot;btnChange&quot;) { alert('未执行releaseCapture,不能点击'); document.getElementById(&quot;divMain&quot;).setCapture(); } } } function keydown_func() { if (event.keyCode==115 &amp;&amp; event.altKey) //ALT+F4 { if(isFreeze) { alert('保存！'); //可以执行重要操作 } //window.showModelessDialog(&quot;about:blank&quot;,&quot;&quot;,&quot;dialogWidth:1px;dialogheight:1px&quot;); //return false; } document.getElementById(&quot;divMain&quot;).setCapture(); } function change_capture(obj) { isFreeze = !isFreeze; if(isFreeze) { obj.value = &quot;releaseCapture&quot;; document.getElementById(&quot;divMain&quot;).setCapture(); } else { obj.value = &quot;setCapture&quot;; alert('保存！'); //可以执行重要操作 document.getElementById(&quot;divMain&quot;).releaseCapture(); } } //--&gt; &lt;/SCRIPT&gt; &lt;/head&gt; &lt;BODY onkeydown=&quot;keydown_func();&quot;&gt; &lt;div id=&quot;divMain&quot; style=&quot;width:500px;height:400px;border:1px solid #999;padding:2px&quot; onclick=&quot;click_func();&quot;&gt; 点一下IE的菜单或者按钮看看:) 又或者IE窗口外的地方 &lt;input type=&quot;button&quot; value=&quot;releaseCapture&quot; onclick=&quot;change_capture(this);&quot; id=&quot;btnChange&quot;&gt; &lt;script language=&quot;javascript&quot;&gt; document.getElementById(&quot;divMain&quot;).setCapture(); &lt;/script&gt; &lt;/div&gt; &lt;/BODY&gt; &lt;/HTML&gt;  注意:该实例仅能应用于IE</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_116_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Thu,17 Nov 2011 03:15:44 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_116_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[用getSelection来获取网页的选中内容]]></title>
		<link>http://www.open-lib.com/Forum/Read_115_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-17 22:56:55&nbsp;&nbsp;点击：<b>18</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>function get_selection( ) { var d = document, w = window, s = w.getSelection, // chrome,opera,firefox k = d.getSelection, x = d.selection; // IE return encodeURIComponent( (s ? s() : (k) ? k() : (x ? x.createRange().text : 0)) ); }</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_115_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Thu,17 Nov 2011 02:56:55 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_115_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[slice()方法&nbsp;和splice&nbsp;方法的区别]]></title>
		<link>http://www.open-lib.com/Forum/Read_111_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-11-08 14:12:58&nbsp;&nbsp;点击：<b>35</b>&nbsp;&nbsp;回复：<b>0</b>
		<p><strong>定义</strong> splice() 方法&nbsp;用于插入、删除或替换数组的元素。 slice() 方法 可提取字符串的某个部分，并以新的字符串返回被提取的部分。 &nbsp; <strong>用法&nbsp;</strong> <strong>splice 的参数</strong>&nbsp;：<strong>splice</strong>&nbsp;(start, deleteCount, [item1[, item2[, . . . [,itemN]]]]) 数组从 start下标开始，删除deleteCount 个元素，并且可以在这个位置开始添加 n个元素 当start ,deleteCount 均为0 的时候，也就是在数组的最前面插入新的元素。 当 参数只有 start，deleteCount 就是从start 下标开始删除deleteCount 个数组的元素， 当参数只有start参数时，就是删除 从start下标起至最后 的元素 当参数 为负的时&nbsp;则该参数规定的是从数组元素的尾部开始算起的位置 （-1 指的是 数组中倒数第一个元素， -2 指的是，数组中倒数第二个元素。）  <strong>slice 参数&nbsp;： slice（</strong>start，end<strong>）；</strong> slice 方法，在string对象和array对象 的用法上类似。<strong>&nbsp;</strong> <strong>&nbsp;</strong>对于数组对象来说，slice 方法提取 从 start下标起 以end下标 为结尾的 一段元素（但不包括end下标的元素），然后返回新的数组，对原数组没有任何是影响， 当参数为负时 则该参数 是从 数组的末尾 索引 开始算起，（-1 指的是 数组中倒数第一个元素， -2 指的是，数组中倒数第二个元素。）&nbsp; 当参数为一个参数，当为一个参数时，提取 是以 start下标起 至末尾的 部分元素。 当start 为0 时， 等于说是 克隆一个新的数组，克隆后 两个数组进行各自的操作，都互不影响， var clone = array.slice(0)； <strong></strong> <strong>当然 克隆 数组还有其他办法</strong> 借用concat()函数进行数组的复制: concat() 用于进行数组的合并。使用语法为:&nbsp; arrayObject.concat(arrayX,arrayX,......,arrayX)&nbsp;&nbsp;concat()用于多个数组的合并，但是返回的结果是一个新的数组，而不再引用用于合并的任何一个数组。可以利用它的这个特性来用一个数组连接空数组或直接不传参数完成clone的功能.&nbsp;var clone= array.concat();</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_111_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Tue,8 Nov 2011 06:12:58 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_111_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[dhtmlxScheduler问题请教路大]]></title>
		<link>http://www.open-lib.com/Forum/Read_110_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>qqfuleiqq</b></span>&nbsp;&nbsp;发表于 2011-11-04 16:39:05&nbsp;&nbsp;点击：<b>68</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>我在做删除时，数据库已经删除记录了，但是页面上还是有记录，scheduler.load(&quot;initTask.do?r=&quot; + Math.random());这个已经重新发请求了，请求结果里面也没有被删除的记录，但是页面上还有显示，只能重新刷新整个浏览器或重新打开浏览器那条被删除的记录就不会在页面上显示，这是什么原因，怎么样能解决这个问题？</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_110_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Fri,4 Nov 2011 12:10:06 GMT</pubDate>
		<author>qqfuleiqq</author> 
		<link>http://www.open-lib.com/Forum/Read_110_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[请教dhtmlxscheduler 问题]]></title>
		<link>http://www.open-lib.com/Forum/Read_67_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>rain85922</b></span>&nbsp;&nbsp;发表于 2010-10-11 13:08:53&nbsp;&nbsp;点击：<b>471</b>&nbsp;&nbsp;回复：<b>31</b>
		<p>var _CelendarBox;//该处为，弹出窗口的HTML源码，我该处是通过AJAX预先载入HTML文件。function CelendarBox(id){&nbsp;loadXMLDoc();&nbsp;//alert(Box_Html);&nbsp;&nbsp;&nbsp; if (!id) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; if (!scheduler.callEvent(&quot;onBeforeLightbox&quot;, [id])) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; var o=scheduler.getEvent(id);&nbsp;&nbsp;&nbsp; var h=240;&nbsp;&nbsp;&nbsp; o.superior=o.superior?Trim(o.superior):&quot;&quot;;&nbsp;&nbsp;&nbsp; o.views=o.views?Trim(o.views):&quot;&quot;;&nbsp;&nbsp;&nbsp; o.content=o.content?Trim(o.content):&quot;&quot;;&nbsp;&nbsp;&nbsp; var tmp=Box_Html.replace(/{text}/g,o.text);//替换窗口HTML代码的{title}&nbsp;&nbsp;&nbsp; tmp=tmp.replace(/{content}/g,o.content);//替换窗口HTML代码的{content} &nbsp; 这段里面的Box_Html是怎么定义的，是不是通过ajax加载自己定义的html文件返回的？还有Box_Html.replace(/{text}/g,o.text)这个是不是就是在日程页面上选择已有日程的时候，替换掉自定义html文件里的东西，这种replace /{}/g 方法没用过，，，希望帮忙解释下。万分感激。 我自己定义的box.html如下： &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;&lt;form id=&quot;boxForm&quot;&gt;&nbsp;&lt;table&gt;&nbsp;&lt;input type=&quot;hidden&quot; id=&quot;superior&quot; name=&quot;superior&quot;/&gt;&nbsp;&lt;input type=&quot;hidden&quot; id=&quot;views&quot; name=&quot;views&quot;/&gt;&nbsp;&nbsp;&lt;tr&gt;&nbsp;&nbsp;&nbsp;&lt;td&gt;标题&lt;/td&gt;&nbsp;&nbsp;&nbsp;&lt;td&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type=&quot;text&quot; id=&quot;title&quot; name=&quot;title&quot;/&gt;&nbsp;&nbsp;&nbsp;&lt;/td&gt;&nbsp;&nbsp;&lt;/tr&gt;&nbsp;&nbsp;&lt;tr&gt;&nbsp;&nbsp;&nbsp;&lt;td&gt;内容&lt;/td&gt;&nbsp;&nbsp;&nbsp;&lt;td&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;textarea rows=&quot;5&quot; cols=&quot;30&quot; id=&quot;content&quot; name=&quot;content&quot;&gt;&lt;/textarea&gt;&nbsp;&nbsp;&nbsp;&lt;/td&gt;&nbsp;&nbsp;&lt;/tr&gt;&nbsp;&nbsp;&lt;tr&gt;&nbsp;&nbsp;&nbsp;&lt;td&gt;开始时间&lt;/td&gt;&nbsp;&nbsp;&nbsp;&lt;td&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type=&quot;text&quot; id=&quot;startTime&quot; name=&quot;startTime&quot;/&gt;&nbsp;&nbsp;&nbsp;&lt;/td&gt;&nbsp;&nbsp;&lt;/tr&gt;&nbsp;&nbsp;&lt;tr&gt;&nbsp;&nbsp;&nbsp;&lt;td&gt;结束时间&lt;/td&gt;&nbsp;&nbsp;&nbsp;&lt;td&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type=&quot;text&quot; id=&quot;endTime&quot; name=&quot;endTime&quot;/&gt;&nbsp;&nbsp;&nbsp;&lt;/td&gt;&nbsp;&nbsp;&lt;/tr&gt;&nbsp;&lt;/table&gt;&lt;/form&gt; &nbsp;</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_67_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Fri,4 Nov 2011 08:21:14 GMT</pubDate>
		<author>rain85922</author> 
		<link>http://www.open-lib.com/Forum/Read_67_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[button的空白边距]]></title>
		<link>http://www.open-lib.com/Forum/Read_108_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-10-27 14:42:54&nbsp;&nbsp;点击：<b>33</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>在IE6和IE7下（其他IE版本没测试），button有一个很大的边距，在FF和chrome是没有的. 开始以为是边距，结果把margin和padding都设置成0，结果还是有个默认的大边距，然后想下是不是IE的BUG，双倍边距，结果也不是，后来在网上找到解决版本。 在button的样式里加入overflow:visible</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_108_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Thu,27 Oct 2011 06:42:54 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_108_1.action</link>
		<category><![CDATA[浏览器兼容]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[如何检测HTML表单已经发生改变]]></title>
		<link>http://www.open-lib.com/Forum/Read_90_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2011-03-08 15:26:46&nbsp;&nbsp;点击：<b>101</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>表单是Web应用不可缺少的功能，它是服务器端与浏览器端数据交换的最基本的方法。你应该已经读过很多关于HTML5和Javascript的表单标签和数据验证的文章，今天我们来讨论下如何检查表单数据是否被改变了。 为什么要检查表单数据被改变？ 有很多理由需要检测表单数据是否有修改，让我们来看一个很常见的场景，如果用户修改了一个或多个表单域的值，当用户跳离当前页面时，你会给出用户类似“你的修改尚未保存”的提示。你甚至可以给出用户是否保存数据（比如Ajax）的选项。另外的情况，如果表单项没有被修改，这时略去冗余的表单验证和数据发送将会增强用户体验。 Javascript&nbsp;onchange事件 为HTML表单元素添加onchange事件处理器是一种可行的方法，这也是用的最多的，但是onchange的实现有一些问题存在：   如果用户改变表单域的值，然后再修改回原始值，程序仍将认为表单的修改已经发生。   如果表单项的值是通过Javascript动态修改的，onchange事件不会被自动触发。   为每一个表单元素增加onchange事件会引起性能问题，特别是较大的表单。   如果将表单元素从DOM中增加或移除，你需要相应的注册或移除事件侦听。   checkbox和radio的onchange事件在某些浏览器下不能按预期工作（你应该知道是哪个浏览器）。   除了onchange，还有更简单有效的方案。   比较默认值 幸运的是，我们不需要为了复杂的事件处理而写过多的废话，每个表单元素都有与该对象相关联的默认值，即页面加载完后表单控件显示或者默认的数据值，该值可与用户操作后的值进行对比以得出表单域的值是否发生了改变。 有点麻烦的是，不同类型的表单元素的默认值属性（properties）不尽相同（做些判断好了，并不影响什么） input和textarea 让我们从简单的元素开始，所有的textarea对象和除了checkbox、radio之外的&nbsp;input对象都有一个名为defaultValue的属性，我们可以对比文本域的当前值和默认值是否相同以决定文本域的修改是否发生。 &lt;!--&nbsp;name&nbsp;input&nbsp;--&gt; &lt;input&nbsp;type=&quot;text&quot;&nbsp;id=&quot;name&quot;&nbsp;name=&quot;name&quot;&nbsp;value=&quot;www.csser.com&quot;&nbsp;/&gt; &lt;script&gt; var&nbsp;name&nbsp;=&nbsp;document.getElementById(&quot;name&quot;); if&nbsp;(n.value&nbsp;!=&nbsp;n.defaultValue)&nbsp;alert(&quot;#name&nbsp;has&nbsp;changed&quot;); &lt;/script&gt; <strong>小提示</strong>：HTML4或XHTML中，文本域类型为text、hidden、password或file的对象有defaultValue属性。HTML5新的表单类型也有defaultValue属性并且可以用相同的方式检测默认值是否改变过，这些新表单元素包含email、tel、url、range、date、color和search。 checkbox和radio checkbox和radio对象有一个defaultChecked属性，其取值为true或false，我们可以通过对比当前选中状态与默认选中状态进行比较，如： &lt;!--&nbsp;newsletter&nbsp;opt-in&nbsp;--&gt; &lt;input&nbsp;type=&quot;checkbox&quot;&nbsp;id=&quot;optin&quot;&nbsp;name=&quot;optin&quot;&nbsp;checked=&quot;checked&quot;&nbsp;/&gt; &lt;script&gt; var&nbsp;optin&nbsp;=&nbsp;document.getElementById(&quot;optin&quot;); if&nbsp;(n.checked&nbsp;!=&nbsp;n.defaultChecked)&nbsp;alert(&quot;#optin&nbsp;has&nbsp;changed&nbsp;by&nbsp;csser&quot;); &lt;/script&gt; 注意checkbox和radio对象也有defaultValue属性，但它仅被分配给元素的value特性（attribute）而不能标识当前的选中状态。 下拉列表select select控件通常用于提供一个下拉列表供用户选择，相比上面提到的控件，select有一点复杂，select元素本身并不具有默认值属性，它的默认值存在于其option元素集合内。当页面加载完毕，默认选中的option拥有selected特性，也就是这个option对象拥有defaultSelected属性且值为true。 我们可以从select节点的selectedIndex属性取得当前选中的option的索引值，如果该option对象的defaultSelected属性为false，那么select控件的值一定被修改了，如： &lt;!--&nbsp;job&nbsp;title&nbsp;select&nbsp;box&nbsp;--&gt; &lt;select&nbsp;id=&quot;job&quot;&nbsp;name=&quot;job&quot;&gt; &lt;option&gt;web&nbsp;designer&lt;/option&gt; &lt;option&nbsp;selected=&quot;selected&quot;&gt;csser.com&nbsp;developer&lt;/option&gt; &lt;option&gt;graphic&nbsp;artist&lt;/option&gt; &lt;option&gt;IT&nbsp;professional&lt;/option&gt; &lt;option&gt;other&lt;/option&gt; &lt;/select&gt; &lt;script&gt; var&nbsp;job&nbsp;=&nbsp;document.getElementById(&quot;job&quot;); if&nbsp;(!job.options[job.selectedIndex].defaultSelected)&nbsp;alert(&quot;#job&nbsp;has&nbsp;changed&quot;); &lt;/script&gt; 上面的代码在单选下拉列表并且有一个option拥有selected特性时运行正常，但我们需要留意一些陷阱：   如果没有option被赋予selected特性，浏览器会将第一个设为默认选中，但其defaultSelected属性值却为false   如果两个或更多option拥有selected特性（这不合逻辑，但是可能的），每个option都会拥有defaultSelected属性且值为true，但是浏览器仅能得到最后一个的默认值。   多重选择控件允许用户选择任意个option：   &lt;!--&nbsp;skills&nbsp;multi-select&nbsp;box&nbsp;--&gt; &lt;select&nbsp;id=&quot;skills&quot;&nbsp;name=&quot;skills&quot;&nbsp;multiple=&quot;multiple&quot;&gt; &lt;option&nbsp;selected=&quot;selected&quot;&gt;HTML&lt;/option&gt; &lt;option&nbsp;selected=&quot;selected&quot;&gt;CSSer&lt;/option&gt; &lt;option&nbsp;selected=&quot;selected&quot;&gt;JavaScript&lt;/option&gt; &lt;option&gt;PHP&lt;/option&gt; &lt;/select&gt; 多选下拉列表并不常用，因为用多个checkbox可以提供更友好的界面，但是，如果使用多选下拉列表，多个option具有defaultSelected属性且值为true，select节点的selectedIndex属性已经无效，所以需要循环每一个option才能判断其selected属性是否与其defaultSelected属性相匹配。下面的代码可以解决这个问题： var&nbsp;&nbsp;skills&nbsp;=&nbsp;document.getElementById(&quot;skills&quot;),c&nbsp;=&nbsp;false,&nbsp;def&nbsp;=&nbsp;0,&nbsp;o,&nbsp;ol,&nbsp;opt; for&nbsp;(o&nbsp;=&nbsp;0,&nbsp;ol&nbsp;=&nbsp;n.options.length;&nbsp;o&nbsp;&lt;&nbsp;ol;&nbsp;o++)&nbsp;{ opt&nbsp;=&nbsp;skills.options[o]; c&nbsp;=&nbsp;c&nbsp;||&nbsp;(opt.selected&nbsp;!=&nbsp;opt.defaultSelected); if&nbsp;(opt.defaultSelected)&nbsp;def&nbsp;=&nbsp;o; } if&nbsp;(c&nbsp;&amp;&amp;&nbsp;!skills.multiple)&nbsp;c&nbsp;=&nbsp;(def&nbsp;!=&nbsp;skills.selectedIndex); if&nbsp;(c)&nbsp;alert(&quot;#skills&nbsp;has&nbsp;changed&quot;); 上面这些就是本文介绍的如何检测一个表单值是否改变的内容。  原文：How&nbsp;to&nbsp;Check&nbsp;That&nbsp;an&nbsp;HTML&nbsp;Form&nbsp;Has&nbsp;Been&nbsp;Changed翻译：http://www.csser.com/dev/287.html</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_90_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Tue,27 Sep 2011 03:00:12 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_90_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[路版！dhtmlxScheduler2.2日历组件问题？]]></title>
		<link>http://www.open-lib.com/Forum/Read_48_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>ah</b></span>&nbsp;&nbsp;发表于 2010-08-27 13:43:46&nbsp;&nbsp;点击：<b>186</b>&nbsp;&nbsp;回复：<b>6</b>
		<p>&nbsp;  你好，再次打搅你，现在我添加编辑都可以了，可是，编辑后数据不能实时更新到ＵＩ上，我点击刷新都没有用，我需要关闭IE，重启才可以看到我操作后的结果，请问我那出问题了。   看到你的注释里写&nbsp; CelendarBoxCloseing(id,data);//成功以后，还要更新页面上的信息喔。我用上这句也不管用。   可否把GlobaAjax这个JS发我，我怀疑我没有处理好喝后台的交互。谢谢。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_48_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Wed,21 Sep 2011 05:10:32 GMT</pubDate>
		<author>ah</author> 
		<link>http://www.open-lib.com/Forum/Read_48_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[jQuery ajax在GBK编码下表单提交终极解决方案（非二次编码方法）]]></title>
		<link>http://www.open-lib.com/Forum/Read_69_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2010-10-18 17:53:50&nbsp;&nbsp;点击：<b>2033</b>&nbsp;&nbsp;回复：<b>11</b>
		<p><strong>[版权声明]:版权归作者所有，转载时请以超链接形式标明文章原始出处和作者信息及本声明:</strong><strong><strong>http://www.open-lib.com/Forum/Read_69_1.action</strong></strong> <strong>前言:</strong> 当jquery ajax在utf-8编码下（页面utf－8，接收utf-8），无任何问题。可以正常post、get，处理页面直接获取正确的内容。 但在以下情况下: GBK -&gt; AJAX POST -&gt;GBK UTF-8 -&gt; AJAX POST -&gt;GBK 后台代码无法获取正确的内容，通常表现为获取到奇怪字符、问号。 <strong>经典解决方法：</strong> 1：发送页面、接收页面均采用UTF-8编码。 2：发送页面在调用ajax post方法之前，将含有中文内容的input用encodeURIComponent编码一次，而接收页面则调用解码方法（ 如：java.net.urldecoder.decode(&quot;接收到内容&quot;,&quot;utf-8&quot;)&nbsp; ）。 其中，第一种方法无疑是最简单、最直接，但往往不符合实际，因为很多项目并不是使用utf-8编码，例如国内大部分使用gbk编码，也不可能为了解决这样一个问题，而将整个项目转换为utf-8编码，成本太大，风险太高。 第二方法，是现在最多人使用的方法，俗称二次编码，为什么叫二次编码，等下会解释。客户端编码两次，服务端解码两次。但这种方法不好的地方，就是前台手动编码一次，后台再手动解码一次，稍不留神就会忘记，而且代码掺和前台逻辑。 <strong>交互过程：</strong> 当我们使用表单按照传统方式post提交时候（非AJAX提交），浏览器会根据当前页面编码，encode一次，然后发送到服务端，服务端接收到表单，会自动dencode一次，通常这个过程是对程序是透明的，因此加上手动编码、解码，就变成上面所说的二次编码。 但当我们使用AJAX方式提交时候，浏览器并不会自动替我们encode，因此在jquery中有这样的一段代码： ajax: function( s ) { // Extend the settings, but re-extend 's' so that it can be // checked again later (in the test suite, specifically) s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); var jsonp, jsre = /=?(&amp;|$)/g, status, data, type = s.type.toUpperCase(); // convert data if not already a string if ( s.data &amp;&amp; s.processData &amp;&amp; typeof s.data !== &quot;string&quot; ) s.data = jQuery.param(s.data); ........ } 以上是jquery的ajax方法的代码片段，下面是正常调用jquery ajax post的代码： $.ajax({ url: ajaxurl, type: 'POST', dataType: 'html', timeout: 20000,//超时时间设定 data:para,//参数设置 success: function(html){ } });  通过上面代码可以知道，当设置了data时候，jquery内部会调用jQuery.param方法对参数encode（执行本应浏览器处理的encode）。 jQuery.param=function( a ) { var s = [ ]; function add( key, value ){ s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value); }; // If an array was passed in, assume that it is an array // of form elements if ( jQuery.isArray(a) || a.jquery ) // Serialize the form elements jQuery.each( a, function(){ add( this.name, this.value ); }); // Otherwise, assume that it's an object of key/value pairs else // Serialize the key/values for ( var j in a ) // If the value is an array then the key names need to be repeated if ( jQuery.isArray(a[j]) ) jQuery.each( a[j], function(){ add( j, this ); }); else add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] ); // Return the resulting serialization return s.join(&quot;&amp;&quot;).replace(/%20/g, &quot;+&quot;); }//jquery.param end 上面是jQuery.param的代码，细心点可以留意到encodeURIComponent这方法，这是javascript内置的方法，对目标字符串执行utf-8 encode，因此，当页面使用gbk编码时候，服务端会使用gbk进行解码，但实际提交的数据是以utf-8编码的，所以造成接收到内容为乱码或者为问号。 <strong>解决方法：</strong> encodeURIComponent会以utf-8编码，在gbk编码下，可不可以以gbk进行编码呢？ 如果还在打encodeURIComponent主意的话，那不好意思，encodeURIComponent只会utf-8编码，并没有其他api进行其他编码；不过，别担心，看看下面： encodeURIComponent，它是将中文、韩文等特殊字符转换成utf-8格式的url编码。 escape对0-255以外的unicode值进行编码时输出%u****格式，其它情况下escape，encodeURI，encodeURIComponent编码结果相同。 哈哈，看到希望吧？没错，就是用escape代替encodeURIComponent方法，不过必须注意： escape不编码字符有69个：*，+，-，.，/，@，_，0-9，a-z，A-Z encodeURIComponent不编码字符有71个：!， '，(，)，*，-，.，_，~，0-9，a-z，A-Z 使用了escape之后必须对加号进行编码，否则，当内容含有加号时候会被服务端翻译为空格。 终于知道解决办法了，重写jquery代码： jQuery.param=function( a ) { var s = [ ]; var encode=function(str){ str=escape(str); str=str.replace(/+/g,&quot;%u002B&quot;); return str; }; function add( key, value ){ s[ s.length ] = encode(key) + '=' + encode(value); }; // If an array was passed in, assume that it is an array // of form elements if ( jQuery.isArray(a) || a.jquery ) // Serialize the form elements jQuery.each( a, function(){ add( this.name, this.value ); }); // Otherwise, assume that it's an object of key/value pairs else // Serialize the key/values for ( var j in a ) // If the value is an array then the key names need to be repeated if ( jQuery.isArray(a[j]) ) jQuery.each( a[j], function(){ add( j, this ); }); else add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] ); // Return the resulting serialization return s.join(&quot;&amp;&quot;).replace(/%20/g, &quot;+&quot;); } 上面那段代码并不需要在jquery的源文件重写，可以在你项目的javascript贴上，覆盖它原有的方法，不过必须在jquery加载之后。 经初步验证，上面那段代码在utf-8编码也可以工作正常，大概是编码成unicode的缘故吧。 这样，就不是需要使用什么二次编码，即影响前台，又影响后台。gbk编码下ajax post不再是问题了，此乃是终极解决方法。哈哈。 有兴趣的可以到http://www.open-lib.com/Forum/Read_69_1.action与作者交流。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_69_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Fri,9 Sep 2011 12:20:47 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_69_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[有没有比较好的web编辑器，可以插入各种代码？]]></title>
		<link>http://www.open-lib.com/Forum/Read_105_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>taote</b></span>&nbsp;&nbsp;发表于 2011-09-05 20:41:25&nbsp;&nbsp;点击：<b>74</b>&nbsp;&nbsp;回复：<b>2</b>
		<p>有没有比较好的web编辑器，可以插入各种代码？ 例如：  这种web编辑器插件有吗？？？</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_105_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,5 Sep 2011 02:16:39 GMT</pubDate>
		<author>taote</author> 
		<link>http://www.open-lib.com/Forum/Read_105_1.action</link>
		<category><![CDATA[交互设计]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[控件下载]]></title>
		<link>http://www.open-lib.com/Forum/Read_104_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>hbsnlx</b></span>&nbsp;&nbsp;发表于 2011-09-01 13:27:32&nbsp;&nbsp;点击：<b>108</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>怎么下载这个控件啊，广告我都点完了啊，收藏里也没有啊？？</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_104_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Thu,1 Sep 2011 09:01:59 GMT</pubDate>
		<author>hbsnlx</author> 
		<link>http://www.open-lib.com/Forum/Read_104_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[Open-Lib插件突破1000。。。。]]></title>
		<link>http://www.open-lib.com/Forum/Read_57_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2010-09-06 23:05:35&nbsp;&nbsp;点击：<b>329</b>&nbsp;&nbsp;回复：<b>18</b>
		<p>热烈庆祝。。。。 鼓掌。。。。 不过不知道有没重复的。。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_57_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Fri,26 Aug 2011 05:55:45 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_57_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[javascript中字符串具有前导，ParseInt&nbsp;返回&nbsp;0的解决方法]]></title>
		<link>http://www.open-lib.com/Forum/Read_97_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>lulu</b></span>&nbsp;&nbsp;发表于 2011-06-20 09:55:52&nbsp;&nbsp;点击：<b>104</b>&nbsp;&nbsp;回复：<b>0</b>
		<p><strong>问题描述:</strong> 当一个包含前导零的字符串值传递给 parseInt() JScript 函数时，parseInt 将返回0。  如parseInt(&quot;08&quot;)和parseInt(&quot;09&quot;)，其返回值为0。 <strong>原因：</strong> 在 JavaScript 放置的数字前面加 0 将指定的编号为八进制。在八进制，都没有 8 或 9。因此，这些数字被解释为 0。 <strong>解决方案：</strong> 使用parseInt(string,radix)时，指定基数radix；或者使用Number转换。 如：&nbsp;parseInt('08',10)或Number(&quot;08&quot;) <strong>parseInt(<em>string</em>, <em>radix</em>)语法：</strong>     参数   描述     string   必需。要被解析的字符串。     radix   可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。 如果省略该参数或其值为 0，则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头，将以 16 为基数。 如果该参数小于 2 或者大于 36，则 parseInt() 将返回 NaN。     &nbsp;</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_97_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,20 Jun 2011 01:55:52 GMT</pubDate>
		<author>lulu</author> 
		<link>http://www.open-lib.com/Forum/Read_97_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[？？？]]></title>
		<link>http://www.open-lib.com/Forum/Read_96_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>liyijun</b></span>&nbsp;&nbsp;发表于 2011-06-05 10:16:12&nbsp;&nbsp;点击：<b>31</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>这里的插件怎么下载啊？ &nbsp;</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_96_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Sun,5 Jun 2011 02:30:32 GMT</pubDate>
		<author>liyijun</author> 
		<link>http://www.open-lib.com/Forum/Read_96_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[一道Javascript面试题分析]]></title>
		<link>http://www.open-lib.com/Forum/Read_91_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2011-03-08 16:02:18&nbsp;&nbsp;点击：<b>554</b>&nbsp;&nbsp;回复：<b>2</b>
		<p>网友发了一道自己参加面试的题目，题目如下： f = function() {return true;}; g = function() {return false;}; (function() { if (g() &amp;&amp; [] == ![]) { f = function f() {return false;}; function g() {return true;} } })(); alert(f()); // true or false ?  按网友的描述猜测，这应该是QQ招聘的题目，既考查了ECMAScript知识，又需要被面试者的应用实践，题目本身无标准答案，在不同浏览器下表现不同。 这是一道难度较大，并且出题角度比较刁钻的面试题。 正赶上最近在研究Javascript这部分的内容，便对该题目涉及的考察点进行了更深入的研究。以下给出简单分析。 考察点   对作用域链（scope chain）、执行环境（execution context）、变量对象（variable object）的理解   命名函数表达式，参见这里   以上知识点在不同浏览器（主要为：IE和Firefox）的实现差异   相等操作符的隐式类型转换规则   首先，代码简化为（1）： f = function() {return true;}; g = function() {return false;}; (function() { alert(g()); function g() {return true;} })();  上面的例子中，当控制器进入匿名函数的执行环境后，初始化活动对象，函数声明g被放到了执行环境的变量对象集合中，property为g，值为g函数对象，当执行g()，返回true。 将上面的代码稍加改变（2）： f = function() {return true;}; g = function() {return false;}; (function() { alert(g()); if (true) { function g() {return true;} } })();  上面代码，结果应该与（1）相同，但Firefox处理结果出现了不同返回false，暂且把这看作是Firefox的bug（虽然Firefox不认为这是个Bug）。 分析：在Firefox中，出现在条件语句中的代码块不做活动对象初始化的处理（Firefox把它当作块作用域？？），即把上例的if&nbsp;(true)&nbsp;修改为&nbsp;if&nbsp;(false)&nbsp;结果是一样的。 到此为止，已经可以确定g()执行后的值是true还是false了。 整合一下（3）： f = function() {return true;}; g = function() {return false;}; (function() { if (g()) { alert(&quot;能看到这个警告框，说明你的浏览器不是Firefox&quot;); function g() {return true;} } })();  继续分解代码（4）： f = function() {return true;}; g = function() {return false;}; (function() { f = function() {return false;}; })(); alert(f());  代码运行，无一例外的返回false，这正是我们想要的结果。 然后稍作改变（5）： f = function() {return true;}; g = function() {return false;}; (function() { f = function f() {return false;}; })(); alert(f());  经过稍加修改后，这次掉链子的轮到IE了，IE竟然返回了true！！！这是IE的Bug，参见：  http://www.cn-cuckoo.com/main/wp-content/uploads/2009/12/named-function-expressions-demystified.html#named-expr http://www.w3help.org/zh-cn/causes/SJ9001  至于[]==![]的结果，请参考本人《Javascript类型转换规则》一文，回过头来你就会轻易得出结论。 最后大整合。 我们不仅知道结果，而且知道为啥是这结果了（6）： f = function() {return true;}; g = function() {return false;}; (function() { if (g() &amp;&amp; [] == ![]) { f = function f() {return false;}; function g() {return true;} } })(); alert(f());  没有问题的浏览器会返回：false Firefox不会执行到if条件内部，返回：true IE会执行到if条件内部（但把if内部的f作为局部变量处理了），最后返回：true</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_91_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Sat,23 Apr 2011 12:54:46 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_91_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[命名函数表达式探秘]]></title>
		<link>http://www.open-lib.com/Forum/Read_95_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2011-03-09 09:21:05&nbsp;&nbsp;点击：<b>82</b>&nbsp;&nbsp;回复：<b>4</b>
		<p>转于:http://www.cn-cuckoo.com/main/wp-content/uploads/2009/12/named- function-expressions-demystified.html  前言 我觉得很奇怪，网上好像一直没有人认真地讨论过命名函数表达式（Named Function Expression，即“有名字函数表达式”，与“匿名函数”相对。——译者注）。而这也许正是各种各样的误解随处可见的一个原因。在这篇文章里，我打 算从理论和实践两个方面出发，对这些令人惊叹的JavaScript结构的优缺点给出一个结论。 简单来讲，命名函数表达式只有一个用处——在调试器或性能分析程序中描述函数的名称。没错，也可以使用函数名实现递归，但你很快就会知道，目前来看 这通常是不切实际的。当然，如果你不关注调试，那就没什么可担心的。否则，就应该往下看一看，看看在跨浏览器开发中都会出现哪些小毛病（glitch）， 也看看应该怎样解决它们。 一开始呢，我会先介绍一下什么是函数表达式，以及现代调试器如何处理它们之类的内容。要是你比较心急，请直接跳到“最终方案”部分，该部分详细说明了怎样才能安全地使用这些结构。 函数表达式与函数声明 在ECMAScript中，有两个最常用的创建函数对象的方法，即使用<em>函数表达式</em>或者使用<em>函数声明</em>。这两种方 法之间的区别可谓 <strong>相当地令人困惑</strong>；至少我是相当地困惑。对此，ECMA规范只明确了一点，即<em>函数声明</em> 必须始终带有一个<em>标识符（Identifier）</em>——也就是函数名呗，而<em>函数表达式</em> 则可省略这个标识符：  函数声明：function Identifier ( FormalParameterList opt ){ FunctionBody } 函数表达式：function Identifier opt ( FormalParameterList opt ){ FunctionBody }  显然，在省略标识符的情况下， “表达式” 也就只能是表达式了。可要是不省略标识符呢？谁知道它是一个函数声明，还是一个函数表达式——毕竟，这种情况下二者是完全一样的啊？实践表 明，ECMAScript是通过上下文来区分这两者的：假如 function foo(){} 是一个赋值表达式的一部分，则认为它是一个函数表达式。而如果 function foo(){} 被包含在一个函数体内，或者位于程序（的最上层）中，则将它作为一个函数声明来解析。 &nbsp; function foo(){}; // 声明，因为它是<em>程序</em>的一部分&nbsp; var bar = function foo(){}; // 表达式，因为它是<em>赋值表达式（AssignmentExpression）的一部分</em>&nbsp; new function bar(){}; // 表达式，因为它是<em>New表达式（NewExpression）</em>的一部分&nbsp; (function(){&nbsp; &nbsp; function bar(){}; // 声明，因为它是<em>函数体（FunctionBody）</em>的一部分&nbsp; })(); 还有一种不那么显而易见的函数表达式，就是被包含在一对圆括号中的函数—— (function foo(){})。将 这种形式看成表达式同样是因为上下文的关系：(和)构成一个分组操作符，而分组操作符只能包含表达式： 下面再多看几个例子吧： &nbsp; &nbsp; function foo(){}; // 函数声明&nbsp; (function foo(){}); // 函数表达式：注意它被包含在分组操作符中&nbsp; &nbsp; try {&nbsp; &nbsp; (var x = 5); // 分组操作符只能包含表达式，不能包含语句（这里的var就是语句）&nbsp; } catch(err) {&nbsp; &nbsp; // SyntaxError（因为“var x = 5”是一个语句，而不是表达式——对表达式求值必须返回值，但对语句求值则未必返回值。——译者注）&nbsp; } 不知道大家有没有印象，在使用 eval 对JSON求值的时候，JSON字符串通常是被包含在一对圆括号中的—— eval('(' + json + ')')。这样做的原因当然也不例外——分组操作符，也就是那对圆括号，会导致解析器强制将JSON的花括号当成表达 式而不代码块来解析： &nbsp; try {&nbsp; &nbsp; { &quot;x&quot;: 5 }; // {和}会被作为块来解析&nbsp; } catch(err) {&nbsp; &nbsp; // SyntaxError（“'x':5”只是构建对象字面量的语法，但该语法不能出现在外部的语句块中。——译者注）&nbsp; }&nbsp; &nbsp; ({ &quot;x&quot;: 5 }); // 分组操作符会导致解析器强制将{和}作为对象字面量来解析 声明和表达式的行为存在着十分微妙而又十分重要的差别。 首先，函数声明会在任何表达式被解析和求值之前先行被解析和求值。即使声明位于源代码中的最后一行，它也会先于同一作用域中位于最前面的表达式被求 值。还是看个例子更容易理解。在下面这个例子中，函数 fn 是在 alert 后面声明的。但是，在 alert 执行的时候，fn已经有定义了： &nbsp; alert(fn());&nbsp; function fn() {&nbsp; &nbsp; return 'Hello world!';&nbsp; } 函数声明还有另外一个重要的特点，即通过条件语句控制函数声明的行为并未标准化，因此不同环境下可能会得到不同的结果。有鉴于此，奉劝大家千万不要 在条件语句中使用函数声明，而要使用函数表达式。 &nbsp; // <strong>千万不要这样做！</strong>&nbsp; // 有的浏览器会把foo声明为返回first的那个函数&nbsp; // 而有的浏览器则会让foo返回second&nbsp; if (true) {&nbsp; &nbsp; function foo() {&nbsp; &nbsp; &nbsp; return 'first';&nbsp; &nbsp; }&nbsp; }&nbsp; else {&nbsp; &nbsp; function foo() {&nbsp; &nbsp; &nbsp; return 'second';&nbsp; &nbsp; }&nbsp; }&nbsp; foo();&nbsp; // 记住，这种情况下要使用函数表达式：&nbsp; var foo;&nbsp; if (true) {&nbsp; &nbsp; foo = function() {&nbsp; &nbsp; &nbsp; return 'first';&nbsp; &nbsp; };&nbsp; }&nbsp; else {&nbsp; &nbsp; foo = function() {&nbsp; &nbsp; &nbsp; return 'second';&nbsp; &nbsp; };&nbsp; }&nbsp; foo(); 想知道使用函数声明的实际规则到底是什么？继续往下看吧。嗯，有人不想知道？那请跳过下面这段摘录的文字。  <em>FunctionDeclaration（函数声明）</em>只能出现在<em>Program（程序）</em>或<em>FunctionBody（函 数体）</em>内。从句法上讲，它们 <strong>不能出现在<em>Block（块）</em></strong>（{ ... }） 中，例如不能出现在 if、while 或 for 语句中。因为 <em>Block（块）</em> 中只能包含<em>Statement（语句）</em>， 而不能包含<em>FunctionDeclaration（函数声明）</em>这样的<em>SourceElement（源 元素）</em>。另一方面，仔细看一看产生规则也会发现，唯一可能让<em>Expression（表达式）</em>出现在<em>Block（块）</em>中 情形，就是让它作为<em>ExpressionStatement（表达式语句）</em>的一部分。但是，规范明确规定了<em>ExpressionStatement（表 达式语句）</em><strong>不能以关键字function开头</strong>。而这实际上就是说，<em>FunctionExpression（函 数表达式）</em>同样也不能出现在<em>Statement（语句）</em>或<em>Block（块）</em>中（别忘了<em>Block（块）</em>就 是由<em>Statement（语句）</em>构成的）。  由于存在上述限制，只要函数出现在块中（像上面例子中那样），实际上就应该将其<strong>看作一个语法错误</strong>，而不是什么 函数声明或表达式。但问题是，我还没见过哪个实现是按照上述规则来解析这些函数的；好像每个实现都有自己的一套。   有必要提醒大家一点，根据规范的描述，实现可以引入<strong>语法扩展</strong>（见第16部分），只不过任何情况下都不能违反规 定。而目前的诸多客户端也正是照此办理的。其中有一些会把块中的函数声明当作一般的函数声明来解析——把它们提升到封闭作用域的顶部；另一些则引入了不同 的语义并采用了稍复杂一些的规则。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_95_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Tue,8 Mar 2011 08:17:22 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_95_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[Gravatar是什么？全球通用头像简单介绍与使用教程]]></title>
		<link>http://www.open-lib.com/Forum/Read_31_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2010-08-17 14:36:59&nbsp;&nbsp;点击：<b>174</b>&nbsp;&nbsp;回复：<b>5</b>
		<p><strong>Gravatar是什么？</strong> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Gravatar的概念首先是在国外的独立WordPress博客中兴起的，当你到任何一个支持Gravatar的网站留言时，这个网站都就会根据你所提供的Email地址为你显示出匹配的头像。当然，这个头像，是需要你事先到Gravatar的网站注册并上传的，否则，在这个网站上，就只会显示成一个默认的头像。像WordPress等，现在均已支持Gravatar服务了，你可以通过你的个性头像打造起你的个人品牌了！并且这个Gravatar没有什么约束，想换头像换马甲？很简单，改改留言的名字和email地址就可以了。另外注册与使用Gravatar均是完全免费的。 <strong>注册获得 Gravatar 头像的步骤</strong>：  1、登陆 gravatar.com，猛击注册 2、填写注册邮箱，用你真实有效的邮箱 3、登陆邮箱，点击激活链接 4、在 gravatar.com 页面猛击添加头像 5、这里提示由上到下依次是，选择你电脑上的图、在线网络图片、用摄像头现拍以及选择之前上传的图 6、上传一个图像，然后按需裁切然后保存 7、这里提示给你的头像设定级别意思分别是G / 普通PG / 粗鲁R / 色情X / 限制级建议选 G 即可，一般网站默认支持 G。  以后到任何一个支持 Gravatar 的网站留言, 输入登记的电子邮件, 就有自己的头像显示了! 再给一个很有意思的网站...可以创建头像... http://www.faceyourmanga.com/faceyourmanga_eng.html</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_31_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,28 Feb 2011 06:44:54 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_31_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[HTML5之表单详解]]></title>
		<link>http://www.open-lib.com/Forum/Read_89_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2011-02-22 09:40:13&nbsp;&nbsp;点击：<b>95</b>&nbsp;&nbsp;回复：<b>0</b>
		<p>请在新版标准浏览器(Chrome/Opera/Firefox/Safari…)中浏览本文中的样例,否则你看到的只是一个个空白的表单!   时光车轮滚滚碾来,前端之路永无止歇.对于这个前端这门精一多专的技术,任何一次技术革新,我们都必须第一时间去了解它学习它,比如Web世界里这簇美艳的花朵—HTML5.虽然HTML5发布之初,许多人(包括我)都觉得普及它还很遥远,但自发布以来,许多企业级网站对它的尝试应用(比如&lt;!doctype html&gt;应用,比如canvas的应用),使HTML5的迈出了一大步,随之而来IE9的发布,无疑又让我们看到了HTML5离我们不再遥远.学习HTML5半年有余了,虽然对它的离线存储以及canvas等革新性技术还是一知半解,但我还是希望我现在所学到的能帮助更多的前端人学习这门毋庸置疑是新趋势的技术.本文我将详细介绍一下HTML5中对表单功能的更新.<strong>阅读本文前建议在Opera最新版中打开样例演示页</strong>查看样例演示 &nbsp;<strong>一、表单结构更自由</strong>XHTML中需要放在form之中的诸如inpu/button/select/textarea等标签元素,在HTML5中完全可以放在页面任何位置,然后通过新增的form属性指向元素所属表单的ID值,即可关联起来.比如: &lt;FORM id=iform&gt; &lt;INPUT&gt; ... &lt;/FORM&gt; &lt;INPUT value=我在id为iform的表单外 form=&quot;foo&quot;&gt; &nbsp;<strong>二、多样的输入类型(大部分新类型目前并不为所有标准浏览器支持,请参见</strong><strong>样例演示</strong><strong>中的提示)email输入类型</strong> &lt;INPUT type=email name=email&gt; 此类型要求输入格式正确的email地址,否则浏览器是不允许提交的,并会有一个错误信息提示.此类型在Opera中必须指定name值,否则无效果.<strong>url输入类型</strong> &lt;INPUT type=url&gt; &nbsp;上面代码展示的文本域要求输入格式正确的URL地址,Opera中会自动在开始处添加http://.<strong>日期时间相关输入类型(这些个很牛X的)</strong> &lt;INPUT type=date&gt; &lt;INPUT type=time&gt; &lt;INPUT type=month&gt; &lt;INPUT type=week&gt; &nbsp;这一系列是很酷的一个类型,完全解决了烦琐的JS日历控件问题.但目前MS只有Opera/Chrome新版本支持,且展示效果也不一样.<strong>number输入类型(这些个很牛X的)</strong> &lt;INPUT type=number&gt; &nbsp;这个不用多解释了,要求输入一个数字字符,若未输入则会抛出一个错误.<strong>range输入类型</strong> &lt;INPUT type=range&gt; &nbsp; 此类型将显示一个可拖动的滑块条,并可通过设定max/min/step值限定拖动范围.拖动时会反馈给value一个值.<strong>search输入类型</strong> &lt;INPUT type=search&gt; &nbsp;此类型表示输入的将是一个搜索关键字,通过results=s可显示一个搜索小图标.<strong>tel输入类型</strong> &lt;INPUT type=tel&gt; &nbsp;此类型要求输入一个电话号码,但实际上它并没有特殊的验证,与text类型没什么区别.<strong>color输入类型</strong> &lt;INPUT type=color&gt; &nbsp;此类型表单,可让用户通过颜色选择器选择一个颜色值,并反馈到value中.<strong>三、新增的表单属性</strong><strong>placeholder属性</strong> &lt;INPUT placeholder=&quot;点击我会以清除&quot;&gt; &nbsp;这是一个很实用的属性,免去了用JS去实现点击清除表单初始值.浏览器支持也还不错,MS除了Firefox,其他标准浏览器都能很好的支持.<strong>require/pattern属性</strong> &lt;INPUT name=require required&gt; &lt;INPUT name=require1 required=&quot;required&quot;&gt; &lt;INPUT name=require2 pattern=&quot;^[1-9]d{5}$&quot;&gt; &nbsp;表单验证属性,require类型时,若输入值为空,则拒绝提交,并会有一个提示.上面两种写法都对,这个很有用.并且可以用于textarea以及hidden/image/submit类型.pattern类型为正则验证,可以完成各种复杂的验证.这两种类型在Opera中必须指定name值,否则无效果.<strong>autofocus属性</strong> &lt;INPUT autofocus=&quot;true&quot;&gt; &nbsp;默认聚焦属性,可在页面加载时聚焦到一个表单控件,类似于JS的focus().<strong>list属性</strong> &lt;INPUT list=&quot;ilist&quot;&gt; &lt;DATALIST id=ilist&gt; &lt;OPTION value=&quot;a&quot; label=&quot;a&quot;&gt; &lt;OPTION value=&quot;b&quot; label=&quot;b&quot;&gt; &lt;OPTION value=&quot;c&quot; label=&quot;c&quot;&gt; &lt;/DATALIST&gt; &nbsp;该属性需要与datalist属性共用,datalist是对选择框的记忆,而list属性可以为选择框自定义记忆的内容.<strong>max/min/step属性</strong> &lt;INPUT type=range step=&quot;20&quot; min=&quot;1&quot; max=&quot;100&quot;&gt; &nbsp;限制值的输入范围,以及值的输入渐进程度,比如可在number设定输入最大值最小值,或者在range中设定拖动阶梯.<strong>autocomplete属性</strong> &lt;INPUT autocomplete=&quot;on&quot;&gt; &nbsp;此属性是为表单提供自动完成功能.如果该属性为打开状态可很好地自动完成.一般来说,此属性必须启动浏览器的自动完成功能. <strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>转自：http://mrthink.net/html5-newfeatures-form/</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_89_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Tue,22 Feb 2011 01:30:09 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_89_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[多么好的插件，发上去就打不开。而且还是最新发布的……]]></title>
		<link>http://www.open-lib.com/Forum/Read_88_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>dztceo</b></span>&nbsp;&nbsp;发表于 2011-02-14 10:02:23&nbsp;&nbsp;点击：<b>128</b>&nbsp;&nbsp;回复：<b>1</b>
		<p>http://www.open-lib.com/Lib/1323.jsp 无话，看标题。这是插件的页面。</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_88_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Mon,14 Feb 2011 03:22:27 GMT</pubDate>
		<author>dztceo</author> 
		<link>http://www.open-lib.com/Forum/Read_88_1.action</link>
		<category><![CDATA[技术开发交流]]></category> 
	    </item>
	
	    <item>
		<title><![CDATA[对html与body的一些研究与理解]]></title>
		<link>http://www.open-lib.com/Forum/Read_76_1.action</link>
		<description><![CDATA[
		<span style="color:red"><b>路路</b></span>&nbsp;&nbsp;发表于 2010-11-30 11:02:40&nbsp;&nbsp;点击：<b>244</b>&nbsp;&nbsp;回复：<b>2</b>
		<p><strong>一、写在前面的</strong>最近一直构思着写篇关于html标签的文章，虽说之前处理过html标签，也解决过不少棘手的问题，但是对其理解还不是很透彻，很多原理都是自己推测的。在网上查阅相关资料想整合一下相关的信息，发现深入探讨html，与body的文章很少，只有在蓝色理想看到一篇“一叶千鸟”的这篇“正确认识html与body”有点价值，其余都没有什么相关的好文章。而这里，我要讲述的与上面的交集并不多，只要是讲述一些关于html与body的各种表现，以及我自己对这些表现的合理的解释和并提供一些过去处理类似问题的经验，希望对大家能够有所帮助。 <strong>二、关于html与body的一些表现</strong><strong>1.背景色</strong>一般情况下，我们css控制的最高结点就是body，例如设置：body{background:#069;}则浏览器界面就是完全的#068的背景色。这里看上去是body标签下的背景色起作用了，我到不这么认为，这里不是body的background起作用，而是body作为一个根结点起作用了，html标签未被激活，body但当类似于根结点的结点，其background背景色被浏览器俘获，浏览器界面背景色为background的背景色，以上是我的推论，这种推论不是我凭空想象出来的，而是有一定的根据的。看下面的一段css代码：  body{background:#069; margin:100px; border:30px solid #093;}  意思很简明：外边距100像素，边框30像素，背景色#069，按照对一般标签的理解，100像素的外边距应该不含有背景色的，然而显示的结果是（Firefox下表现与此类似）：   IE6下body设置background颜色边框和边距后的表现  还有一点可以证明我上面的推论，就是一旦设置了html节点的background背景色之后，body的背景色将失效。例如下面的简短代码：  html{background:#999;} body{background:#069; margin:100px; border:30px solid #093;}  跟上面的想比，就是添加了html的背景色，结果（截自IE6，Firefox浏览器下表现一致）：   html标签设置背景色后的样式表现  结果是什么呢？body标签的满屏的背景色不见了，“失效”了。其实，在我看来，不是“失效”，是生效了。当html标签无背景样式时，body的背景色其实不是body标签的背景色，而是浏览器的。一旦html标签含有背景色，则body的背景色变成了正常的body标签（一个实实在在，普普通通标签）的背景色，而此时的html标签最顶级，背景色被浏览器获取，成为浏览器的背景色。 <strong>2.margin支持</strong>从上面的实例可以看出，无论是IE6浏览器，还是Firefox浏览器，body的margin属性是支持的，padding也是如此，那么对于html标签呢。如下测试代码：  html{background:#999;margin:100px; border:30px solid #093;} body{background:#069; margin:100px; border:30px solid #093;}  html标签也增加了margin间距和30像素的边框，结果如下：IE6下：   IE6浏览器下html对margin不敏感不支持  Firefox浏览器下：   Firefox浏览器下html标签支持margin外边距  这是缩放到500像素宽的图片，仔细看还是会发现IE6下margin没有起作用，顶边的是30像素的边框，Firefox下margin起作用了，可以看到30像素的边框外部还有一段间距。此图html标签背景色的全屏显示也进一步证明了我上面有关背景色显示原理的推论。 <strong>3.关于滚动条</strong>打开一个空白页面，观察浏览器右侧，会发现IE浏览器会有一段滚动条的槽道，而Firefox浏览器下没有。   空白页面下IE和Firefox火狐浏览器左侧的滚动条与否  Firefox下没有滚动条，有时候会产生体验上的一些问题，比如：假设一个页面高度有限，无滚动条，当鼠标移到一个元素上，要显示一个浮动层，但是这个浮动层有一定的高度，加上鼠标位置偏低，一旦浮动层出现，说不定页面的高度被撑高并出现滚动条，这是在Firefox浏览器下就会产生页面的晃动，原因是滚动条的出现导致页面的宽度减小，布局发生一些偏移，而这种便宜造成的体验是不好的。如何避免呢？很多人会想到设置body{overflow-y:scroll;}Firefox下是出现了滚动槽了，但是IE下出现了两个滚动条，如下：可能有人会想到hack，no，no，no，其实仔细想一想，问题很简单。为什么IE会产生双固定条，里面那一个肯定是body的，那么外面的那一个呢？啊，或许您想到了，html标签的，就是说默认状态下，IE6下html有个overflow:scroll;属性，证明很简单，您设置html标签overflow:hidden;看滚动条是否没有了（我这里证明是没有了）。所以呢，只要在css中些写上：  html{overflow-y:scroll;}  就可以让IE和Firefox（包括chrome）浏览器默认产生滚动条的滚动槽了。 <strong>4.关于background的fixed固定定位</strong>Firefox是支持background:fixed;定位的，IE6只能说是半支持，好吧，这么说吧，可能不太严谨，就是背景图片固定的效果似乎只在根结点起作用。举个很简单的例子：先看这段css代码：  body{background:url(../image/404.png) no-repeat fixed center center;} div{height:2000px;}  HTML部分为： &lt;body&gt;&lt;div&gt;&lt;/div&gt;&lt;/body&gt; 其结果是无论IE6还是火狐浏览器下，背景图片都是固定的死死的，不错。但是，一旦html标签带着background属性参合进来，事情就要发生转变了。问题代码：  html{background:white;} body{background:url(../image/404.png) no-repeat fixed center center;} div{height:2000px;}  结果IE6下，背景不固定了，只看到背景图片随着滚动条上下移动而移动。演示页面 要解决这个问题呢，也是有办法的，就是将fixed属性转移到html标签上就可以了。即：  html{background:white url(../image/404.png) no-repeat fixed center center;} div{height:2000px;}  就可以了。 <strong>5.关于height:100%;</strong>要想高度百分比起作用，一般来说，要满足两个条件：其一，父标签有高度可寻，就是向上遍历父标签要找到一个定值高度（body，html另外讨论），如果中途有个height为auto或是没有设置height属性，则高度百分比不起作用；其二，标签本身的属性，如果inline属性的标签，如果没有浮动，zoom，或是绝对定位之类属性是不支持百分比高度的，block或inline-block属性可以说是高度百分比起作用的前提条件之一吧。而这里要讲的是关于body和html的高度百分比显示的。默认状态下，body不是高度100%显示的，不要看body定义background属性好像body就是满屏显示的，正如上面所推断的，此背景已非body之背景。用这个body{background:#039; border:50px solid #C00;}一测便知。看边框范围是否高度100%显示，答案是否定的。见下图（截自IE6，Firefox浏览器下表现一致）：   body默认高度是不100%显示的  那么body是否支持height:100%;呢？经过我的测试，IE6支持，Firefox浏览器不支持。要想让Firefox浏览器也支持body的height:100%;是简单的，就是设置html标签height:100%;一旦设置了height:100%;则无论哪个浏览器下body都支持height:100%;了，而body内部的容器也可以支持height:100%;了。前段时间看到百度的一道面试题，说什么透明层无论滚动与否都满屏显示，其实就是对html和body标签做一番手脚，两者高度100%显示，同时溢出隐藏（overflow:hidden），然后用一个div高度100%系显示，溢出滚动。而这个透明层就使用绝对定位且与这个div平级，高宽100%显示，就可以使得无论怎么滚动这个透明覆盖层都是满屏显示的。这其实也就解决IE6下浮动层固定定位的经典方法。 <strong>6.关于html，body的css hack</strong>不知不觉讲了不少了，这就算最后一条吧。我见过的有关html和body标签的hack有这么几个，一个是* html body，一个是*+html 还有个是html &gt; body，以及body:nth-of-type(1)。前者是经典的IE6 css hack，在当前主流浏览器中，就IE6支持，其含义是指在html标签外还有一个隐藏的幽灵标签，我也不知道什么东西，反正IE6认得它就行了。*+html据说只有IE7认得它。html &gt; body也据说就IE7认识它，而body:nth-of-type(1)是针对chrome浏览器的hack，意思是说某某标签的第一个元素，因为一个页面就只有一个body标签，所以这个肯定会成立的，所以body:nth-of-type(1) div{height:1px;}这个hack就会起作用了。 <strong>三、最后的结语</strong>技术无止境，css这东西真是很博大精深，即使我键盘敲了不知多少个小时，还是有些话没有说完。要是再结合JavaScript，demo展开说的话，可能要通宵才能说完。这里就先讲这些，点到为止。关于html和body这两个标签里面蕴含的知识是很多的，我这里全当抛砖引玉，更多的内容还需要您去研究去探索。 原创文章，转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]本文地址：http://www.zhangxinxu.com/wordpress/?p=259</p>
		<br>
		<a href="http://www.open-lib.com/Forum/Read_76_1.action#quickReply">回复</a>
		]]></description>
		<pubDate>Sat,12 Feb 2011 01:14:35 GMT</pubDate>
		<author>路路</author> 
		<link>http://www.open-lib.com/Forum/Read_76_1.action</link>
		<category><![CDATA[前端技术]]></category> 
	    </item>
	
  </channel>
</rss>

