<?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>檬檬前端行 &#187; 前端</title>
	<atom:link href="http://www.frontendcodes.com/?cat=3&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.frontendcodes.com</link>
	<description>路漫漫其修远兮</description>
	<lastBuildDate>Wed, 18 Mar 2015 10:05:27 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<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>1</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>1</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、表达式变为&#8221;"==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，于是对&#8221;"进行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>1</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=&#8221;win&#8221;&#62;&#60;/div&#62; &#60;div&#62;&#60;input id=&#8221;text&#8221;&#62;&#60;button id=&#8221;send&#8221;&#62;发送&#60;/button&#62;&#60;button id=&#8221;disconnect&#8221;&#62;断开连接&#60;/button&#62;&#60;/div&#62; &#60;script&#62; function log(d){ var logDiv=document.createElement(&#8220;div&#8221;); logDiv.innerHTML=d; document.getElementById(&#8220;win&#8221;).appendChild(logDiv); } //创建websocket连接 var socket=new WebSocket(&#8220;ws://localhost:12345/websocket/server.php&#8221;); //绑定连接成功事件 socket.onopen=function(){ log(&#8220;Socket ReadyState:&#8221;+socket.readyState); //socket.send(&#8220;hi&#8221;); }; //绑定接收到信息事件 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=&#8221;win&#8221;&gt;&lt;/div&gt;</div>
<div id="_mcePaste">&lt;div&gt;&lt;input id=&#8221;text&#8221;&gt;&lt;button id=&#8221;send&#8221;&gt;发送&lt;/button&gt;&lt;button id=&#8221;disconnect&#8221;&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(&#8220;div&#8221;);</div>
<div id="_mcePaste">logDiv.innerHTML=d;</div>
<div id="_mcePaste">document.getElementById(&#8220;win&#8221;).appendChild(logDiv);</div>
<div id="_mcePaste">}</div>
<div>//创建websocket连接</div>
<div id="_mcePaste">var socket=new WebSocket(&#8220;ws://localhost:12345/websocket/server.php&#8221;);</div>
<div>//绑定连接成功事件</div>
<div id="_mcePaste">socket.onopen=function(){</div>
<div id="_mcePaste">log(&#8220;Socket ReadyState:&#8221;+socket.readyState);</div>
<div id="_mcePaste">//socket.send(&#8220;hi&#8221;);</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(&#8220;close!&#8221;);</div>
<div id="_mcePaste">log(&#8220;Socket ReadyState:&#8221;+socket.readyState);</div>
<div id="_mcePaste">}</div>
<div>//发送信息至服务器</div>
<div id="_mcePaste">function send(){</div>
<div id="_mcePaste">var texts=document.getElementById(&#8220;text&#8221;).value;</div>
<div id="_mcePaste">socket.send(texts);</div>
<div id="_mcePaste">document.getElementById(&#8220;text&#8221;).value=&#8221;";</div>
<div id="_mcePaste">}</div>
<div>//绑定其他DOM事件</div>
<div id="_mcePaste">document.getElementById(&#8220;send&#8221;).onclick=send;</div>
<div id="_mcePaste">document.getElementById(&#8220;text&#8221;).onkeyup=function(e){</div>
<div id="_mcePaste">if(e.keyCode==13) send();</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">document.getElementById(&#8220;disconnect&#8221;).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(&#8220;localhost&#8221;,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(&#8220;socket_accept() failed&#8221;); 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(&#8220;&lt; &#8220;.$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,&#8221;hello &#8220;.$user-&gt;user);</p>
<p><span style="white-space: pre;"> </span>send($user-&gt;socket,&#8221;You can Chat Now!&#8221;);</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.&#8221;:&#8221;.$action);</p>
<p>}</p>
<p>/*</p>
<p>switch($action){</p>
<p>case &#8220;hello&#8221; : send($user-&gt;socket,&#8221;hello human&#8221;);                       break;</p>
<p>case &#8220;hi&#8221;    : send($user-&gt;socket,&#8221;zup human&#8221;);                         break;</p>
<p>case &#8220;name&#8221;  : send($user-&gt;socket,&#8221;my name is Multivac, silly I know&#8221;); break;</p>
<p>case &#8220;age&#8221;   : send($user-&gt;socket,&#8221;I am older than time itself&#8221;);       break;</p>
<p>case &#8220;date&#8221;  : send($user-&gt;socket,&#8221;today is &#8220;.date(&#8220;Y.m.d&#8221;));           break;</p>
<p>case &#8220;time&#8221;  : send($user-&gt;socket,&#8221;server time is &#8220;.date(&#8220;H:i:s&#8221;));     break;</p>
<p>case &#8220;thanks&#8221;: send($user-&gt;socket,&#8221;you&#8217;re welcome&#8221;);                    break;</p>
<p>case &#8220;bye&#8221;   : send($user-&gt;socket,&#8221;bye&#8221;);                               break;</p>
<p>default      : send($user-&gt;socket,$action.&#8221; not understood&#8221;);           break;</p>
<p>}</p>
<p>*/</p>
<p>}</p>
<p>function send($client,$msg){</p>
<p>say(&#8220;&gt; &#8220;.$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(&#8220;socket_create() failed&#8221;);</p>
<p>socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1)  or die(&#8220;socket_option() failed&#8221;);</p>
<p>socket_bind($master, $address, $port)                    or die(&#8220;socket_bind() failed&#8221;);</p>
<p>socket_listen($master,20)                                or die(&#8220;socket_listen() failed&#8221;);</p>
<p>echo &#8220;Server Started : &#8220;.date(&#8216;Y-m-d H:i:s&#8217;).&#8221;\n&#8221;;</p>
<p>echo &#8220;Master socket  : &#8220;.$master.&#8221;\n&#8221;;</p>
<p>echo &#8220;Listening on   : &#8220;.$address.&#8221; port &#8220;.$port.&#8221;\n\n&#8221;;</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.&#8221; CONNECTED!&#8221;);</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.&#8221; DISCONNECTED!&#8221;);</p>
<p>if($index&gt;=0){ array_splice($sockets,$index,1); }</p>
<p>}</p>
<p>function dohandshake($user,$buffer){</p>
<p>console(&#8220;\nRequesting handshake&#8230;&#8221;);</p>
<p>console($buffer);</p>
<p>list($resource,$host,$origin,$strkey1,$strkey2,$data) = getheaders($buffer);</p>
<p>console(&#8220;Handshaking&#8230;&#8221;);</p>
<p>$pattern = &#8216;/[^\d]*/&#8217;;</p>
<p>$replacement = &#8221;;</p>
<p>$numkey1 = preg_replace($pattern, $replacement, $strkey1);</p>
<p>$numkey2 = preg_replace($pattern, $replacement, $strkey2);</p>
<p>$pattern = &#8216;/[^ ]*/&#8217;;</p>
<p>$replacement = &#8221;;</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(&#8220;N&#8221;, $numkey1/$spaces1));</p>
<p>hash_update($ctx, pack(&#8220;N&#8221;, $numkey2/$spaces2));</p>
<p>hash_update($ctx, $data);</p>
<p>$hash_data = hash_final($ctx,true);</p>
<p>$upgrade  = &#8220;HTTP/1.1 101 WebSocket Protocol Handshake\r\n&#8221; .</p>
<p>&#8220;Upgrade: WebSocket\r\n&#8221; .</p>
<p>&#8220;Connection: Upgrade\r\n&#8221; .</p>
<p>&#8220;Sec-WebSocket-Origin: &#8221; . $origin . &#8220;\r\n&#8221; .</p>
<p>&#8220;Sec-WebSocket-Location: ws://&#8221; . $host . $resource . &#8220;\r\n&#8221; .</p>
<p>&#8220;\r\n&#8221; .</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(&#8220;Done handshaking&#8230;&#8221;);</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,&#8221;hello!&#8221;);</p>
<p><span style="white-space: pre;"> </span>send($user-&gt;socket,&#8221;Welcome to ChatRoom&#8221;);</p>
<p><span style="white-space: pre;"> </span>send($user-&gt;socket,&#8221;Please Enter Your NickName!&#8221;);</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(&#8220;/GET (.*) HTTP/&#8221;   ,$req,$match)){ $r=$match[1]; }</p>
<p>if(preg_match(&#8220;/Host: (.*)\r\n/&#8221;  ,$req,$match)){ $h=$match[1]; }</p>
<p>if(preg_match(&#8220;/Origin: (.*)\r\n/&#8221;,$req,$match)){ $o=$match[1]; }</p>
<p>if(preg_match(&#8220;/Sec-WebSocket-Key2: (.*)\r\n/&#8221;,$req,$match)){ $key2=$match[1]; }</p>
<p>if(preg_match(&#8220;/Sec-WebSocket-Key1: (.*)\r\n/&#8221;,$req,$match)){ $key1=$match[1]; }</p>
<p>if(preg_match(&#8220;/\r\n(.*?)\$/&#8221;,$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=&#8221;"){ echo $msg.&#8221;\n&#8221;; }</p>
<p>function    wrap($msg=&#8221;"){ return chr(0).$msg.chr(255); }</p>
<p>function  unwrap($msg=&#8221;"){ return substr($msg,1,strlen($msg)-2); }</p>
<p>function console($msg=&#8221;"){ global $debug; if($debug){ echo $msg.&#8221;\n&#8221;; } }</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=&#8221;win&#8221;&#62;&#60;/div&#62; &#60;div&#62;&#60;input id=&#8221;text&#8221;&#62;&#60;button id=&#8221;send&#8221;&#62;发送&#60;/button&#62;&#60;button id=&#8221;disconnect&#8221;&#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(&#8220;div&#8221;); logDiv.innerHTML=d; document.getElementById(&#8220;win&#8221;).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=&#8221;win&#8221;&gt;&lt;/div&gt;</div>
<div id="_mcePaste">&lt;div&gt;&lt;input id=&#8221;text&#8221;&gt;&lt;button id=&#8221;send&#8221;&gt;发送&lt;/button&gt;&lt;button id=&#8221;disconnect&#8221;&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(&#8220;div&#8221;);</div>
<div>logDiv.innerHTML=d;</div>
<div>document.getElementById(&#8220;win&#8221;).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(&#8220;ws://localhost:12345/websocket/server.php&#8221;);</div>
<div>socket.onopen=function(){</div>
<div>log(&#8220;已经连接到socket服务器&#8221;);</div>
<div>log(&#8220;Socket ReadyState:&#8221;+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>1</slash:comments>
		</item>
		<item>
		<title>零基础开始WebSocket(1)&#8212;-简单的socket服务器端</title>
		<link>http://www.frontendcodes.com/?p=128</link>
		<comments>http://www.frontendcodes.com/?p=128#comments</comments>
		<pubDate>Wed, 13 Apr 2011 03:39:45 +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=128</guid>
		<description><![CDATA[零基础。开始搞websocket websocket实现了即时通信，远比现在常用的长连接经济方便。 我用的socket服务器端是PHP的。 下载链接 http://www.frontendcodes.com/downloads/socket.rar 解压至本地服务器文件夹。 在server.php中 有$master  = WebSocket(&#8220;localhost&#8221;,12345);这一行，localhost是地址，12345是端口号，可以自行修改。 修改完在命令行中键入php -q 路径/server.php，例如，我的在E:\svn\sockets\ 执行命令 E:\php\php.exe -q E:\svn\sockets\server.php OK,一个简单的socket服务器搞定。]]></description>
			<content:encoded><![CDATA[<p>零基础。开始搞websocket</p>
<p>websocket实现了即时通信，远比现在常用的长连接经济方便。</p>
<p>我用的socket服务器端是PHP的。 下载链接 http://www.frontendcodes.com/downloads/socket.rar</p>
<p>解压至本地服务器文件夹。</p>
<p>在server.php中 有$master  = WebSocket(&#8220;localhost&#8221;,12345);这一行，localhost是地址，12345是端口号，可以自行修改。</p>
<p>修改完在命令行中键入php -q 路径/server.php，例如，我的在E:\svn\sockets\</p>
<p>执行命令 E:\php\php.exe -q E:\svn\sockets\server.php</p>
<p>OK,一个简单的socket服务器搞定。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=128</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE9给前端开发带来了什么？</title>
		<link>http://www.frontendcodes.com/?p=124</link>
		<comments>http://www.frontendcodes.com/?p=124#comments</comments>
		<pubDate>Fri, 01 Apr 2011 02:15:10 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[IE9]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=124</guid>
		<description><![CDATA[虽然至今我的IE9依然不能开启flash插件，但是不得不说，IE9的到来，给web前端工作带来了很多不一样的东西。 1、HTML5 HTML5是大势所趋，HTML4以来，已经过了十多年，在这十多年里，互联网有了巨大的变化，人们越来越要求在互联网上更多的看到方便简单的应用。 为什么是HTML5？ 我想说对于普通的用户来说，他们不需要HTML5，他们不在乎你到底是用什么实现的，对于他们来说这不重要。只要你能把他们需要的产品提供给他们，简单好用，这就行了。 但是浏览器厂商需要HTML5，至少他们有了新目标，新功能，更重要的是，浏览器不想要一个独立于自己控制之外的FLASH。 无论怎么吐槽，HTML5终于来了。虽然IE9对HTML5的支持还不是那么完善。但是至少canvas websocket，都是能让程序员激动不已的新东西。终于，所有的浏览器厂商都支持HTML5了，虽然，我们还有IE6 IE7 IE8，但是它们迟早都要被IE9替代的不是？ 2、标准 还记得那些代码吗？ attachEvent 和 addEventListener , window.event和e , event.srcElement和event.target 是的是的，很多很多的IE专用，IE专有。我们的代码有很大的精力，浪费在了浏览器兼容上。即便如此，还有很多很多的BUG无法解决。例如 attachEvent里的this。。 现在这都是过去式了，IE9拥抱了W3C，使得一套代码，可以在不同的浏览器都可以正常的运行。 这使得前端开发者们，可以从修修补补中摆脱出来，把精力放在真正的代码编写上。 还记得以前对后端开发者的嗤之以鼻吗？ “你们的代码写一套就可以运行，我们前端可不是这样”，这也变成过去了，那些浏览器兼容知识，也许在不久的将来就变成废品。时代在进步，不是吗？ 3、效率 我的一个朋友有个冷笑话。他说：“IE虽然这个不好那个不好，但是它有一条很重要的优点，那就是稳定。你看它一直都这么慢”，“慢”是IE的代表了。 同样的一段代码，在IE中，运行的就不流畅，同样的几个操作，在IE中就会内存溢出。 在IE9中，他们很大程度上的解决了这个问题。IE9甚至支持硬件加速。在sunspider之类的测试中，IE9终于赶得上其他的浏览器了。 加油！IE！ 最后： 最后，HTML5来了，大型的web应用的时代到来了，你准备好了吗？还在为IE6的layout bug纠结吗？多看看吧，世界不一样了！]]></description>
			<content:encoded><![CDATA[<p>虽然至今我的IE9依然不能开启flash插件，但是不得不说，IE9的到来，给web前端工作带来了很多不一样的东西。</p>
<p><strong>1、HTML5</strong></p>
<p>HTML5是大势所趋，HTML4以来，已经过了十多年，在这十多年里，互联网有了巨大的变化，人们越来越要求在互联网上更多的看到方便简单的应用。</p>
<p>为什么是HTML5？</p>
<p>我想说对于普通的用户来说，他们不需要HTML5，他们不在乎你到底是用什么实现的，对于他们来说这不重要。只要你能把他们需要的产品提供给他们，简单好用，这就行了。</p>
<p>但是浏览器厂商需要HTML5，至少他们有了新目标，新功能，更重要的是，浏览器不想要一个独立于自己控制之外的FLASH。</p>
<p>无论怎么吐槽，HTML5终于来了。虽然IE9对HTML5的支持还不是那么完善。但是至少canvas websocket，都是能让程序员激动不已的新东西。终于，所有的浏览器厂商都支持HTML5了，虽然，我们还有IE6 IE7 IE8，但是它们迟早都要被IE9替代的不是？</p>
<p><strong>2、标准</strong></p>
<p>还记得那些代码吗？</p>
<p>attachEvent 和 addEventListener , window.event和e , event.srcElement和event.target</p>
<p>是的是的，很多很多的IE专用，IE专有。我们的代码有很大的精力，浪费在了浏览器兼容上。即便如此，还有很多很多的BUG无法解决。例如 attachEvent里的this。。</p>
<p>现在这都是过去式了，IE9拥抱了W3C，使得一套代码，可以在不同的浏览器都可以正常的运行。 这使得前端开发者们，可以从修修补补中摆脱出来，把精力放在真正的代码编写上。</p>
<p>还记得以前对后端开发者的嗤之以鼻吗？ “你们的代码写一套就可以运行，我们前端可不是这样”，这也变成过去了，那些浏览器兼容知识，也许在不久的将来就变成废品。时代在进步，不是吗？</p>
<p><strong>3、效率</strong></p>
<p>我的一个朋友有个冷笑话。他说：“IE虽然这个不好那个不好，但是它有一条很重要的优点，那就是稳定。你看它一直都这么慢”，“慢”是IE的代表了。</p>
<p>同样的一段代码，在IE中，运行的就不流畅，同样的几个操作，在IE中就会内存溢出。</p>
<p>在IE9中，他们很大程度上的解决了这个问题。IE9甚至支持硬件加速。在sunspider之类的测试中，IE9终于赶得上其他的浏览器了。</p>
<p>加油！IE！</p>
<p><strong>最后：</strong></p>
<p>最后，HTML5来了，大型的web应用的时代到来了，你准备好了吗？还在为IE6的layout bug纠结吗？多看看吧，世界不一样了！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=124</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hello IE9</title>
		<link>http://www.frontendcodes.com/?p=118</link>
		<comments>http://www.frontendcodes.com/?p=118#comments</comments>
		<pubDate>Tue, 15 Mar 2011 17:21:34 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=118</guid>
		<description><![CDATA[整个安装无任何阻扰——当然，我关了所有东西，因为我在卸载MSSQL过程中，正无聊。不过猫给我的x86包是装不了的，我是x64的win7，找了个x64的包，安装很顺利。 到这里来主要是看我的canvas代码在IE9下的运行情况的。电子表那个毫秒部分有点顿。 然后，为毛这个编辑区域在IE9下无法用鼠标选取文字呢？我猜测WP的文本编辑器是基于div的。这就完球了？ 其实刚才我想好好夸IE9来着。 然后，在我纠结于这个无法选取的问题时，假死了一下，草稿没存上，突然就全没了。我现在怀疑能不能够顺利提交这篇文章。 不过我对整个安装过程感觉还行，运行么 ……至少现在还没挂。一些细节的变化我不是很在意，因为浏览器就是靠这些东西栓人的。 为了Canvas，为了HTML5，我还是欢迎IE9的到来。]]></description>
			<content:encoded><![CDATA[<div>
<p>整个安装无任何阻扰——当然，我关了所有东西，因为我在卸载MSSQL过程中，正无聊。不过猫给我的x86包是装不了的，我是x64的win7，找了个x64的包，安装很顺利。</p>
<p>到这里来主要是看我的canvas代码在IE9下的运行情况的。电子表那个毫秒部分有点顿。</p>
<p>然后，为毛这个编辑区域在IE9下无法用鼠标选取文字呢？我猜测WP的文本编辑器是基于div的。这就完球了？</p>
<p>其实刚才我想好好夸IE9来着。</p>
<p>然后，在我纠结于这个无法选取的问题时，假死了一下，草稿没存上，突然就全没了。我现在怀疑能不能够顺利提交这篇文章。</p>
<p>不过我对整个安装过程感觉还行，运行么 ……至少现在还没挂。一些细节的变化我不是很在意，因为浏览器就是靠这些东西栓人的。</p>
<p>为了Canvas，为了HTML5，我还是欢迎IE9的到来。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=118</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IE9，你真让人失望！</title>
		<link>http://www.frontendcodes.com/?p=113</link>
		<comments>http://www.frontendcodes.com/?p=113#comments</comments>
		<pubDate>Tue, 15 Mar 2011 12:44:12 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[IE9]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=113</guid>
		<description><![CDATA[3月15日，晚上，安装了IE9，系统是win7 sp1，安装过程很扯淡，很差劲。 首先，连接到微软的IE9下载页，居然还分WIN7 32和win7 64版本的。初级用户根本无所适从。 然后，下载安装，提示我一大堆软件需要强制关闭，好吧，你IE关闭自己的也就算了，QQ,chrome关你安装哪门子事啊，我还是用chrome下载你的安装包呢！ 安装结束，提示我文件需要更新，于是，我又重启了一次电脑。这安装，破事怎么这么多啊！ 第一次启动IE9，感觉界面很清爽。以前的菜单栏也不见了，地址栏固定到了左上，tab在地址栏的右侧，也许是习惯了chrome，感觉地址栏有点太短了。 打开第一个网页，news.qq.com，问题出现了，浏览器崩溃，IE9就这么不给面子，第一次启动就崩溃了？这给人的体验太差了，不知道哪里出现了问题，上网查吧，于是又掏出了chrome（再次鄙视你，IE9），网上没啥信息，有说迅雷插件的问题，我禁用了也没用啊！照样崩溃。唉，为了尝鲜，只好一个一个的找，过了10分钟，终于发现，禁用了flash插件后，IE9工作正常了。但是我想，那是因为我是做web开发的，普通用户的话，已经卸载了吧，呵呵。 这就是IE9给我第一印象。]]></description>
			<content:encoded><![CDATA[<p>3月15日，晚上，安装了IE9，系统是win7 sp1，安装过程很扯淡，很差劲。</p>
<p>首先，连接到微软的IE9下载页，居然还分WIN7 32和win7 64版本的。初级用户根本无所适从。</p>
<p>然后，下载安装，提示我一大堆软件需要强制关闭，好吧，你IE关闭自己的也就算了，QQ,chrome关你安装哪门子事啊，我还是用chrome下载你的安装包呢！</p>
<p>安装结束，提示我文件需要更新，于是，我又重启了一次电脑。这安装，破事怎么这么多啊！</p>
<p>第一次启动IE9，感觉界面很清爽。以前的菜单栏也不见了，地址栏固定到了左上，tab在地址栏的右侧，也许是习惯了chrome，感觉地址栏有点太短了。</p>
<p>打开第一个网页，news.qq.com，问题出现了，浏览器崩溃，IE9就这么不给面子，第一次启动就崩溃了？这给人的体验太差了，不知道哪里出现了问题，上网查吧，于是又掏出了chrome（再次鄙视你，IE9），网上没啥信息，有说迅雷插件的问题，我禁用了也没用啊！照样崩溃。唉，为了尝鲜，只好一个一个的找，过了10分钟，终于发现，禁用了flash插件后，IE9工作正常了。但是我想，那是因为我是做web开发的，普通用户的话，已经卸载了吧，呵呵。</p>
<p>这就是IE9给我第一印象。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=113</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Canvas绘制液晶电子表</title>
		<link>http://www.frontendcodes.com/?p=105</link>
		<comments>http://www.frontendcodes.com/?p=105#comments</comments>
		<pubDate>Tue, 08 Mar 2011 00:44:26 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.frontendcodes.com/?p=105</guid>
		<description><![CDATA[注意几个函数的用法： ctx.save ctx.restore ctx.translate ctx.setTransform 点击查看：canvas_test2]]></description>
			<content:encoded><![CDATA[<p>注意几个函数的用法：</p>
<p>ctx.save</p>
<p>ctx.restore</p>
<p>ctx.translate</p>
<h1><span style="font-weight: normal;font-size: 13px">ctx.setTransform</span></h1>
<h1><strong>点击查看：<a href="http://www.frontendcodes.com/wp-content/uploads/2011/03/canvas_test2.html">canvas_test2</a></strong></h1>
]]></content:encoded>
			<wfw:commentRss>http://www.frontendcodes.com/?feed=rss2&#038;p=105</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
