<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>檬檬前端行</title>
	<atom:link href="http://www.frontendcodes.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.frontendcodes.com</link>
	<description>路漫漫其修远兮</description>
	<lastBuildDate>Fri, 02 Mar 2012 06:28:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>阻止designmode为on的iframe中图片被resize</title>
		<link>http://www.frontendcodes.com/?p=185</link>
		<comments>http://www.frontendcodes.com/?p=185#comments</comments>
		<pubDate>Fri, 02 Mar 2012 06:28:43 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[非技术]]></category>
		<category><![CDATA[disable]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[resize]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=185</guid>
		<description><![CDATA[我有个编辑器，用iframe做的，这个iframe的designmode为on，但是我不希望图片被改变大小。 对于webkit浏览器，图片本身就无法被改变大小，所以，不用解决 firefox，有个特殊的command&#8212;-enableObjectResizing，于是 if(H.browser.getBrowser()==”ff”){ _.iDoc.execCommand(&#8216;enableObjectResizing&#8217;, false, &#8216;false&#8217;); } 对于IE，就比较复杂，IE有一个onresizestart事件，可以通过 img.onresizestart=function(){ return false; } 来解决，但是这个有个问题，就是图片依然可以被选中。看着那几个方块，那叫一个难受。想了很久，想到个办法，就是禁止图片被选中不就好了， OK &#160; img.onmousedown=function(){ window.event.returnValue=false; return false; } &#160; 于是，完美解决！]]></description>
			<content:encoded><![CDATA[<p>我有个编辑器，用iframe做的，这个iframe的designmode为on，但是我不希望图片被改变大小。</p>
<p>对于webkit浏览器，图片本身就无法被改变大小，所以，不用解决</p>
<p>firefox，有个特殊的command&#8212;-enableObjectResizing，于是</p>
<p>if(H.browser.getBrowser()==”ff”){<br />
_.iDoc.execCommand(&#8216;enableObjectResizing&#8217;, false, &#8216;false&#8217;);<br />
}</p>
<p>对于IE，就比较复杂，IE有一个onresizestart事件，可以通过</p>
<p>img.onresizestart=function(){</p>
<p>return false;</p>
<p>}</p>
<p>来解决，但是这个有个问题，就是图片依然可以被选中。看着那几个方块，那叫一个难受。想了很久，想到个办法，就是禁止图片被选中不就好了，</p>
<p>OK</p>
<p>&nbsp;</p>
<p>img.onmousedown=function(){</p>
<p>window.event.returnValue=false;</p>
<p>return false;</p>
<p>}</p>
<p>&nbsp;</p>
<p>于是，完美解决！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=185</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>绝对定位子元素，是否决定父元素的scrollWidth?</title>
		<link>http://www.frontendcodes.com/?p=181</link>
		<comments>http://www.frontendcodes.com/?p=181#comments</comments>
		<pubDate>Wed, 29 Feb 2012 05:19:03 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[非技术]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=181</guid>
		<description><![CDATA[今天遇到一个问题，发现浏览器，解释不一致。于是讲测试结果记录下来 &#60;div style=”width:30px; height:30px; position:relative” id=”outer”&#62; &#60;div style=”position:absolute; width:30px; height:30px; left:20px; top:20px;”&#62;&#60;/div&#62; &#60;/div&#62; &#60;script&#62; console.log(document.getElementById(“outer”).scrollWidth); &#60;/script&#62; &#160; chrome 16.0    结果是50 firefox 10.0     结果30 IE 9.0                结果50 IE 8.0                结果50 IE 7.0               [...]]]></description>
			<content:encoded><![CDATA[<p>今天遇到一个问题，发现浏览器，解释不一致。于是讲测试结果记录下来</p>
<p>&lt;div style=”width:30px; height:30px; position:relative” id=”outer”&gt;</p>
<p>&lt;div style=”position:absolute; width:30px; height:30px; left:20px; top:20px;”&gt;&lt;/div&gt;</p>
<p>&lt;/div&gt;</p>
<p>&lt;script&gt;</p>
<p>console.log(document.getElementById(“outer”).scrollWidth);</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>chrome 16.0    结果是50</p>
<p>firefox 10.0     结果30</p>
<p>IE 9.0                结果50</p>
<p>IE 8.0                结果50</p>
<p>IE 7.0               结果30</p>
<p>IE 6.0              结果30</p>
<p>&nbsp;</p>
<p>神奇的世界！</p>
<p>&nbsp;</p>
<p>如果outer加一个overflow:hidden</p>
<p>&nbsp;</p>
<p>则各浏览器，都为50</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=181</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>常用的easing算法</title>
		<link>http://www.frontendcodes.com/?p=179</link>
		<comments>http://www.frontendcodes.com/?p=179#comments</comments>
		<pubDate>Tue, 28 Feb 2012 09:56:03 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[非技术]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=179</guid>
		<description><![CDATA[var obj = { Linear: function(t,b,c,d){ return c*t/d + b; },    //线性 Quad: {                                                                                //二次方缓动 easeIn: function(t,b,c,d){ return c*(t/=d)*t + b; }, easeOut: function(t,b,c,d){ return -c *(t/=d)*(t-2) + b; }, easeInOut: function(t,b,c,d){ if ((t/=d/2) &#60; 1) return c/2*t*t + b; return -c/2 * ((&#8211;t)*(t-2) - 1) + b; [...]]]></description>
			<content:encoded><![CDATA[<p>var obj = {<br />
Linear: function(t,b,c,d){ return c*t/d + b; },    //线性<br />
Quad: {                                                                                //二次方缓动<br />
easeIn: function(t,b,c,d){<br />
return c*(t/=d)*t + b;<br />
},<br />
easeOut: function(t,b,c,d){<br />
return -c *(t/=d)*(t-2) + b;<br />
},<br />
easeInOut: function(t,b,c,d){<br />
if ((t/=d/2) &lt; 1) return c/2*t*t + b;<br />
return -c/2 * ((&#8211;t)*(t-2) - 1) + b;<br />
}<br />
},<br />
Cubic: {                                                                   //三次方缓动<br />
easeIn: function(t,b,c,d){<br />
return c*(t/=d)*t*t + b;<br />
},<br />
easeOut: function(t,b,c,d){<br />
return c*((t=t/d-1)*t*t + 1) + b;<br />
},<br />
easeInOut: function(t,b,c,d){<br />
if ((t/=d/2) &lt; 1) return c/2*t*t*t + b;<br />
return c/2*((t-=2)*t*t + 2) + b;<br />
}<br />
},<br />
Quart: {                                                                    //四次方的缓动<br />
easeIn: function(t,b,c,d){<br />
return c*(t/=d)*t*t*t + b;<br />
},<br />
easeOut: function(t,b,c,d){<br />
return -c * ((t=t/d-1)*t*t*t - 1) + b;<br />
},<br />
easeInOut: function(t,b,c,d){<br />
if ((t/=d/2) &lt; 1) return c/2*t*t*t*t + b;<br />
return -c/2 * ((t-=2)*t*t*t - 2) + b;<br />
}<br />
},<br />
Quint: {                                                              //五次方的缓动<br />
easeIn: function(t,b,c,d){<br />
return c*(t/=d)*t*t*t*t + b;<br />
},<br />
easeOut: function(t,b,c,d){<br />
return c*((t=t/d-1)*t*t*t*t + 1) + b;<br />
},<br />
easeInOut: function(t,b,c,d){<br />
if ((t/=d/2) &lt; 1) return c/2*t*t*t*t*t + b;<br />
return c/2*((t-=2)*t*t*t*t + 2) + b;<br />
}<br />
},<br />
Sine: {                                                                                       //正弦缓动<br />
easeIn: function(t,b,c,d){<br />
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;<br />
},<br />
easeOut: function(t,b,c,d){<br />
return c * Math.sin(t/d * (Math.PI/2)) + b;<br />
},<br />
easeInOut: function(t,b,c,d){<br />
return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;<br />
}<br />
},<br />
Expo: {                                                                                          //指数曲线缓动<br />
easeIn: function(t,b,c,d){<br />
return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;<br />
},<br />
easeOut: function(t,b,c,d){<br />
return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;<br />
},<br />
easeInOut: function(t,b,c,d){<br />
if (t==0) return b;<br />
if (t==d) return b+c;<br />
if ((t/=d/2) &lt; 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;<br />
return c/2 * (-Math.pow(2, -10 * &#8211;t) + 2) + b;<br />
}<br />
},<br />
Circ: {                                                                                          //圆周曲线缓动<br />
easeIn: function(t,b,c,d){<br />
return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;<br />
},<br />
easeOut: function(t,b,c,d){<br />
return c * Math.sqrt(1 - (t=t/d-1)*t) + b;<br />
},<br />
easeInOut: function(t,b,c,d){<br />
if ((t/=d/2) &lt; 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;<br />
return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;<br />
}<br />
},<br />
Elastic: {                                                                                                  //舒缓的溢出缓动<br />
easeIn: function(t,b,c,d,a,p){<br />
if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;<br />
if (!a || a &lt; Math.abs(c)) { a=c; var s=p/4; }<br />
else var s = p/(2*Math.PI) * Math.asin (c/a);<br />
return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;<br />
},<br />
easeOut: function(t,b,c,d,a,p){<br />
if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;<br />
if (!a || a &lt; Math.abs(c)) { a=c; var s=p/4; }<br />
else var s = p/(2*Math.PI) * Math.asin (c/a);<br />
return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b);<br />
},<br />
easeInOut: function(t,b,c,d,a,p){<br />
if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);<br />
if (!a || a &lt; Math.abs(c)) { a=c; var s=p/4; }<br />
else var s = p/(2*Math.PI) * Math.asin (c/a);<br />
if (t &lt; 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;<br />
return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;<br />
}<br />
},<br />
Back: {                                                                    //激烈的溢出缓动<br />
easeIn: function(t,b,c,d,s){<br />
if (s == undefined) s = 1.70158;<br />
return c*(t/=d)*t*((s+1)*t - s) + b;<br />
},<br />
easeOut: function(t,b,c,d,s){<br />
if (s == undefined) s = 1.70158;<br />
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;<br />
},<br />
easeInOut: function(t,b,c,d,s){<br />
if (s == undefined) s = 1.70158;<br />
if ((t/=d/2) &lt; 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;<br />
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;<br />
}<br />
},<br />
Bounce: {                                                                                         //起步阻力<br />
easeIn: function(t,b,c,d){<br />
return c - Tween.Bounce.easeOut(d-t, 0, c, d) + b;<br />
},<br />
easeOut: function(t,b,c,d){<br />
if ((t/=d) &lt; (1/2.75)) {<br />
return c*(7.5625*t*t) + b;<br />
} else if (t &lt; (2/2.75)) {<br />
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;<br />
} else if (t &lt; (2.5/2.75)) {<br />
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;<br />
} else {<br />
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;<br />
}<br />
},<br />
easeInOut: function(t,b,c,d){<br />
if (t &lt; d/2) return Tween.Bounce.easeIn(t*2, 0, c, d) * .5 + b;<br />
else return Tween.Bounce.easeOut(t*2-d, 0, c, d) * .5 + c*.5 + b;<br />
}<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=179</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>和蝈蝈龙的跨域讨论</title>
		<link>http://www.frontendcodes.com/?p=176</link>
		<comments>http://www.frontendcodes.com/?p=176#comments</comments>
		<pubDate>Tue, 14 Feb 2012 14:30:17 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[非技术]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=176</guid>
		<description><![CDATA[蝈蝈笼和我讨论ajax跨域问题，首先是关于用document.domain做子域名的跨域 通过www.a.com向abc.a.com发送请求，然后神奇的事发生了，在firebug中，提示该次请求状态是200，但是实际上，status是0，这好像是firebug的一个bug吧。 发现设置document.domain=”a.com”，需要一个iframe作为代理来发送ajax，大不爽！选其他的。 蝈总作为一名PHP人士，喜欢JSONP，最后解决了问题，但是我更喜欢用flash做代理。 JSONP的优点：原生JS， 缺点，需要服务器端写特别的接口 FLASH的优点：一次设置，所以的连接都有用  缺点：需要一个控件，虽然基本每个浏览器都有 好吧，热烈的讨论持续了很久，最后我败了。。]]></description>
			<content:encoded><![CDATA[<p>蝈蝈笼和我讨论ajax跨域问题，首先是关于用document.domain做子域名的跨域</p>
<p>通过www.a.com向abc.a.com发送请求，然后神奇的事发生了，在firebug中，提示该次请求状态是200，但是实际上，status是0，这好像是firebug的一个bug吧。</p>
<p>发现设置document.domain=”a.com”，需要一个iframe作为代理来发送ajax，大不爽！选其他的。</p>
<p>蝈总作为一名PHP人士，喜欢JSONP，最后解决了问题，但是我更喜欢用flash做代理。</p>
<p>JSONP的优点：原生JS， 缺点，需要服务器端写特别的接口</p>
<p>FLASH的优点：一次设置，所以的连接都有用  缺点：需要一个控件，虽然基本每个浏览器都有</p>
<p>好吧，热烈的讨论持续了很久，最后我败了。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=176</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在AJAX中容易忽略的问题</title>
		<link>http://www.frontendcodes.com/?p=174</link>
		<comments>http://www.frontendcodes.com/?p=174#comments</comments>
		<pubDate>Tue, 14 Feb 2012 14:22:41 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[非技术]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=174</guid>
		<description><![CDATA[1.替换掉textarea中的换行 2.每次提交，都要encodeURIComponent]]></description>
			<content:encoded><![CDATA[<p>1.替换掉textarea中的换行</p>
<p>2.每次提交，都要encodeURIComponent</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=174</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>chrome拖拽时的cursor问题。</title>
		<link>http://www.frontendcodes.com/?p=167</link>
		<comments>http://www.frontendcodes.com/?p=167#comments</comments>
		<pubDate>Sat, 08 Oct 2011 03:22:54 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[鼠标样式]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=167</guid>
		<description><![CDATA[在chrome中拖拽元素，鼠标会变为文本的样子，设置css的cursor无济于事。 解决方案是： ele.onselectstart=function(e){ e.preventDefault(); e.stopPropagation(); }]]></description>
			<content:encoded><![CDATA[<p>在chrome中拖拽元素，鼠标会变为文本的样子，设置css的cursor无济于事。</p>
<p>解决方案是：</p>
<p>ele.onselectstart=function(e){</p>
<p>e.preventDefault();</p>
<p>e.stopPropagation();</p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=167</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>常用JS函数(4)</title>
		<link>http://www.frontendcodes.com/?p=158</link>
		<comments>http://www.frontendcodes.com/?p=158#comments</comments>
		<pubDate>Fri, 01 Jul 2011 09:16:49 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=158</guid>
		<description><![CDATA[H.event.cancle = function(event) { if (event &#38;&#38; event.stopPropagation) { event.stopPropagation(); } else { window.event.cancleBubble = true; } return false; } H.event.stop = function(event) { if (event &#38;&#38; event.preventDefault) { event.preventDefault(); } else { window.event.returnValue = false; } } H.range.save=function(){ if (window.getSelection) { var sel = window.getSelection(); if (sel.getRangeAt &#38;&#38; sel.rangeCount) { return sel.getRangeAt(0); } } [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">H.event.cancle = function(event) {</div>
<div id="_mcePaste">if (event &amp;&amp; event.stopPropagation) {</div>
<div id="_mcePaste">event.stopPropagation();</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">else {</div>
<div id="_mcePaste">window.event.cancleBubble = true;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">return false;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">H.event.stop = function(event) {</div>
<div id="_mcePaste">if (event &amp;&amp; event.preventDefault) {</div>
<div id="_mcePaste">event.preventDefault();</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">else {</div>
<div id="_mcePaste">window.event.returnValue = false;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div>
<div>H.range.save=function(){</div>
<div>if (window.getSelection) {</div>
<div>var sel = window.getSelection();</div>
<div>if (sel.getRangeAt &amp;&amp; sel.rangeCount) {</div>
<div>return sel.getRangeAt(0);</div>
<div>}</div>
<div>} else if (document.selection &amp;&amp; document.selection.createRange) {</div>
<div>return document.selection.createRange();</div>
<div>}</div>
<div>return null;</div>
<div>}</div>
<div>H.range.restore =function(range){</div>
<div>if (range) {</div>
<div>if (window.getSelection) {</div>
<div>var sel = window.getSelection();</div>
<div>sel.removeAllRanges();</div>
<div>sel.addRange(range);</div>
<div>} else if (document.selection &amp;&amp; range.select) {</div>
<div>range.select();</div>
<div>}</div>
<div>}</div>
<div>}</div>
<div>H.range.clear =function(){</div>
<div>window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();</div>
<div>}</div>
<div>
<div>H.core.DOM.newElement=function(tag,property){</div>
<div>var s=document.createElement(tag);</div>
<div>for(var i in property){</div>
<div>s[i]=property[i];</div>
<div>}</div>
<div>return s;</div>
<div>}</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=158</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>你想不到的等式： []==![]</title>
		<link>http://www.frontendcodes.com/?p=146</link>
		<comments>http://www.frontendcodes.com/?p=146#comments</comments>
		<pubDate>Thu, 28 Apr 2011 02:00:59 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[神奇]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=146</guid>
		<description><![CDATA[第一眼看到这个标题，[]==![] ，估计想到的都是false吧。 但是alert([]==![]) ,会神奇的发现，它居然是true。这到底是怎么回事呢？ 首先，分解一下这个表达式。 []==![]  由以下几步完成判断。 1、求值![] 2、参考ECMAScript文档（以下简称文档）11.4.9  Logical NOT Operator ( ! ) ，!运算符首先对[]进行toBoolean([])操作，文档9.2中得知，如果参数是Object，则返回true。于是  ![] 最后 得值 false 3、表达式变为[]==false 4、参考文档11.9.3 The Abstract Equality Comparison Algorithm，根据规则，第七条 If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 由于我们的右边的是个布尔值，所以对false进行toNumber(false)操作，文档9.3 ToNumber中，可知如果是false，那么toNumber返回0 5、表达式变为[]==0 6、继续看文档11.9.3，我们来到了第九条：9. If Type(x) is Object and Type(y) is either String or Number,return [...]]]></description>
			<content:encoded><![CDATA[<p>第一眼看到这个标题，[]==![] ，估计想到的都是false吧。</p>
<p>但是alert([]==![]) ,会神奇的发现，它居然是true。这到底是怎么回事呢？</p>
<p>首先，分解一下这个表达式。</p>
<p>[]==![]  由以下几步完成判断。</p>
<p>1、求值![]</p>
<p>2、参考ECMAScript文档（以下简称文档）11.4.9  Logical NOT Operator ( ! ) ，!运算符首先对[]进行toBoolean([])操作，文档9.2中得知，如果参数是Object，则返回true。于是  ![] 最后 得值 false</p>
<p>3、表达式变为[]==false</p>
<p>4、参考文档11.9.3 The Abstract Equality Comparison Algorithm，根据规则，第七条 If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 由于我们的右边的是个布尔值，所以对false进行toNumber(false)操作，文档9.3 ToNumber中，可知如果是false，那么toNumber返回0</p>
<p>5、表达式变为[]==0</p>
<p>6、继续看文档11.9.3，我们来到了第九条：9. If Type(x) is Object and Type(y) is either String or Number,return the result of the comparison ToPrimitive(x) == y. 由于[]是个Object，而右侧是Number 0，所以，对左侧的[]执行toPrimitive操作，根据文档9.1的toPrimitive章节，一个object的toPrimitive操作返回值是它的[[DefaultValue]],根据文档8.12.8的第一条，由于[]存在toString方法，所以返回[].toString().</p>
<p>7、表达式变为”"==0</p>
<p>8、又一次来到文档11.9.3第五条：5. If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y，于是对”"进行toNumber操作，于是再一次来到文档9.3及9.3.1，得知，如果是空字符串，那么toNumber返回的是0</p>
<p>9、表达式变为0==0</p>
<p>10、返回true</p>
<p>神奇吧！~</p>
<p>参考文档：ECMAScript-262 Edition 5 ,地址 <a href="http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf">http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=146</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>零基础开始WebSocket(3)—-简单的聊天室程序</title>
		<link>http://www.frontendcodes.com/?p=142</link>
		<comments>http://www.frontendcodes.com/?p=142#comments</comments>
		<pubDate>Thu, 14 Apr 2011 07:28:57 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[WebSocket]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=142</guid>
		<description><![CDATA[客户端： &#60;!DOCTYPE html&#62; &#60;html&#62; &#60;head&#62; &#60;title&#62;&#60;/title&#62; &#60;style&#62; #win{ border:1px solid #ccc; padding:20px ; color:#333; line-height:2em; } .input{ padding:10px 0px; text-align:left;} .input input{ width:200px;} &#60;/style&#62; &#60;/head&#62; &#60;body&#62; &#60;div id=”win”&#62;&#60;/div&#62; &#60;div&#62;&#60;input id=”text”&#62;&#60;button id=”send”&#62;发送&#60;/button&#62;&#60;button id=”disconnect”&#62;断开连接&#60;/button&#62;&#60;/div&#62; &#60;script&#62; function log(d){ var logDiv=document.createElement(“div”); logDiv.innerHTML=d; document.getElementById(“win”).appendChild(logDiv); } //创建websocket连接 var socket=new WebSocket(“ws://localhost:12345/websocket/server.php”); //绑定连接成功事件 socket.onopen=function(){ log(“Socket ReadyState:”+socket.readyState); //socket.send(“hi”); }; //绑定接收到信息事件 socket.onmessage=function(e){ log(e.data); } //绑定关闭连接事件 [...]]]></description>
			<content:encoded><![CDATA[<p>客户端：</p>
<div id="_mcePaste">&lt;!DOCTYPE html&gt;</div>
<div id="_mcePaste">&lt;html&gt;</div>
<div id="_mcePaste">&lt;head&gt;</div>
<div id="_mcePaste">&lt;title&gt;&lt;/title&gt;</div>
<div id="_mcePaste">&lt;style&gt;</div>
<div id="_mcePaste">#win{ border:1px solid #ccc; padding:20px ; color:#333; line-height:2em; }</div>
<div id="_mcePaste">.input{ padding:10px 0px; text-align:left;}</div>
<div id="_mcePaste">.input input{ width:200px;}</div>
<div id="_mcePaste">&lt;/style&gt;</div>
<div id="_mcePaste">&lt;/head&gt;</div>
<div id="_mcePaste">&lt;body&gt;</div>
<div id="_mcePaste">&lt;div id=”win”&gt;&lt;/div&gt;</div>
<div id="_mcePaste">&lt;div&gt;&lt;input id=”text”&gt;&lt;button id=”send”&gt;发送&lt;/button&gt;&lt;button id=”disconnect”&gt;断开连接&lt;/button&gt;&lt;/div&gt;</div>
<div id="_mcePaste">&lt;script&gt;</div>
<div id="_mcePaste">function log(d){</div>
<div id="_mcePaste">var logDiv=document.createElement(“div”);</div>
<div id="_mcePaste">logDiv.innerHTML=d;</div>
<div id="_mcePaste">document.getElementById(“win”).appendChild(logDiv);</div>
<div id="_mcePaste">}</div>
<div>//创建websocket连接</div>
<div id="_mcePaste">var socket=new WebSocket(“ws://localhost:12345/websocket/server.php”);</div>
<div>//绑定连接成功事件</div>
<div id="_mcePaste">socket.onopen=function(){</div>
<div id="_mcePaste">log(“Socket ReadyState:”+socket.readyState);</div>
<div id="_mcePaste">//socket.send(“hi”);</div>
<div id="_mcePaste">};</div>
<div>//绑定接收到信息事件</div>
<div id="_mcePaste">socket.onmessage=function(e){</div>
<div id="_mcePaste">log(e.data);</div>
<div id="_mcePaste">}</div>
<div>//绑定关闭连接事件</div>
<div id="_mcePaste">socket.onclose=function(){</div>
<div id="_mcePaste">log(“close!”);</div>
<div id="_mcePaste">log(“Socket ReadyState:”+socket.readyState);</div>
<div id="_mcePaste">}</div>
<div>//发送信息至服务器</div>
<div id="_mcePaste">function send(){</div>
<div id="_mcePaste">var texts=document.getElementById(“text”).value;</div>
<div id="_mcePaste">socket.send(texts);</div>
<div id="_mcePaste">document.getElementById(“text”).value=”";</div>
<div id="_mcePaste">}</div>
<div>//绑定其他DOM事件</div>
<div id="_mcePaste">document.getElementById(“send”).onclick=send;</div>
<div id="_mcePaste">document.getElementById(“text”).onkeyup=function(e){</div>
<div id="_mcePaste">if(e.keyCode==13) send();</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">document.getElementById(“disconnect”).onclick=function(){</div>
<div id="_mcePaste">socket.close();</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">&lt;/script&gt;</div>
<div id="_mcePaste">&lt;/body&gt;</div>
<div id="_mcePaste">&lt;/html&gt;</div>
<p>服务器端server.php</p>
<p>&lt;?php</p>
<p>/*  &gt;php -q server.php  */</p>
<p>error_reporting(E_ALL);</p>
<p>set_time_limit(0);</p>
<p>ob_implicit_flush();</p>
<p>$master  = WebSocket(“localhost”,12345);</p>
<p>$sockets = array($master);</p>
<p>$users   = array();</p>
<p>$debug   = true;</p>
<p>while(true){</p>
<p>$changed = $sockets;</p>
<p>socket_select($changed,$write=NULL,$except=NULL,NULL);</p>
<p>foreach($changed as $socket){</p>
<p>if($socket==$master){</p>
<p>$client=socket_accept($master);</p>
<p>if($client&lt;0){ console(“socket_accept() failed”); continue; }</p>
<p>else{ connect($client); }</p>
<p>}</p>
<p>else{</p>
<p>$bytes = @socket_recv($socket,$buffer,2048,0);</p>
<p>if($bytes==0){ disconnect($socket); }</p>
<p>else{</p>
<p>$user = getuserbysocket($socket);</p>
<p>if(!$user-&gt;handshake){ dohandshake($user,$buffer); }</p>
<p>else{ process($user,$buffer); }</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>function process($user,$msg){</p>
<p>global $sockets,$users;</p>
<p>$action = unwrap($msg);</p>
<p>say(“&lt; “.$action);</p>
<p>if(!$user-&gt;init){</p>
<p><span style="white-space: pre;"> </span>$user-&gt;user=$action;</p>
<p><span style="white-space: pre;"> </span>send($user-&gt;socket,”hello “.$user-&gt;user);</p>
<p><span style="white-space: pre;"> </span>send($user-&gt;socket,”You can Chat Now!”);</p>
<p><span style="white-space: pre;"> </span>$user-&gt;init=true;</p>
<p><span style="white-space: pre;"> </span>return;</p>
<p>}</p>
<p>foreach($users as $otherUser){</p>
<p><span style="white-space: pre;"> </span>send($otherUser-&gt;socket,$user-&gt;user.”:”.$action);</p>
<p>}</p>
<p>/*</p>
<p>switch($action){</p>
<p>case “hello” : send($user-&gt;socket,”hello human”);                       break;</p>
<p>case “hi”    : send($user-&gt;socket,”zup human”);                         break;</p>
<p>case “name”  : send($user-&gt;socket,”my name is Multivac, silly I know”); break;</p>
<p>case “age”   : send($user-&gt;socket,”I am older than time itself”);       break;</p>
<p>case “date”  : send($user-&gt;socket,”today is “.date(“Y.m.d”));           break;</p>
<p>case “time”  : send($user-&gt;socket,”server time is “.date(“H:i:s”));     break;</p>
<p>case “thanks”: send($user-&gt;socket,”you&#8217;re welcome”);                    break;</p>
<p>case “bye”   : send($user-&gt;socket,”bye”);                               break;</p>
<p>default      : send($user-&gt;socket,$action.” not understood”);           break;</p>
<p>}</p>
<p>*/</p>
<p>}</p>
<p>function send($client,$msg){</p>
<p>say(“&gt; “.$msg);</p>
<p>$msg = wrap($msg);</p>
<p>socket_write($client,$msg,strlen($msg));</p>
<p>}</p>
<p>function WebSocket($address,$port){</p>
<p>$master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)     or die(“socket_create() failed”);</p>
<p>socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1)  or die(“socket_option() failed”);</p>
<p>socket_bind($master, $address, $port)                    or die(“socket_bind() failed”);</p>
<p>socket_listen($master,20)                                or die(“socket_listen() failed”);</p>
<p>echo “Server Started : “.date(&#8216;Y-m-d H:i:s&#8217;).”\n”;</p>
<p>echo “Master socket  : “.$master.”\n”;</p>
<p>echo “Listening on   : “.$address.” port “.$port.”\n\n”;</p>
<p>return $master;</p>
<p>}</p>
<p>function connect($socket){</p>
<p>global $sockets,$users;</p>
<p>$user = new User();</p>
<p>$user-&gt;id = uniqid();</p>
<p>$user-&gt;socket = $socket;</p>
<p>array_push($users,$user);</p>
<p>array_push($sockets,$socket);</p>
<p>console($socket.” CONNECTED!”);</p>
<p>}</p>
<p>function disconnect($socket){</p>
<p>global $sockets,$users;</p>
<p>$found=null;</p>
<p>$n=count($users);</p>
<p>for($i=0;$i&lt;$n;$i++){</p>
<p>if($users[$i]-&gt;socket==$socket){ $found=$i; break; }</p>
<p>}</p>
<p>if(!is_null($found)){ array_splice($users,$found,1); }</p>
<p>$index = array_search($socket,$sockets);</p>
<p>//socket_close($socket);</p>
<p>console($socket.” DISCONNECTED!”);</p>
<p>if($index&gt;=0){ array_splice($sockets,$index,1); }</p>
<p>}</p>
<p>function dohandshake($user,$buffer){</p>
<p>console(“\nRequesting handshake&#8230;”);</p>
<p>console($buffer);</p>
<p>list($resource,$host,$origin,$strkey1,$strkey2,$data) = getheaders($buffer);</p>
<p>console(“Handshaking&#8230;”);</p>
<p>$pattern = &#8216;/[^\d]*/&#8217;;</p>
<p>$replacement = ”;</p>
<p>$numkey1 = preg_replace($pattern, $replacement, $strkey1);</p>
<p>$numkey2 = preg_replace($pattern, $replacement, $strkey2);</p>
<p>$pattern = &#8216;/[^ ]*/&#8217;;</p>
<p>$replacement = ”;</p>
<p>$spaces1 = strlen(preg_replace($pattern, $replacement, $strkey1));</p>
<p>$spaces2 = strlen(preg_replace($pattern, $replacement, $strkey2));</p>
<p>/*</p>
<p>if ($spaces1 == 0 || $spaces2 == 0 || $numkey1 % $spaces1 != 0 || $numkey2 % $spaces2 != 0) {</p>
<p>//socket_close($user-&gt;socket);</p>
<p>console(&#8216;failed&#8217;);</p>
<p>return false;</p>
<p>}</p>
<p>*/</p>
<p>$ctx = hash_init(&#8216;md5&#8242;);</p>
<p>hash_update($ctx, pack(“N”, $numkey1/$spaces1));</p>
<p>hash_update($ctx, pack(“N”, $numkey2/$spaces2));</p>
<p>hash_update($ctx, $data);</p>
<p>$hash_data = hash_final($ctx,true);</p>
<p>$upgrade  = “HTTP/1.1 101 WebSocket Protocol Handshake\r\n” .</p>
<p>“Upgrade: WebSocket\r\n” .</p>
<p>“Connection: Upgrade\r\n” .</p>
<p>“Sec-WebSocket-Origin: ” . $origin . “\r\n” .</p>
<p>“Sec-WebSocket-Location: ws://” . $host . $resource . “\r\n” .</p>
<p>“\r\n” .</p>
<p>$hash_data;</p>
<p>socket_write($user-&gt;socket,$upgrade.chr(0),strlen($upgrade.chr(0)));</p>
<p>$user-&gt;handshake=true;</p>
<p>console($upgrade);</p>
<p>console(“Done handshaking&#8230;”);</p>
<p>sendHello($user);</p>
<p>return true;</p>
<p>}</p>
<p>function sendHello($user){</p>
<p><span style="white-space: pre;"> </span>send($user-&gt;socket,”hello!”);</p>
<p><span style="white-space: pre;"> </span>send($user-&gt;socket,”Welcome to ChatRoom”);</p>
<p><span style="white-space: pre;"> </span>send($user-&gt;socket,”Please Enter Your NickName!”);</p>
<p><span style="white-space: pre;"> </span>$user-&gt;init=false;</p>
<p>}</p>
<p>function getheaders($req){</p>
<p>$r=$h=$o=null;</p>
<p>if(preg_match(“/GET (.*) HTTP/”   ,$req,$match)){ $r=$match[1]; }</p>
<p>if(preg_match(“/Host: (.*)\r\n/”  ,$req,$match)){ $h=$match[1]; }</p>
<p>if(preg_match(“/Origin: (.*)\r\n/”,$req,$match)){ $o=$match[1]; }</p>
<p>if(preg_match(“/Sec-WebSocket-Key2: (.*)\r\n/”,$req,$match)){ $key2=$match[1]; }</p>
<p>if(preg_match(“/Sec-WebSocket-Key1: (.*)\r\n/”,$req,$match)){ $key1=$match[1]; }</p>
<p>if(preg_match(“/\r\n(.*?)\$/”,$req,$match)){ $data=$match[1]; }</p>
<p>return array($r,$h,$o,$key1,$key2,$data);</p>
<p>}</p>
<p>function getuserbysocket($socket){</p>
<p>global $users;</p>
<p>$found=null;</p>
<p>foreach($users as $user){</p>
<p>if($user-&gt;socket==$socket){ $found=$user; break; }</p>
<p>}</p>
<p>return $found;</p>
<p>}</p>
<p>function     say($msg=”"){ echo $msg.”\n”; }</p>
<p>function    wrap($msg=”"){ return chr(0).$msg.chr(255); }</p>
<p>function  unwrap($msg=”"){ return substr($msg,1,strlen($msg)-2); }</p>
<p>function console($msg=”"){ global $debug; if($debug){ echo $msg.”\n”; } }</p>
<p>class User{</p>
<p>var $id;</p>
<p>var $socket;</p>
<p>var $handshake;</p>
<p>var $user;</p>
<p>var $init;</p>
<p>}</p>
<p>?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=142</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>零基础开始WebSocket(2)—-测试服务器</title>
		<link>http://www.frontendcodes.com/?p=138</link>
		<comments>http://www.frontendcodes.com/?p=138#comments</comments>
		<pubDate>Wed, 13 Apr 2011 08:48:10 +0000</pubDate>
		<dc:creator>最爱柠檬</dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[WebSocket]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=138</guid>
		<description><![CDATA[支持HTML5的websocket的浏览器很多。 包括 Opera,Firefox4,Chrome,Safari. 其中Firefox4和Opera的WebSocket默认没有开启，需要手动配置。在浏览器地址栏中输入about:config ，然后找到websocket这一项，把它启用。 我使用了Chrome来测试。 首先，新建一个HTML，加入几个div，来显示数据。 &#60;!DOCTYPE html&#62; &#60;html&#62; &#60;head&#62; &#60;title&#62;&#60;/title&#62; &#60;style&#62; #win{ border:1px solid #ccc; padding:20px ; color:#333; line-height:2em; } .input{ padding:10px 0px; text-align:left;} .input input{ width:200px;} &#60;/style&#62; &#60;/head&#62; &#60;body&#62; &#60;div id=”win”&#62;&#60;/div&#62; &#60;div&#62;&#60;input id=”text”&#62;&#60;button id=”send”&#62;发送&#60;/button&#62;&#60;button id=”disconnect”&#62;断开连接&#60;/button&#62;&#60;/div&#62; &#60;/body&#62; &#60;/html&#62; &#60;!DOCTYPE html&#62;是HTML5的DTD，不谈了。 两个DIV，win用来显示数据，input用来存放提示框 下面写入脚本来测试socket服务器 首先是一个输出的函数 log &#60;script&#62; function log(d){ var logDiv=document.createElement(“div”); logDiv.innerHTML=d; document.getElementById(“win”).appendChild(logDiv); } &#60;/script&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>支持HTML5的websocket的浏览器很多。</p>
<p>包括 Opera,Firefox4,Chrome,Safari.</p>
<p>其中Firefox4和Opera的WebSocket默认没有开启，需要手动配置。在浏览器地址栏中输入about:config ，然后找到websocket这一项，把它启用。</p>
<p>我使用了Chrome来测试。</p>
<p>首先，新建一个HTML，加入几个div，来显示数据。</p>
<div id="_mcePaste">&lt;!DOCTYPE html&gt;</div>
<div id="_mcePaste">&lt;html&gt;</div>
<div id="_mcePaste">&lt;head&gt;</div>
<div id="_mcePaste">&lt;title&gt;&lt;/title&gt;</div>
<div id="_mcePaste">&lt;style&gt;</div>
<div id="_mcePaste">#win{ border:1px solid #ccc; padding:20px ; color:#333; line-height:2em; }</div>
<div id="_mcePaste">.input{ padding:10px 0px; text-align:left;}</div>
<div id="_mcePaste">.input input{ width:200px;}</div>
<div id="_mcePaste">&lt;/style&gt;</div>
<div id="_mcePaste">&lt;/head&gt;</div>
<div id="_mcePaste">&lt;body&gt;</div>
<div id="_mcePaste">&lt;div id=”win”&gt;&lt;/div&gt;</div>
<div id="_mcePaste">&lt;div&gt;&lt;input id=”text”&gt;&lt;button id=”send”&gt;发送&lt;/button&gt;&lt;button id=”disconnect”&gt;断开连接&lt;/button&gt;&lt;/div&gt;</div>
<div>
<div>&lt;/body&gt;</div>
<div>&lt;/html&gt;</div>
</div>
<div>&lt;!DOCTYPE html&gt;是HTML5的DTD，不谈了。</div>
<div>两个DIV，win用来显示数据，input用来存放提示框</div>
<div>下面写入脚本来测试socket服务器</div>
<div>首先是一个输出的函数 log</div>
<div>&lt;script&gt;</div>
<div>
<div>function log(d){</div>
<div>var logDiv=document.createElement(“div”);</div>
<div>logDiv.innerHTML=d;</div>
<div>document.getElementById(“win”).appendChild(logDiv);</div>
<div>}</div>
</div>
<div>&lt;/script&gt;</div>
<div>然后新建一个websocket连接</div>
<div>&lt;script&gt;</div>
<div>
<div>var socket=new WebSocket(“ws://localhost:12345/websocket/server.php”);</div>
<div>socket.onopen=function(){</div>
<div>log(“已经连接到socket服务器”);</div>
<div>log(“Socket ReadyState:”+socket.readyState);</div>
<div>};</div>
<div>&lt;/script&gt;</div>
<div>ws://localhost:12345/websocket/server.php是我的socket服务器端文件地址，注意这里的协议不是http而是ws。</div>
<div>于是新建了一个websocket对象socket，给socket绑定了一个事件，连接open时，给出提示。</div>
</div>
<div>好了，测试一下服务器吧。</div>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=138</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

