<?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; Js/Css/Html/Xml</title>
	<atom:link href="http://www.ieliwb.com/category/js-css-html/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ieliwb.com</link>
	<description>灵感的来临，没有任何预兆；灵感的消失，也不会有告别仪式；用文字记下她们吧，让灵感永存……</description>
	<lastBuildDate>Wed, 04 Aug 2010 02:52:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>iui ：User Interface (UI) Framework for Safari development on iPhone</title>
		<link>http://www.ieliwb.com/iphone-ui-framework-iui/</link>
		<comments>http://www.ieliwb.com/iphone-ui-framework-iui/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 09:27:18 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[iPhone/Mac/ObjectC]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[iPhone框架]]></category>
		<category><![CDATA[iui]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/iui-%ef%bc%9auser-interface-ui-framework-for-safari-development-on-iphone/</guid>
		<description><![CDATA[<img src="http://code.google.com/p/iui/logo?logo_id=1238443620" alt="" />
<blockquote>IUI是iPhone web开发前端框架，用css，html，js打造iPhone app界面，IUI内置了很多应用，如音乐站，购物站，digg站，资讯站.....这些你都可以在IUI上找到........
</blockquote>[......]<p class='read-more'><a href='http://www.ieliwb.com/iphone-ui-framework-iui/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code.google.com/p/iui/logo?logo_id=1238443620" alt="" /></p>
<blockquote><p>
iUI: iPhone User Interface Framework</p>
<p>iUI is a framework consisting of a JavaScript library, CSS, and images for developing iPhone webapps.</p>
<p>Makes WebApps Look and Feel Like iPhone Native Apps</p>
<p>iUI has the following features:</p>
<p>Create Navigational Menus and iPhone interfaces from standard HTML<br />
Use or knowledge of JavaScript is not required to create basic iPhone pages<br />
Ability to handle phone orientation changes<br />
Provide a more &#8220;iPhone-like&#8221; experience to Web apps (on or off the iPhone)<br />
For more information, see the <a href="http://code.google.com/p/iui/">Introduction </a>page.
</p></blockquote>
<blockquote><p>框架主页：http://code.google.com/p/iui/</p></blockquote>
<blockquote><p>IUI是iPhone web开发前端框架，用css，html，js打造iPhone app界面，IUI内置了很多应用，如音乐站，购物站，digg站，资讯站&#8230;..这些你都可以在IUI上找到&#8230;&#8230;..
</p></blockquote>
<p><strong>测试截图：</strong><br />
<img src="http://www.ieliwb.com/u/img/iui-theaters.jpg" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/iui-digg.jpg" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/iui-setting.jpg" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/iui-music.jpg" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/iui-ticket.jpg" alt="" /><br />
相信上面是WEB界面吗？试试IUI吧。</p>
<p>关于iPhone web开发可以参考：<br />
<a href="http://www.ieliwb.com/aptana-iphone-web-development/">使用 Aptana 的 iPhone Development 插件开发 iPhone Web 应用程序</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/iphone-ui-framework-iui/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>使用 Aptana 的 iPhone Development 插件开发 iPhone Web 应用程序</title>
		<link>http://www.ieliwb.com/aptana-iphone-web-development/</link>
		<comments>http://www.ieliwb.com/aptana-iphone-web-development/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 08:14:40 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[iPhone/Mac/ObjectC]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/%e4%bd%bf%e7%94%a8-aptana-%e7%9a%84-iphone-development-%e6%8f%92%e4%bb%b6%e5%bc%80%e5%8f%91-iphone-web-%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f/</guid>
		<description><![CDATA[<img src="http://www.ieliwb.com/u/img/fingermouse.jpg" alt="" />
<blockquote>Apple 的 iPhone 平台为开发人员提供了一个有趣的机会。借助其小型的交互式触摸屏，iPhone 和 iPod Touch 在很短的时间内迅速吸引了数百万用户。但是这种新颖的设计和专利平台给应用程序开发人员带来了一系列新的挑战。幸运的是，使用一系列新的开源工具可以更轻松地完成这项工作。Aptana 的针对 Eclipse 的 iPhone Development 插件可以生成特定于 iPhone 的项目，并在可旋转取景器中预览应用程序。</blockquote>
<blockquote>官方网站：http://www.aptana.org/</blockquote>[......]<p class='read-more'><a href='http://www.ieliwb.com/aptana-iphone-web-development/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Apple 的 iPhone 平台为开发人员提供了一个有趣的机会。借助其小型的交互式触摸屏，iPhone 和 iPod Touch 在很短的时间内迅速吸引了数百万用户。但是这种新颖的设计和专利平台给应用程序开发人员带来了一系列新的挑战。幸运的是，使用一系列新的开源工具可以更轻松地完成这项工作。Aptana 的针对 Eclipse 的 iPhone Development 插件可以生成特定于 iPhone 的项目，并在可旋转取景器中预览应用程序。</p></blockquote>
<blockquote><p>官方网站：http://www.aptana.org/</p></blockquote>
<p><img src="http://www.ieliwb.com/u/img/fingermouse.jpg" alt="" /></p>
<blockquote><p>在开始设计iPhone浏览界面 之前，一定要先了解 iPhone 开发与普通 Web 开发的不同之处。来自 Apple 的 iPhone Dev Center（请参阅 参考资料）(上图)，很好地总结了两者的不同之处：手指不是鼠标。这样做得不到桌面应用程序中的像素精度，但是通过轻敲、轻弹和轻压将开启一个丰富的新用户交互模型。此外，iPhone 与用户一起移动并且通常用于有干扰的环境中，因此应用程序需要能够快速容易地访问目标信息。</p></blockquote>
<blockquote><p>这里可以参考我以前写过的一篇文章：<a href="http://www.ieliwb.com/myiphones-iphone-site/">http://www.ieliwb.com/myiphones-iphone-site/</a></p></blockquote>
<p><strong>安装 Aptana Studio, 及iphone开发插件：</strong></p>
<blockquote><p>首先安装Aptana Studio V2.0.2，完成后在 Aptana Studio V2.0.2中，选择 Help > Software Updates > Find and Install。<br />
选择 Search for new features to install。此窗口列出了可以从中下载插件的站点以及 Eclipse 预定义的插件。<br />
单击 New Remote Site 将 iphone插件 添加到此列表中，并使用 URL http://update1.aptana.org/iphone/3.2/  对其进行定义。<br />
从列表中选择新定义的 Aptana 站点，单击 Next，然后安装所有可用功能。完成此窗口安装基本的 Aptana Editor。<br />
重新启动 Aptana Studio。新建一个项目就可以看到有iPhone web development的选项了。</p></blockquote>
<p><img src="http://www.ieliwb.com/u/img/aptana_install_step_1.jpg" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/aptana_install_step_2.jpg" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/aptana_install_step_3.jpg" alt="" /></p>
<p>详细步骤就不写了（英文原文：http://update1.aptana.org/iphone/3.2/index.html），一路点下去就可以，注意打勾和不打勾的。</p>
<p><strong>调试界面：</strong></p>
<blockquote><p>注意由 Aptana 的基本编辑器提供的突出显示的语法，它支持 HTML、CSS 和 JavaScript。<br />
在文本编辑器的底部，您将看到 Source、iPhone 、IE等 选项卡，可以自己添加浏览器模式，建议安装Safari浏览器并设为默认浏览器，这样你调试的页面基本和iPhone上浏览的一摸一样，我这是用默认的IE调试有点错位，单击 iPhone Preview 查看示例应用程序在 iPhone 中的外观。在浏览器外部单击可以旋转电话，单击电话标题栏可以隐藏导航栏。</p></blockquote>
<p><img src="http://www.ieliwb.com/u/img/aptana_install_step_4.jpg" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/aptana_install_step_5.jpg" alt="" /></p>
<blockquote><p>使用 iPhone Preview 模式可以节省大量时间：可以快速测试新设计想法并重复进行开发而无需离开计算机。</p></blockquote>
<blockquote><p>习惯于Eclipse开发的可以使用Aptana 的Eclipse插件来开发也可以，可以参考：<a href="http://www.ibm.com/developerworks/cn/opensource/os-eclipse-iphone/#main">IBM</a></p></blockquote>
<p><strong>最后推荐一个开源UI框架iUi：</strong></p>
<blockquote><p>User Interface (UI) Framework for Safari development on iPhone<br />
地址：http://code.google.com/p/iui/</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/aptana-iphone-web-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>利用AJAX模拟HTTP长连接(LongPoll)来实现&#8221;服务器推&#8221;技术</title>
		<link>http://www.ieliwb.com/comet-ajax-longpoll-push/</link>
		<comments>http://www.ieliwb.com/comet-ajax-longpoll-push/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 04:10:46 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[http长连接]]></category>
		<category><![CDATA[longpoll]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/%e5%88%a9%e7%94%a8ajax%e6%a8%a1%e6%8b%9fhttp%e9%95%bf%e8%bf%9e%e6%8e%a5longpoll%e6%9d%a5%e5%ae%9e%e7%8e%b0%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%8e%a8%e6%8a%80%e6%9c%af/</guid>
		<description><![CDATA[<blockquote>Comet（彗星：某人给服务器推送技术起的名字）</blockquote>

<strong>核心图解：</strong>
<img src="http://www.ieliwb.com/u/img/ajax-long-polling.jpg" alt="long-polling" />

<blockquote>最近在看“服务器推送技术”，在B/S结构中，通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新信息（比如股票价格，聊天室，webQQ、开心网、白社会），这样可以节省大量的带宽。
 
传统的轮询技术对服务器的压力很大，并且造成带宽的极大浪费。如果改用ajax轮询，可以降低带宽的负荷（因为服务器返回的不是完整页面），但是对服务器的压力并不会有明显的减少。
 
而推技术（push）可以改善这种情况。但因为HTTP连接的特性（短暂，必须由客户端发起），使得推技术的实现比较困难，常见的做法是通过延长http连接的寿命，来实现push。</blockquote>[......]<p class='read-more'><a href='http://www.ieliwb.com/comet-ajax-longpoll-push/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Comet（彗星：某人给服务器推送技术起的名字）</p></blockquote>
<p><strong>核心图解：</strong><br />
<img src="http://www.ieliwb.com/u/img/ajax-long-polling.jpg" alt="long-polling" /></p>
<blockquote><p>最近在看“服务器推送技术”，在B/S结构中，通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新信息（比如股票价格，聊天室，webQQ、开心网、白社会），这样可以节省大量的带宽。</p>
<p>传统的轮询技术对服务器的压力很大，并且造成带宽的极大浪费。如果改用ajax轮询，可以降低带宽的负荷（因为服务器返回的不是完整页面），但是对服务器的压力并不会有明显的减少。</p>
<p>而推技术（push）可以改善这种情况。但因为HTTP连接的特性（短暂，必须由客户端发起），使得推技术的实现比较困难，常见的做法是通过延长http连接的寿命，来实现push。</p></blockquote>
<p><strong>基本实现原理：</strong></p>
<blockquote><p>接下来自然该讨论如何延长http连接的寿命，最简单的自然是死循环法，如果使用观察者模式则可以进一步提高性能。</p>
<p>但是这种做法的缺点在于客户端请求了这个servlet后，web服务器会开启一个线程执行servlet的代码，而servlet由迟迟不肯结束，造成该线程也无法被释放。于是乎，一个客户端一个线程，当客户端数量增加时，服务器依然会承受很大的负担。</p>
<p>要从根本上改变这个现象比较复杂，目前的趋势是从web服务器内部入手，用nio（JDK 1.4提出的java.nio包）改写request/response的实现，再利用线程池增强服务器的资源利用率，从而解决这个问题，目前支持这一非J2EE官方技术的服务器有Glassfish和Jetty。目前也有一些框架/工具可以帮助你实现推功能，比如pushlets。不过没有深入研究。还有就是通过设置超时来解决。</p></blockquote>
<p><strong>在客户和服务器之间保持“心跳”信息 &#8212;&#8211;无事件导致超时处理：</strong></p>
<blockquote><p>因为服务器为了保持请求（阻塞请求），必须有一个无限循环，循环的结束条件就是获取到了返回结果，如果客户端关闭了（客户端浏览器的关闭不会发消息给服务器），服务器无法知道客户端已经关了，这个请求没必要处理下去了，最终会造成资源过度浪费。还有服务器中间可能存在各式各样配置怪异的网关和代理，它们上面可能有各式各样的超时规则，因此Comet最好设计为定期重连。只要用一个折中的办法，限制超时时间。一般情况下，如果30秒没有任何事件发生，服务器端就应该通知客户端确实没有事件发生，结束掉本次请求，然后重新开始一次新的请求以便继续等待。这里可以不必设置客户端ajax的超时时间，但进行请求的时候传递一个超时值给服务器，服务器在处理的时候，如果超时时间到了的话，还没有客户端需要的结果，这时传递一个超时信息给客户端，客户端接收到了此信息，根据情况重新进行ajax请求，也就是进入下一个轮询&#8230;&#8230;&#8230;.当服务器处理信息出现异常情况，需要发送错误信息通知客户端，同时释放资源、关闭连接。</p></blockquote>
<p><strong>服务器端事件队列管理以及如何保持可靠的消息队列:</strong></p>
<blockquote><p>由于ajax的LongPoll是拉的方式(不同的客户端拉取的参数可以根据客户端不同而不同)，服务器端根据客户选择的方式在读取事件队列（fetchEvents）时进行不同的处理，会把“heartbeat”与“refresh”事件一起传给客户端，通知客户端重新发出请求、建立连接。拉的同时也解决了发送目标的返回值。</p>
<p>在这里我们可以想象一个可能发生的情况，服务器端向你发送一个消息，你没有成功接收，但是服务器端认为发送了就成功了，消息从队列删除了，然后这个消息就永久丢失掉了。可能有人会强调TCP多么可靠，服务器端发送的消息如果在TCP的层面发生问题了，肯定会引发Socket级别的Exception，这个Exception冒泡上来，服务器端就能截获，从而得知发送失败，然后先不删除队首消息。可是别忘了，中间是可能存在代理的，如果代理成功把消息收回去了，可是代理发送到客户端这一步失败了，服务器端就不一定会发生异常了。</p>
<p>因此，我们需要制定一种策略，来确保下行消息总能发送到客户端。在这里，我们选择了引入逐个ACK的机制，来确认消息的接收。也就是说，服务器端发送给客户端的消息带有一个序号，在客户端收到消息后就将该序号发回给服务器端，已确认它受到了该消息。在下次请求时就将该序号加1的值通过sequence参数传递回去，让服务器知道我们期望下一条消息的编号是这个。例如我们收到Message，其Sequence属性为836，那么下一次调用的时候就传给服务器837。服务器端此时应该保留了编号为836的Message在对首，如果客户端继续请求836号消息，证明它上次没收到，这次仍然发送836号消息给它；如果客户端请求837号消息，证明它成功收到836号消息的，这次就发送837号消息给它。看到这里是不是感觉有点熟悉了，不错，这有点类似经典的TCP三握手原理。如果都不是，那该怎么办？那意味着，这是一个错误的请求，甚至可能是攻击请求，因为正常情况下不应该出现这样的请求的，服务器端可以考虑抛个无关紧要的Exception（不要告诉攻击者你知道他在攻击了），甚至直接给个400 （bad request）的响应代号。</p></blockquote>
<p><strong>国外一个简单的聊天室例子：</strong><br />
我们需要4个文件:<br />
A file to exchange data (data.txt)<br />
A PHP script that will handle the persistent http request (backend.php)<br />
A HTML file that will load Javascript code and that will show the data coming from the server (index.html)<br />
The prototype library that will help us to write simple JS code</p>
<p><strong>服务端backend.php：</strong><br />
做2件事：<br />
Write into “data.txt” when new messages are sent<br />
Do an infinite loop as long as “data.txt” file is unchanged</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: #00008b;">$filename</span><span style="color: Gray;">&nbsp; = </span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;">/data.txt</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp; </span><span style="color: #ffa500;">// store new message in the file</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: #00008b;">$msg</span><span style="color: Gray;"> = </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> ? </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> : </span><span style="color: #8b0000;">''</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$msg</span><span style="color: Gray;"> != </span><span style="color: #8b0000;">''</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">file_put_contents</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Gray;">,</span><span style="color: #00008b;">$msg</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">die</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: #ffa500;">// infinite loop until the data file is not modified</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: #00008b;">$lastmodif</span><span style="color: Gray;">&nbsp; &nbsp; = </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">timestamp</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> ? </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">timestamp</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> : </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: #00008b;">$currentmodif</span><span style="color: Gray;"> = </span><span style="color: Blue;">filemtime</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$currentmodif</span><span style="color: Gray;"> &lt;= </span><span style="color: #00008b;">$lastmodif</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// check if the data file has been modified</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">usleep</span><span style="color: Olive;">(</span><span style="color: Maroon;">10000</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// sleep 10ms to unload the CPU</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">clearstatcache</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$currentmodif</span><span style="color: Gray;"> = </span><span style="color: Blue;">filemtime</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: #ffa500;">// return a json array</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: #00008b;">$response</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: #00008b;">$response</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;= </span><span style="color: Blue;">file_get_contents</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: #00008b;">$response</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">timestamp</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$currentmodif</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: Blue;">json_encode</span><span style="color: Olive;">(</span><span style="color: #00008b;">$response</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Blue;">flush</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp; </span><span style="color: Blue;">?&gt;</span></div></div>
<p>客户端index.html：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Gray;"> </span><span style="color: #00008b;">PUBLIC</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-//W3C//DTD XHTML 1.1//EN</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Gray;"> </span><span style="color: #00008b;">xmlns</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.w3.org/1999/xhtml</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Comet demo</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">meta</span><span style="color: Gray;"> </span><span style="color: #00008b;">http-equiv</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-Type</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">content</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/html; charset=utf-8</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">prototype.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">content</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">form</span><span style="color: Gray;"> </span><span style="color: #00008b;">action</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">method</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">get</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">onsubmit</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">comet.doRequest($('word').value);$('word').value='';return false;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">word</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">word</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">submit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">submit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Send</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">form</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; var Comet = Class.create();<br />&nbsp; Comet.prototype = {<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;timestamp: 0,<br />&nbsp;&nbsp; &nbsp;url: './backend.php',<br />&nbsp;&nbsp; &nbsp;noerror: true,<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;initialize: function() { },<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;connect: function()<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp; &nbsp;this.ajax = new Ajax.Request(this.url, {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;method: 'get',<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;parameters: { 'timestamp' : this.timestamp },<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;onSuccess: function(transport) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// handle the server response<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var response = transport.responseText.evalJSON();<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.timestamp = response['timestamp'];<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.handleResponse(response);<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.noerror = true;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;},<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;onComplete: function(transport) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// send a new ajax request when this request is finished<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!this.comet.noerror)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if a connection problem occurs, try to reconnect each 5 seconds<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(function(){ comet.connect() }, 5000); <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.connect();<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.noerror = false;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp; &nbsp;});<br />&nbsp;&nbsp; &nbsp; &nbsp;this.ajax.comet = this;<br />&nbsp;&nbsp; &nbsp;},<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;disconnect: function()<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp;},<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;handleResponse: function(response)<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp; &nbsp;$('content').innerHTML += '</span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">' + response['msg'] + '</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">';<br />&nbsp;&nbsp; &nbsp;},<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;doRequest: function(request)<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp; &nbsp;new Ajax.Request(this.url, {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;method: 'get',<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;parameters: { 'msg' : request <br />&nbsp;&nbsp; &nbsp; &nbsp;});<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp; }<br />&nbsp; var comet = new Comet();<br />&nbsp; comet.connect();<br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></div></div>
<p>例子完整源码下载：<a href="http://www.zeitoun.net/_media/articles/comet_and_php/comet-ajax.tar.gz">down</a></p>
<p>你可以用浏览器打开多个index.html，你在其中一个页面提交的聊天内容同时也被推到其他的页面。<br />
这只是一个推的简单的例子，关于超时处理的相关功能就不贴了，自己研究。</p>
<blockquote><p>总之。ajax模拟http长连接就是在第一次ajax发出请求的时候，服务端一直在等待有更新的数据，当然在等待过程中你可以加入超时重新开始下一个轮询来降低服务器压力(见上面的核心图)。</p></blockquote>
<p><strong>参考文章：</strong><br />
 <a href="http://www.ibm.com/developerworks/cn/websphere/techjournal/0711_col_burckart/0711_col_burckart.html">Erik Burckart：Comet 的诱惑</a><br />
<a href="http://www.ibm.com/developerworks/cn/web/wa-lo-comet/">Comet：基于 HTTP 长连接的“服务器推”技术</a><br />
<a href="http://www.zeitoun.net/articles/comet_and_php/start">How to implement COMET with PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/comet-ajax-longpoll-push/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>偷google的验证密码强度(js)</title>
		<link>http://www.ieliwb.com/js-check-mima/</link>
		<comments>http://www.ieliwb.com/js-check-mima/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 11:05:23 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[密码强度]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=148</guid>
		<description><![CDATA[<img src="http://www.ieliwb.com/u/img/mima.png" alt="mima" />
Google把密码强度分为四等:
1. 密码长度小于或等于6位.或者密码只有一种组合
2. 密码长度大于6位, 且有两种组合.
3. 密码长度大于6位, 且有三种组合.
4. 密码长度大于6位, 且有四种组合.
如果没有输入则返回0
（四种组合指 数字,小写字母,大写字母,其它字符）[......]<p class='read-more'><a href='http://www.ieliwb.com/js-check-mima/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.ieliwb.com/u/img/mima.png" alt="mima" /><br />
Google把密码强度分为四等:<br />
1. 密码长度小于或等于6位.或者密码只有一种组合<br />
2. 密码长度大于6位, 且有两种组合.<br />
3. 密码长度大于6位, 且有三种组合.<br />
4. 密码长度大于6位, 且有四种组合.<br />
如果没有输入则返回0<br />
（四种组合指 数字,小写字母,大写字母,其它字符）<br />
关于安全说明：<a href="https://www.google.com/accounts/PasswordHelp">https://www.google.com/accounts/PasswordHelp</a></p>
<p>贴代码吧：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">HTML</span><span style="color: Gray;"> </span><span style="color: #00008b;">PUBLIC</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-//W3C//DTD HTML 4.0 Transitional//EN</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"> mima</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">table</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">tbody</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">密码：</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;&lt;</span><span style="color: Green;">input</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">pwd</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">onkeyup</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">CreateRatePasswdReq(this);</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">password</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"> </span><span style="color: Olive;">&lt;</span><span style="color: Green;">span</span><span style="color: Gray;"> </span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">FONT-FAMILY: arial,sans-serif</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">长度必须最少包含 6 个字符。</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">span</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">table</span><span style="color: Gray;"> </span><span style="color: #00008b;">cellSpacing</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">cellPadding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">border</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">tbody</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Gray;"> </span><span style="color: #00008b;">vAlign</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">top</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">noWrap</span><span style="color: Gray;"> </span><span style="color: #00008b;">width</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;</span><span style="color: Green;">font</span><span style="color: Gray;"> </span><span style="color: #00008b;">face</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Arial, sans-serif</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">size</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-1</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">密码强度： </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">font</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Gray;"> </span><span style="color: #00008b;">vAlign</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">top</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">noWrap</span><span style="color: Olive;">&gt;&lt;</span><span style="color: Green;">font</span><span style="color: Gray;"> </span><span style="color: #00008b;">face</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Arial, sans-serif</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">color</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#808080</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">size</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-1</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;</span><span style="color: Green;">strong</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">passwdRating</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">strong</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">font</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Gray;"> </span><span style="color: #00008b;">height</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">3</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Gray;"> </span><span style="color: #00008b;">colSpan</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">2</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">table</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">passwdBar</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">cellSpacing</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">cellPadding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">width</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">180</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">bgColor</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#ffffff</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">border</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">tbody</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">posBar</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">width</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0%</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">bgColor</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#e0e0e0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">height</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">4</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">negBar</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">width</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">100%</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">bgColor</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#e0e0e0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">height</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">4</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">tbody</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">table</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">tbody</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">table</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">tbody</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">table</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />var ratingMsgs = [&quot;太短&quot;,&quot;弱&quot;,&quot;一般&quot;,&quot;很好&quot;,&quot;极佳&quot;,&quot;未评级&quot;];<br />var ratingMsgColors = [&quot;#676767&quot;,&quot;#aa0033&quot;,&quot;#f5ac00&quot;,&quot;#6699cc&quot;,&quot;#008000&quot;,&quot;#676767&quot;];<br />var barColors = [&quot;#dddddd&quot;,&quot;#aa0033&quot;,&quot;#ffcc33&quot;,&quot;#6699cc&quot;,&quot;#008000&quot;,&quot;#676767&quot;];<br />&nbsp;<br />function CreateRatePasswdReq(pwd) {<br />&nbsp;&nbsp; &nbsp;if (!isBrowserCompatible) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return;<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;// if(!document.getElementById) return false;<br />&nbsp;&nbsp; &nbsp;// var pwd = document.getElementById(&quot;pwd&quot;);<br />&nbsp;&nbsp; &nbsp;if(!pwd) return false;&nbsp; <br />&nbsp;&nbsp; &nbsp;passwd=pwd.value;<br />&nbsp;&nbsp; &nbsp;var min_passwd_len = 6;&nbsp; <br />&nbsp;&nbsp; &nbsp;if (passwd.length </span><span style="color: Olive;">&lt;</span><span style="color: Gray;"> </span><span style="color: #00008b;">min_passwd_len</span><span style="color: Gray;">)&nbsp; {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">if</span><span style="color: Gray;"> (</span><span style="color: #00008b;">passwd</span><span style="color: Gray;">.</span><span style="color: #00008b;">length</span><span style="color: Gray;"> </span><span style="color: Olive;">&gt;</span><span style="color: Gray;"> 0) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DrawBar(0);<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ResetBar();<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//We need to escape the password now so it won't mess up with length test<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rating = checkPasswdRate(passwd);<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DrawBar(rating);<br />&nbsp;&nbsp; &nbsp;}<br />}<br />function getElement(name) {<br />&nbsp;&nbsp; &nbsp;if (document.all) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return document.all(name);<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;return document.getElementById(name);<br />}<br />&nbsp; <br />function DrawBar(rating) {<br />&nbsp;&nbsp; &nbsp;var posbar = getElement('posBar');<br />&nbsp;&nbsp; &nbsp;var negbar = getElement('negBar');<br />&nbsp;&nbsp; &nbsp;var passwdRating = getElement('passwdRating');<br />&nbsp;&nbsp; &nbsp;var barLength = getElement('passwdBar').width;<br />&nbsp;&nbsp; &nbsp;if (rating &gt;= 0 &amp;&amp; rating </span><span style="color: Olive;">&lt;</span><span style="color: Gray;">= </span><span style="color: #00008b;">4</span><span style="color: Gray;">) {&nbsp; //</span><span style="color: Green;">We</span><span style="color: Gray;"> </span><span style="color: #00008b;">successfully</span><span style="color: Gray;"> </span><span style="color: #00008b;">got</span><span style="color: Gray;"> </span><span style="color: #00008b;">a</span><span style="color: Gray;"> </span><span style="color: #00008b;">rating</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">posbar</span><span style="color: Gray;">.</span><span style="color: #00008b;">style</span><span style="color: Gray;">.</span><span style="color: #00008b;">width</span><span style="color: Gray;"> = </span><span style="color: #00008b;">barLength</span><span style="color: Gray;"> / </span><span style="color: #00008b;">4</span><span style="color: Gray;"> * </span><span style="color: #00008b;">rating</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">px</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">negbar</span><span style="color: Gray;">.</span><span style="color: #00008b;">style</span><span style="color: Gray;">.</span><span style="color: #00008b;">width</span><span style="color: Gray;"> = </span><span style="color: #00008b;">barLength</span><span style="color: Gray;"> / </span><span style="color: #00008b;">4</span><span style="color: Gray;"> * (</span><span style="color: #00008b;">4</span><span style="color: Gray;"> </span><span style="color: #00008b;">-</span><span style="color: Gray;"> </span><span style="color: #00008b;">rating</span><span style="color: Gray;">) + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">px</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;} </span><span style="color: #00008b;">else</span><span style="color: Gray;"> {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">posbar</span><span style="color: Gray;">.</span><span style="color: #00008b;">style</span><span style="color: Gray;">.</span><span style="color: #00008b;">width</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0px</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">negbar</span><span style="color: Gray;">.</span><span style="color: #00008b;">style</span><span style="color: Gray;">.</span><span style="color: #00008b;">width</span><span style="color: Gray;"> = </span><span style="color: #00008b;">barLength</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">px</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">rating</span><span style="color: Gray;"> = </span><span style="color: #00008b;">5</span><span style="color: Gray;">; // </span><span style="color: #00008b;">Not</span><span style="color: Gray;"> </span><span style="color: #00008b;">rated</span><span style="color: Gray;"> </span><span style="color: #00008b;">Rating</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">posbar</span><span style="color: Gray;">.</span><span style="color: #00008b;">style</span><span style="color: Gray;">.</span><span style="color: #00008b;">background</span><span style="color: Gray;"> = </span><span style="color: #00008b;">barColors</span><span style="color: Gray;">[</span><span style="color: #00008b;">rating</span><span style="color: Gray;">];<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">passwdRating</span><span style="color: Gray;">.</span><span style="color: #00008b;">innerHTML</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;font color='</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: #00008b;">ratingMsgColors</span><span style="color: Gray;">[</span><span style="color: #00008b;">rating</span><span style="color: Gray;">] + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">'&gt;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: #00008b;">ratingMsgs</span><span style="color: Gray;">[</span><span style="color: #00008b;">rating</span><span style="color: Gray;">] + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;/font&gt;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />}<br />&nbsp;&nbsp; <br />&nbsp; //</span><span style="color: Green;">Resets</span><span style="color: Gray;"> </span><span style="color: #00008b;">the</span><span style="color: Gray;"> </span><span style="color: #00008b;">password</span><span style="color: Gray;"> </span><span style="color: #00008b;">strength</span><span style="color: Gray;"> </span><span style="color: #00008b;">bar</span><span style="color: Gray;"> </span><span style="color: #00008b;">back</span><span style="color: Gray;"> </span><span style="color: #00008b;">to</span><span style="color: Gray;"> </span><span style="color: #00008b;">its</span><span style="color: Gray;"> </span><span style="color: #00008b;">initial</span><span style="color: Gray;"> </span><span style="color: #00008b;">state</span><span style="color: Gray;"> </span><span style="color: #00008b;">without</span><span style="color: Gray;"> </span><span style="color: #00008b;">any</span><span style="color: Gray;"> </span><span style="color: #00008b;">message</span><span style="color: Gray;"> </span><span style="color: #00008b;">showing</span><span style="color: Gray;">.<br /></span><span style="color: #00008b;">function</span><span style="color: Gray;"> </span><span style="color: #00008b;">ResetBar</span><span style="color: Gray;">() {<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">posbar</span><span style="color: Gray;"> = </span><span style="color: #00008b;">getElement</span><span style="color: Gray;">('</span><span style="color: #00008b;">posBar</span><span style="color: Gray;">');<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">negbar</span><span style="color: Gray;"> = </span><span style="color: #00008b;">getElement</span><span style="color: Gray;">('</span><span style="color: #00008b;">negBar</span><span style="color: Gray;">');<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">passwdRating</span><span style="color: Gray;"> = </span><span style="color: #00008b;">getElement</span><span style="color: Gray;">('</span><span style="color: #00008b;">passwdRating</span><span style="color: Gray;">');<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">barLength</span><span style="color: Gray;"> = </span><span style="color: #00008b;">getElement</span><span style="color: Gray;">('</span><span style="color: #00008b;">passwdBar</span><span style="color: Gray;">').</span><span style="color: #00008b;">width</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">posbar</span><span style="color: Gray;">.</span><span style="color: #00008b;">style</span><span style="color: Gray;">.</span><span style="color: #00008b;">width</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0px</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">negbar</span><span style="color: Gray;">.</span><span style="color: #00008b;">style</span><span style="color: Gray;">.</span><span style="color: #00008b;">width</span><span style="color: Gray;"> = </span><span style="color: #00008b;">barLength</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">px</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">passwdRating</span><span style="color: Gray;">.</span><span style="color: #00008b;">innerHTML</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />}<br />&nbsp;<br />/* </span><span style="color: #00008b;">Checks</span><span style="color: Gray;"> </span><span style="color: #00008b;">Browser</span><span style="color: Gray;"> </span><span style="color: #00008b;">Compatibility</span><span style="color: Gray;"> */<br /></span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">agt</span><span style="color: Gray;"> = </span><span style="color: #00008b;">navigator</span><span style="color: Gray;">.</span><span style="color: #00008b;">userAgent</span><span style="color: Gray;">.</span><span style="color: #00008b;">toLowerCase</span><span style="color: Gray;">();<br /></span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">is_op</span><span style="color: Gray;"> = (</span><span style="color: #00008b;">agt</span><span style="color: Gray;">.</span><span style="color: #00008b;">indexOf</span><span style="color: Gray;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">opera</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">) != </span><span style="color: #00008b;">-1</span><span style="color: Gray;">);<br /></span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">is_ie</span><span style="color: Gray;"> = (</span><span style="color: #00008b;">agt</span><span style="color: Gray;">.</span><span style="color: #00008b;">indexOf</span><span style="color: Gray;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">msie</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">) != </span><span style="color: #00008b;">-1</span><span style="color: Gray;">) &amp;&amp; </span><span style="color: #00008b;">document</span><span style="color: Gray;">.</span><span style="color: #00008b;">all</span><span style="color: Gray;"> &amp;&amp; !</span><span style="color: #00008b;">is_op</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">is_mac</span><span style="color: Gray;"> = (</span><span style="color: #00008b;">agt</span><span style="color: Gray;">.</span><span style="color: #00008b;">indexOf</span><span style="color: Gray;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">mac</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">) != </span><span style="color: #00008b;">-1</span><span style="color: Gray;">);<br /></span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">is_gk</span><span style="color: Gray;"> = (</span><span style="color: #00008b;">agt</span><span style="color: Gray;">.</span><span style="color: #00008b;">indexOf</span><span style="color: Gray;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">gecko</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">) != </span><span style="color: #00008b;">-1</span><span style="color: Gray;">);<br /></span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">is_sf</span><span style="color: Gray;"> = (</span><span style="color: #00008b;">agt</span><span style="color: Gray;">.</span><span style="color: #00008b;">indexOf</span><span style="color: Gray;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">safari</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">) != </span><span style="color: #00008b;">-1</span><span style="color: Gray;">);<br /></span><span style="color: #00008b;">function</span><span style="color: Gray;"> </span><span style="color: #00008b;">gff</span><span style="color: Gray;">(</span><span style="color: #00008b;">str</span><span style="color: Gray;">, </span><span style="color: #00008b;">pfx</span><span style="color: Gray;">) {<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">i</span><span style="color: Gray;"> = </span><span style="color: #00008b;">str</span><span style="color: Gray;">.</span><span style="color: #00008b;">indexOf</span><span style="color: Gray;">(</span><span style="color: #00008b;">pfx</span><span style="color: Gray;">);<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">if</span><span style="color: Gray;"> (</span><span style="color: #00008b;">i</span><span style="color: Gray;"> != </span><span style="color: #00008b;">-1</span><span style="color: Gray;">) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">v</span><span style="color: Gray;"> = </span><span style="color: #00008b;">parseFloat</span><span style="color: Gray;">(</span><span style="color: #00008b;">str</span><span style="color: Gray;">.</span><span style="color: #00008b;">substring</span><span style="color: Gray;">(</span><span style="color: #00008b;">i</span><span style="color: Gray;"> + </span><span style="color: #00008b;">pfx</span><span style="color: Gray;">.</span><span style="color: #00008b;">length</span><span style="color: Gray;">));<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">if</span><span style="color: Gray;"> (!</span><span style="color: #00008b;">isNaN</span><span style="color: Gray;">(</span><span style="color: #00008b;">v</span><span style="color: Gray;">)) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">v</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">null</span><span style="color: Gray;">;<br />}<br /></span><span style="color: #00008b;">function</span><span style="color: Gray;"> </span><span style="color: #00008b;">Compatible</span><span style="color: Gray;">() {<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">if</span><span style="color: Gray;"> (</span><span style="color: #00008b;">is_ie</span><span style="color: Gray;"> &amp;&amp; !</span><span style="color: #00008b;">is_op</span><span style="color: Gray;"> &amp;&amp; !</span><span style="color: #00008b;">is_mac</span><span style="color: Gray;">) {<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">var</span><span style="color: Gray;"> </span><span style="color: #00008b;">v</span><span style="color: Gray;"> = </span><span style="color: #00008b;">gff</span><span style="color: Gray;">(</span><span style="color: #00008b;">agt</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">msie </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">);<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">if</span><span style="color: Gray;"> (</span><span style="color: #00008b;">v</span><span style="color: Gray;"> != </span><span style="color: #00008b;">null</span><span style="color: Gray;">) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> (</span><span style="color: #00008b;">v</span><span style="color: Gray;"> </span><span style="color: Olive;">&gt;</span><span style="color: Gray;">= 6.0);<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;if (is_gk &amp;&amp; !is_sf) {<br />&nbsp;&nbsp; &nbsp; &nbsp;var v = gff(agt, &quot;rv:&quot;);<br />&nbsp;&nbsp; &nbsp; &nbsp;if (v != null) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return (v &gt;= 1.4);<br />&nbsp;&nbsp; &nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; v = gff(agt, &quot;galeon/&quot;);<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (v != null) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (v &gt;= 1.3);<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;if (is_sf) {<br />&nbsp;&nbsp; &nbsp; &nbsp;var v = gff(agt, &quot;applewebkit/&quot;);<br />&nbsp;&nbsp; &nbsp; &nbsp;if (v != null) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return (v &gt;= 124);<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;return false;<br />}<br />&nbsp; <br />/* We also try to create an xmlhttp object to see if the browser supports it */<br />var isBrowserCompatible = Compatible();<br />&nbsp;<br />//CharMode函数&nbsp; <br />//测试某个字符是属于哪一类.&nbsp; <br />function CharMode(iN){&nbsp; <br />&nbsp;&nbsp; &nbsp;if (iN&gt;=48 &amp;&amp; iN </span><span style="color: Olive;">&lt;</span><span style="color: Gray;">=</span><span style="color: #00008b;">57</span><span style="color: Gray;">) //</span><span style="color: Green;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">1</span><span style="color: Gray;">;&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">if</span><span style="color: Gray;"> (</span><span style="color: #00008b;">iN</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">=65 &amp;&amp; iN </span><span style="color: Olive;">&lt;</span><span style="color: Gray;">=</span><span style="color: #00008b;">90</span><span style="color: Gray;">) //</span><span style="color: Green;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">2</span><span style="color: Gray;">;&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">if</span><span style="color: Gray;"> (</span><span style="color: #00008b;">iN</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">=97 &amp;&amp; iN </span><span style="color: Olive;">&lt;</span><span style="color: Gray;">=</span><span style="color: #00008b;">122</span><span style="color: Gray;">) //</span><span style="color: Green;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">4</span><span style="color: Gray;">;&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">else</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">8</span><span style="color: Gray;">; //</span><span style="color: Green;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;">&nbsp; <br />}<br />//</span><span style="color: Green;">bitTotal</span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;">&nbsp; <br />//</span><span style="color: Green;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;">&nbsp; <br /></span><span style="color: #00008b;">function</span><span style="color: Gray;"> </span><span style="color: #00008b;">bitTotal</span><span style="color: Gray;">(</span><span style="color: #00008b;">num</span><span style="color: Gray;">){&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">modes</span><span style="color: Gray;">=</span><span style="color: #00008b;">0</span><span style="color: Gray;">;&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">for</span><span style="color: Gray;"> (</span><span style="color: #00008b;">i</span><span style="color: Gray;">=</span><span style="color: #00008b;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">i</span><span style="color: Gray;">&lt;</span><span style="color: Green;">4</span><span style="color: Gray;">;</span><span style="color: #00008b;">i</span><span style="color: Gray;">++){&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">if</span><span style="color: Gray;"> (</span><span style="color: #00008b;">num</span><span style="color: Gray;"> &amp; </span><span style="color: #00008b;">1</span><span style="color: Gray;">) </span><span style="color: #00008b;">modes</span><span style="color: Gray;">++;&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">num</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&gt;&gt;=1;&nbsp; <br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;return modes;&nbsp; <br />}<br />//checkStrong函数&nbsp; <br />//返回密码的强度级别&nbsp; <br />function checkPasswdRate(sPW){&nbsp; <br />&nbsp;&nbsp; &nbsp;if (sPW.length</span><span style="color: Olive;">&lt;</span><span style="color: Gray;">=</span><span style="color: #00008b;">4</span><span style="color: Gray;">)&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">0</span><span style="color: Gray;">; //</span><span style="color: Green;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">Modes</span><span style="color: Gray;">=</span><span style="color: #00008b;">0</span><span style="color: Gray;">;&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">for</span><span style="color: Gray;"> (</span><span style="color: #00008b;">i</span><span style="color: Gray;">=</span><span style="color: #00008b;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">i</span><span style="color: Gray;">&lt;</span><span style="color: Green;">sPW</span><span style="color: Gray;">.</span><span style="color: #00008b;">length</span><span style="color: Gray;">;</span><span style="color: #00008b;">i</span><span style="color: Gray;">++){&nbsp; <br />&nbsp;&nbsp; &nbsp;//</span><span style="color: Green;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;"></span><span style="color: #00008b;"></span><span style="color: Gray;">.&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">Modes</span><span style="color: Gray;">|=</span><span style="color: #00008b;">CharMode</span><span style="color: Gray;">(</span><span style="color: #00008b;">sPW</span><span style="color: Gray;">.</span><span style="color: #00008b;">charCodeAt</span><span style="color: Gray;">(</span><span style="color: #00008b;">i</span><span style="color: Gray;">));&nbsp; <br />&nbsp;&nbsp; &nbsp;}&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">bitTotal</span><span style="color: Gray;">(</span><span style="color: #00008b;">Modes</span><span style="color: Gray;">);&nbsp; <br />}<br />&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></div></div>
<p>直接复制上面html保存运行即可看到。<br />
google的演示地址：<a href="https://www.google.com/accounts/NewAccount?continue=https%3A%2F%2Fwww.google.com%2Faccounts%2FManageAccount&#038;followup=https%3A%2F%2Fwww.google.com%2Faccounts%2FManageAccount">go</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/js-check-mima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分享一个简单的点击图片进入下一页方法</title>
		<link>http://www.ieliwb.com/click-img-next/</link>
		<comments>http://www.ieliwb.com/click-img-next/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 10:32:06 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[CMS/BBS开源原创作品]]></category>
		<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[图片翻页]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=147</guid>
		<description><![CDATA[<blockquote><p>
实现方法很简单：<br />
1.修改CMS发布系统编辑器，在上传图片时自动加上 <strong>onclick=&#8221;gonext();&#8221; </strong><br />
2.修改CMS模板，在头部加上如下的<strong>JavaScript函数gonext</strong><br />
3.修改CMS程序分页部分代码，在生成的下一页链接时加上 <strong>id=&#8217;nexti[......]</strong></p></blockquote><p class='read-more'><a href='http://www.ieliwb.com/click-img-next/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p>
实现方法很简单：<br />
1.修改CMS发布系统编辑器，在上传图片时自动加上 <strong>onclick=&#8221;gonext();&#8221; </strong><br />
2.修改CMS模板，在头部加上如下的<strong>JavaScript函数gonext</strong><br />
3.修改CMS程序分页部分代码，在生成的下一页链接时加上 <strong>id=&#8217;nextid&#8217; </strong>
</p></blockquote>
<p>实现效果演示：http://aion.houdao.com/200909/26455.html</p>
<p>最近页面效果：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">HTML</span><span style="color: Gray;"> </span><span style="color: #00008b;">PUBLIC</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-//W3C//DTD HTML 4.0 Transitional//EN</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: #00008b;">language</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />function gonext()<br />{<br />&nbsp;&nbsp; &nbsp;var url=document.getElementById('nextid')?document.getElementById('nextid').href:'';<br />&nbsp;&nbsp; &nbsp;if(url==''){alert('当前最后一页');return;}<br />&nbsp;&nbsp; &nbsp;location.href=url;<br />}<br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">&lt;!-- 文章内容区 --&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Gray;"> </span><span style="color: #00008b;">align</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">center</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;</span><span style="color: Green;">img</span><span style="color: Gray;"> </span><span style="color: #00008b;">title</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">点击图片翻页</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">cursor: hand</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">onclick</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">gonext();</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://image.aaa.com/tu.jpg</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">&lt;!-- 翻页区 --&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Gray;"> </span><span style="color: #00008b;">align</span><span style="color: Gray;">='</span><span style="color: #00008b;">center</span><span style="color: Gray;">'</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">上一页</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">1</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">='</span><span style="color: #00008b;">26455_2</span><span style="color: Gray;">.</span><span style="color: #00008b;">html</span><span style="color: Gray;">'</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">2</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">='</span><span style="color: #00008b;">26455_3</span><span style="color: Gray;">.</span><span style="color: #00008b;">html</span><span style="color: Gray;">'</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">3</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">='</span><span style="color: #00008b;">26455_4</span><span style="color: Gray;">.</span><span style="color: #00008b;">html</span><span style="color: Gray;">'</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">4</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">='</span><span style="color: #00008b;">26455_5</span><span style="color: Gray;">.</span><span style="color: #00008b;">html</span><span style="color: Gray;">'</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">5</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">='</span><span style="color: #00008b;">nextid</span><span style="color: Gray;">' </span><span style="color: #00008b;">href</span><span style="color: Gray;">='</span><span style="color: #00008b;">26455_2</span><span style="color: Gray;">.</span><span style="color: #00008b;">html</span><span style="color: Gray;">'</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">下一页</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/click-img-next/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>js的时间戳和php的时间戳转换需要注意的地方</title>
		<link>http://www.ieliwb.com/js-php-timestamp/</link>
		<comments>http://www.ieliwb.com/js-php-timestamp/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 12:30:54 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[时间戳]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=137</guid>
		<description><![CDATA[<p>由PHP传入JS处理的时间戳我说怎么老是对不上号呢，原来JS时间戳为13位，包含3位毫秒的，而PHP只有10位不包含毫秒的。看来得补补基础了。</p>
<p>附我的一个解决Comment发表时间的函数：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">&#60;</span><span style="color: Blue;">script</span><span style="color: Gray;">&#62; <br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">nowtime</span><span style="color: Gray;"> = </span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Teal;">Date</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">getTime</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span><span style="color: #ffa500;">/*当前时[......]</span></div></div><p class='read-more'><a href='http://www.ieliwb.com/js-php-timestamp/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>由PHP传入JS处理的时间戳我说怎么老是对不上号呢，原来JS时间戳为13位，包含3位毫秒的，而PHP只有10位不包含毫秒的。看来得补补基础了。</p>
<p>附我的一个解决Comment发表时间的函数：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">&lt;</span><span style="color: Blue;">script</span><span style="color: Gray;">&gt; <br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">nowtime</span><span style="color: Gray;"> = </span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Teal;">Date</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">getTime</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span><span style="color: #ffa500;">/*当前时间戳*/</span><span style="color: Gray;"> <br /></span><span style="color: #ffa500;">/*转换时间，计算差值*/</span><span style="color: Gray;"> <br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">comptime</span><span style="color: Olive;">(</span><span style="color: Blue;">beginTime</span><span style="color: Gray;">,</span><span style="color: Blue;">endTime</span><span style="color: Olive;">){</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">secondNum</span><span style="color: Gray;"> = </span><span style="color: Blue;">parseInt</span><span style="color: Olive;">((</span><span style="color: Blue;">endTime</span><span style="color: Gray;">-</span><span style="color: Blue;">beginTime</span><span style="color: Gray;">*</span><span style="color: Maroon;">1000</span><span style="color: Olive;">)</span><span style="color: #8b0000;">/</span><span style="color: Red;">1000);</span><span style="color: #8b0000;">//</span><span style="color: Red;">计算时间戳差值&nbsp; &nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;if(secondNum&gt;=0&amp;&amp;secondNum&lt;60){ <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return secondNum+'秒前'; <br />&nbsp;&nbsp; &nbsp;} <br />&nbsp;&nbsp; &nbsp;else if (secondNum&gt;=60&amp;&amp;secondNum&lt;3600){ <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var nTime=parseInt(secondNum</span><span style="color: #8b0000;">/</span><span style="color: Maroon;">60</span><span style="color: Olive;">)</span><span style="color: Gray;">; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">nTime</span><span style="color: Gray;">+</span><span style="color: #8b0000;">'</span><span style="color: Red;">分钟前</span><span style="color: #8b0000;">'</span><span style="color: Gray;">; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">secondNum</span><span style="color: Gray;">&gt;=</span><span style="color: Maroon;">3600</span><span style="color: Gray;">&amp;&amp;</span><span style="color: Blue;">secondNum</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">3600</span><span style="color: Gray;">*</span><span style="color: Maroon;">24</span><span style="color: Olive;">){</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">nTime</span><span style="color: Gray;">=</span><span style="color: Blue;">parseInt</span><span style="color: Olive;">(</span><span style="color: Blue;">secondNum</span><span style="color: #8b0000;">/</span><span style="color: Red;">3600); <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return nTime+'小时前'; <br />&nbsp;&nbsp; &nbsp;} <br />&nbsp;&nbsp; &nbsp;else{ <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var nTime = parseInt(secondNum</span><span style="color: #8b0000;">/</span><span style="color: Maroon;">86400</span><span style="color: Olive;">)</span><span style="color: Gray;">; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">nTime</span><span style="color: Gray;">+</span><span style="color: #8b0000;">'</span><span style="color: Red;">天前</span><span style="color: #8b0000;">'</span><span style="color: Gray;">; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> <br />} <br /></span><span style="color: Blue;">t</span><span style="color: Gray;"> = </span><span style="color: Blue;">comptime</span><span style="color: Olive;">(</span><span style="color: Blue;">timestamp</span><span style="color: Gray;">,</span><span style="color: Blue;">nowtime</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//timestamp为PHP通过ajax回传的时间戳 </span><span style="color: Gray;"><br /></span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">t</span><span style="color: Olive;">)</span><span style="color: Gray;">; <br />&lt;</span><span style="color: #8b0000;">/</span><span style="color: Red;">script&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/js-php-timestamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>推荐2个抓包工具</title>
		<link>http://www.ieliwb.com/fetch-http-request/</link>
		<comments>http://www.ieliwb.com/fetch-http-request/#comments</comments>
		<pubDate>Thu, 21 May 2009 12:16:21 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[fiddler]]></category>
		<category><![CDATA[filebug]]></category>
		<category><![CDATA[抓包]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/?p=133</guid>
		<description><![CDATA[firebug : http://www.mozillaonline.com/
fiddler:http://www.fiddler2.com/fiddler2/

都很好用的。[......]<p class='read-more'><a href='http://www.ieliwb.com/fetch-http-request/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>firebug : http://www.mozillaonline.com/<br />
fiddler:http://www.fiddler2.com/fiddler2/</p>
<p>都很好用的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/fetch-http-request/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]深入研究让javascript跑得更快</title>
		<link>http://www.ieliwb.com/javascript-run-quick/</link>
		<comments>http://www.ieliwb.com/javascript-run-quick/#comments</comments>
		<pubDate>Wed, 20 May 2009 18:44:51 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/?p=122</guid>
		<description><![CDATA[下一代web应用让javascript和css得堪大用。我们会告诉你怎样使这些应用又快又灵。

建立了号称“Web 2.0”的应用，也实现了富内容（rich content）和交互，我们期待着css和javascript扮演更加重要的角色。为使应用干净利落，我们需要完善那些渲染页面的文件，优化其大小和形态，以确保提供最好的用户体验——在实践中，这就意味着一种结合：使内容尽可能小、下载尽可能快，同时避免对未改动资源不必要的重新获取。[......]<p class='read-more'><a href='http://www.ieliwb.com/javascript-run-quick/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>网络抄来抄去的，都不知道原文是谁写的。摘抄如下：<br />
下一代web应用让javascript和css得堪大用。我们会告诉你怎样使这些应用又快又灵。</p>
<p>建立了号称“Web 2.0”的应用，也实现了富内容（rich content）和交互，我们期待着css和javascript扮演更加重要的角色。为使应用干净利落，我们需要完善那些渲染页面的文件，优化其大小和形态，以确保提供最好的用户体验——在实践中，这就意味着一种结合：使内容尽可能小、下载尽可能快，同时避免对未改动资源不必要的重新获取。</p>
<p>由于css和js文件的形态，情况有点复杂。跟图片相比，其源代码很有可能频繁改动。而一旦改动，就需要客户端重新下载，使本地缓存无效（保存在其他缓存里的版本也是如此）。在这篇文章里，我们将着重探讨怎样使用户体验最快：包括初始页面的下载，随后页面的下载，以及随着应用渐进、内容变化而进行的资源下载。</p>
<p>我始终坚信这一点：对开发者来说，应该尽可能让事情变得简单。所以我们青睐于那些能让系统自动处理优化难题的方法。只需少许工作量，我们就能建立一举多得的环境：它使开发变得简单，有极佳的终端性能，也不会改变现有的工作方式。</p>
<p><strong>好大一沱</strong><br />
老的思路是，为优化性能，可以把多个css和js文件合并成极少数大文件。跟十个5k的js文件相比，合并成一个50k的文件更好。虽然代码总字节数没变，却避免了多个HTTP请求造成的开销。每个请求都会在客户端和服务器两边有个建立和消除的过程，导致请求和响应header带来开销，还有服务器端更多的进程和线程资源消耗（可能还有为压缩内容耗费的cpu时间）。</p>
<p>（除了HTTP请求，）并发问题也很重要。默认情况下，在使用持久连接（persistent connections）时，ie和firefox在同一域名内只会同时下载两个资源（在HTTP 1.1规格书中第8.1.4节的建议）（htmlor注：可以通过修改注册表等方法改变这一默认配置）。这就意味着，在我们等待下载2个js文件的同时，将无法下载图片资源。也就是说，这段时间内用户在页面上看不到图片。</p>
<p>（虽然合并文件能解决以上两个问题，）可是，这个方法有两个缺点。第一，把所有资源一起打包，将强制用户一次下载完所有资源。如果（不这么做，而是）把大块内容变成多个文件，下载开销就分散到了多个页面，同时缓解了会话中的速度压力（或完全避免了某些开销，这取决于用户选择的路径）。如果为了随后页面下载得更快而让初始页面下载得很慢，我们将发现更多用户根本不会傻等着再去打开下一个页面。</p>
<p>第二（这个影响更大，一直以来却没怎么被考虑过），在一个文件改动很频繁的环境里，如果采用单文件系统，那么每次改动文件都需要客户端把所有css和js重新下载一遍。假如我们的应用有个100k的合成的js大文件，任何微小的改动都将强制客户端把这100k再消化一遍。</p>
<p><strong>分解之道</strong><br />
（看来合并成大文件不太合适。）替代方案是个折中的办法：把css和js资源分散成多个子文件，按功能划分、保持文件个数尽可能少。这个方案也是有代价的，虽说开发时代码分散成逻辑块（logical chunks）能提高效率，可在下载时为提高性能还得合并文件。不过，只要给build系统（把开发代码变成产品代码的工具集，是为部署准备的）加点东西，就没什么问题了。</p>
<p>对于有着不同开发和产品环境的应用来说，用些简单的技术可以让代码更好管理。在开发环境下，为使条理清晰，代码可以分散为多个逻辑部分（logical components）。可以在Smarty（一种php模板语言）里建立一个简单的函数来管理javascript的下载：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">SMARTY</span><span style="color: Gray;">: </span></li>
<li><span style="color: Olive;">{</span><span style="color: Blue;">insert_js</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">files</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">foo.js,bar.js,baz.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">PHP</span><span style="color: Gray;">: </span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">smarty_insert_js</span><span style="color: Olive;">(</span><span style="color: #00008b;">$args</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">foreach</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">explode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">,</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$args</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">files</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$file</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;script type=</span><span style="color: Navy;">\&quot;</span><span style="color: Red;">text/javascript</span><span style="color: Navy;">\&quot;</span><span style="color: Red;"> SOURCE=</span><span style="color: Navy;">\&quot;</span><span style="color: Red;">/javascript/</span><span style="color: #00008b;">$file</span><span style="color: Navy;">\&quot;</span><span style="color: Red;">&gt;&lt;/script&gt;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">OUTPUT</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&lt;</span><span style="color: Blue;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">SOURCE</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/javascript/foo.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&gt;&lt;/</span><span style="color: Blue;">script</span><span style="color: Gray;">&gt; </span></li>
<li><span style="color: Gray;">&lt;</span><span style="color: Blue;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">SOURCE</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/javascript/bar.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&gt;&lt;/</span><span style="color: Blue;">script</span><span style="color: Gray;">&gt; </span></li>
<li><span style="color: Gray;">&lt;</span><span style="color: Blue;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">SOURCE</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/javascript/baz.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&gt;&lt;/</span><span style="color: Blue;">script</span><span style="color: Gray;">&gt;</span></li></ol></div>
<p>（htmlor注：wordpress中会把“src”替换成不知所谓的字符，因此这里只有写成“SOURCE”，使用代码时请注意替换，下同）</p>
<p>就这么简单。然后我们就命令build过程（build process）去把确定的文件合并起来。这个例子里，合并的是foo.js和bar.js，因为它们几乎总是一起下载。我们能让应用配置记住这一点，并修改模板函数去使用它。（代码如下：）</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">SMARTY</span><span style="color: Gray;">: </span></li>
<li><span style="color: Olive;">{</span><span style="color: Blue;">insert_js</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">files</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">foo.js,bar.js,baz.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">PHP</span><span style="color: Gray;">: </span></li>
<li><span style="color: #ffa500;"># 源文件映射图。在build过程合并文件之后用这个图找到js的源文件。 </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #00008b;">$GLOBALS</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">config</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">js_source_map</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">foo.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">&nbsp; &nbsp; =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">foobar.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">bar.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">&nbsp; &nbsp; =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">foobar.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">baz.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">&nbsp; &nbsp; =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">baz.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span></li>
<li><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">smarty_insert_js</span><span style="color: Olive;">(</span><span style="color: #00008b;">$args</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$GLOBALS</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">config</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">is_dev_site</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$files</span><span style="color: Gray;"> = </span><span style="color: Blue;">explode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">,</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$args</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">files</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$files</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">foreach</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">explode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">,</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$args</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">files</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$file</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$files</span><span style="color: Olive;">[</span><span style="color: #00008b;">$GLOBALS</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">config</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">js_source_map</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #00008b;">$file</span><span style="color: Olive;">]]</span><span style="color: Gray;">++; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$files</span><span style="color: Gray;"> = </span><span style="color: Blue;">array_keys</span><span style="color: Olive;">(</span><span style="color: #00008b;">$files</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">foreach</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$files</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$file</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;script type=</span><span style="color: Navy;">\&quot;</span><span style="color: Red;">text/javascript</span><span style="color: Navy;">\&quot;</span><span style="color: Red;"> SOURCE=</span><span style="color: Navy;">\&quot;</span><span style="color: Red;">/javascript/</span><span style="color: #00008b;">$file</span><span style="color: Navy;">\&quot;</span><span style="color: Red;">&gt;&lt;/script&gt;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">OUTPUT</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&lt;</span><span style="color: Blue;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">SOURCE</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/javascript/foobar.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&gt;&lt;/</span><span style="color: Blue;">script</span><span style="color: Gray;">&gt; </span></li>
<li><span style="color: Gray;">&lt;</span><span style="color: Blue;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">SOURCE</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/javascript/baz.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&gt;&lt;/</span><span style="color: Blue;">script</span><span style="color: Gray;">&gt;</span></li></ol></div>
<p>模板里的源代码没必要为了分别适应开发和产品阶段而改动，它帮助我们在开发时保持文件分散，发布成产品时把文件合并。想更进一步的话，可以把合并过程（merge process）写在php里，然后使用同一个（合并文件的）配置去执行。这样就只有一个配置文件，避免了同步问题。为了做的更加完美，我们还可以分析css和js文件在页面中同时出现的几率，以此决定合并哪些文件最合理（几乎总是同时出现的文件是合并的首选）。</p>
<p>对css来说，可以先建立一个主从关系的模型，它很有用。一个主样式表控制应用的所有样式表，多个子样式表控制不同的应用区域。采用这个方法，大多数页面只需下载两个css文件，而其中一个（指主样式表）在页面第一次请求时就会缓存。</p>
<p>对没有太多css和js资源的应用来说，这个方法在第一次请求时可能比单个大文件慢，但如果保持文件数量很少的话，你会发现其实它更快，因为每个页面的数据量更小。让人头疼的下载花销被分散到不同的应用区域，因此并发下载数保持在一个最小值，同时也使得页面的平均下载数据量很小。</p>
<p><strong>压缩</strong><br />
谈到资源压缩，大多数人马上会想到mod_gzip（但要当心，mod_gzip实际上是个魔鬼，至少能让人做恶梦）。它的原理很简单：浏览器请求资源时，会发送一个header表明自己能接受的内容编码。就像这样：</p>
<blockquote><p>
<?php Accept-Encoding: gzip,deflate
</p></blockquote>
<p>服务器遇到这样的header请求时，就用gzip或deflate压缩内容发往客户端，然后客户端解压缩。这过程减少了数据传输量，同时消耗了客户端和服务器的cpu时间。也算差强人意。但是，mod_gzip的工作方式是这样的：先在磁盘上创建一个临时文件，然后发送（给客户端），最后删除这个文件。在高容量的系统中，由于磁盘io问题，很快就会达到极限。要避免这种情况，可以改用mod_deflate（apache 2才支持）。它采用更合理的方式：在内存里做压缩。对于apache 1的用户来说，可以建立一块ram磁盘，让mod_gzip在它上面写临时文件。虽然没有纯内存方式快，但也不会比往磁盘上写文件慢。</p>
<p>话虽如此，其实还是有办法完全避免压缩开销的，那就是预压缩相关静态资源，下载时由mod_gzip提供合适的压缩版本。如果把压缩添加在build过程，它就很透明了。需要压缩的文件通常很少（用不着压缩图片，因为并不能减小更多体积），只有css和js文件（和其他未压缩的静态内容）。</p>
<p>配置选项会告诉mod_gzip去哪里找到预压缩过的文件。</p>
<blockquote><p>
<?php mod_gzip_can_negotiate    Yes<br />
mod_gzip_static_suffix    .gz<br />
AddEncoding    gzip    .gz
</p></blockquote>
<p>新一点的mod_gzip版本（从1.3.26.1a开始）添加一个额外的配置选项后，就能自动预压缩文件。不过在此之前，必须确认apache有正确的权限去创建和覆盖压缩文件。</p>
<blockquote><p>
<?php mod_gzip_update_static    Yes
</p></blockquote>
<p>可惜，事情没那么简单。某些Netscape 4的版本（尤其是4.06-4.08）认为自己能够解释压缩内容（它们发送一个header这么说来着），但其实它们不能正确的解压缩。大多数其他版本的Netscape 4在下载压缩内容时也有各种各样的问题。所以要在服务器端探测代理类型，（如果是Netscape 4，就要）让它们得到未压缩的版本。这还算简单的。ie（版本4-6）有些更有意思的问题：当下载压缩的javascript时，有时候ie会不正确的解压缩文件，或者解压缩到一半中断，然后把这半个文件显示在客户端。如果你的应用对javascript的依赖比较大（htmlor注：比如ajax应用），那么就得避免发送压缩文件给ie。在某些情况下，一些更老的5.x版本的ie倒是能正确的收到压缩的javascript，可它们会忽略这个文件的etag header，不缓存它。（thincat友情提示：尽管压缩存在一些浏览器不兼容的现象，由于这些不能很好的支持压缩的浏览器数量现在已经非常少了，我认为这种由于浏览器导致的压缩不正常的情况可以忽略不计。这些过时的浏览器还能不能在现在流行的windows或unix环境下面安装都存在不小的问题）</p>
<p>既然gzip压缩有这么多问题，我们不妨把注意力转到另一边：不改变文件格式的压缩。现在有很多这样的javascript压缩脚本可用，大多数都用一个正则表达式驱动的语句集来减小源代码的体积。它们做的不外乎几件事：去掉注释，压缩空格，缩短私有变量名和去掉可省略的语法。</p>
<p>不幸的是，大多数脚本效果并不理想，要么压缩率相当低，要么某种情形下会把代码搞得一团糟（或者两者兼而有之）。由于对解析树的理解不完整，压缩器很难区分一句注释和一句看似注释的引用字符串。因为闭合结构的混合使用，要用正则表达式发现哪些变量是私有的并不容易，因此一些缩短变量名的技术会打乱某些闭合代码。</p>
<p>还好有个压缩器能避免这些问题：dojo压缩器（现成的版本在这里）。它使用rhino（mozilla的javascript引擎，是用java实现的）建立一个解析树，然后将其提交给文件。它能很好的减小代码体积，仅用很小的成本：因为只在build时压缩一次。由于压缩是在build过程中实现的，所以一清二楚。（既然压缩没有问题了，）我们可以在源代码里随心所欲的添加空格和注释，而不必担心影响到产品代码。</p>
<p>与javascript相比，css文件的压缩相对简单一些。由于css语法里不会有太多引用字符串（通常是url路径跟字体名），我们可以用正则表达式大刀阔斧的干掉空格（htmlor注：这句翻的最爽，哈哈）。如果确实有引用字符串的话，我们总可以把一串空格合成一个（因为不需要在url路径和字体名里查找多个空格和tab）。这样的话，一个简单的perl脚本就够了：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: #ffa500;">#!/usr/bin/perl </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">my</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">''</span><span style="color: Gray;">; </span></li>
<li><span style="color: Blue;">open</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">F</span><span style="color: Gray;">, </span><span style="color: #00008b;">$ARGV</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;"> </span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: Green;">die</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Can't open source file: $!</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; </span></li>
<li><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$_</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">while</span><span style="color: Gray;"> &lt;</span><span style="color: Blue;">F</span><span style="color: Gray;">&gt;; </span></li>
<li><span style="color: Blue;">close</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">F</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #00008b;">$data</span><span style="color: Gray;"> =~ </span><span style="color: Blue;">s</span><span style="color: Gray;">!</span><span style="color: #ffa500;">/*(.*?)*/</span><span style="color: Gray;">!!</span><span style="color: Blue;">g</span><span style="color: Gray;">;&nbsp; </span><span style="color: #ffa500;"># 去掉注释 </span></li>
<li><span style="color: #00008b;">$data</span><span style="color: Gray;"> =~ </span><span style="color: Blue;">s</span><span style="color: Gray;">!</span><span style="color: Blue;">s</span><span style="color: Gray;">+! !</span><span style="color: Blue;">g</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #ffa500;"># 压缩空格 </span></li>
<li><span style="color: #00008b;">$data</span><span style="color: Gray;"> =~ </span><span style="color: Blue;">s</span><span style="color: Gray;">!} !}\</span><span style="color: Blue;">n</span><span style="color: Gray;">!</span><span style="color: Blue;">g</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #ffa500;"># 在结束大括号后添加换行 </span></li>
<li><span style="color: #00008b;">$data</span><span style="color: Gray;"> =~ </span><span style="color: Blue;">s</span><span style="color: Gray;">!\</span><span style="color: Blue;">n</span><span style="color: Gray;">$!!;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #ffa500;"># 删除最后一个换行 </span></li>
<li><span style="color: #00008b;">$data</span><span style="color: Gray;"> =~ </span><span style="color: Blue;">s</span><span style="color: Gray;">! </span><span style="color: Olive;">{</span><span style="color: Gray;"> ! </span><span style="color: Olive;">{</span><span style="color: Gray;">!</span><span style="color: Blue;">g</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #ffa500;"># 去除开始大括号后的空格 </span></li>
<li><span style="color: #00008b;">$data</span><span style="color: Gray;"> =~ </span><span style="color: Blue;">s</span><span style="color: Gray;">!; </span><span style="color: Olive;">}</span><span style="color: Gray;">!</span><span style="color: Olive;">}</span><span style="color: Gray;">!</span><span style="color: Blue;">g</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;"># 去除结束大括号前的空格</span></li></ol></div>
<p>print $data;然后，就可以把单个的css文件传给脚本去压缩了。命令如下：</p>
<blockquote><p>
<?php perl compress.pl site.source.css > site.compress.css
</p></blockquote>
<p>做完这些简单的纯文本优化工作后，我们就能减少数据传输量多达50%了（这个量取决于你的代码格式，可能更多）。这带来了更快的用户体验。不过我们真正想做的是，尽可能避免用户请求的发生——除非确实有必要。这下HTTP缓存知识派上用场了。</p>
<p><strong>缓存是好东西</strong><br />
当用户代理（如浏览器）向服务器请求一个资源时，第一次请求过后它就会缓存服务器的响应，以避免重复之后的相同请求。缓存时间的长短取决于两个因素：代理的配置和服务器的缓存控制header。所有浏览器都有不同的配置选项和处理方式，但大多数都会把一个资源至少缓存到会话结束（除非被明确告知）。</p>
<p>为了不让浏览器缓存改动频繁的页面，你很可能已经发送过header不缓存动态内容。在php中，以下两行命令可以做到：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control: private</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control: no-cache</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>听起来太简单了？确实如此——因为有些代理（浏览器）在某些环境下将忽略这些header。要确保浏览器不缓存文档，应该更强硬一些：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: #ffa500;"># 让它在过去就“失效” </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Expires: Mon, 26 Jul 1997 05:00:00 GMT</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;"># 永远是改动过的 </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Last-Modified: </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: Blue;">gmdate</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">D, d M Y H:i:s</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> GMT</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;"># HTTP/1.1 </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control: no-store, no-cache, must-revalidate</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control: post-check=0, pre-check=0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;"># HTTP/1.0 </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Pragma: no-cache</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>这样，对于我们不想缓存的内容来说已经行了。但对于那些不会每次请求时都有改动的内容，应该鼓励浏览器更霸道的缓存它。“If-Modified-Since”请求header能够做到这点。如果客户端在请求中发送一个“If-Modified-Since”header，apache（或其他服务器）会以状态代码304（没改过）响应，告诉浏览器缓存已经是最新的。使用这个机制，能够避免重复发送文件给浏览器，不过仍然导致了一个HTTP请求的消耗。嗯，再想想。</p>
<p>与If-Modified-Since机制类似的是实体标记（entity tags）。在apache环境下，每个对静态文件的响应都会发出一个“ETag”header，它包含了一个由文件修改时间、文件大小和inode号生成的校验和（checksum）。在下载文件之前，浏览器会发送一个HEAD请求去检查文件的etag。可ETag跟If-Modified-Since有同样的问题：客户端仍旧需要执行HTTP请求来验证本地缓存是否有效。</p>
<p>此外，如果你使用多台服务器提供内容，得小心使用if-modified-since和etags。在两台负载平衡的服务器环境下，对一个代理（浏览器）来说，一个资源可以这次从A服务器得到，下次从B服务器得到（htmlor注：lvs负载平衡系统就是个典型的例子）。这很好，也是采用平衡负载的原因。可是，如果两台服务器给同一个文件生成了不同的etag或者文件修改日期，浏览器就无所适从了（每次都会重新下载）。默认情况下，etag是由文件的inode号生成的，而多台服务器之间文件的inode号是不同的。可以使用apache的配置选项关掉它：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">FileETag</span><span style="color: Gray;"> </span><span style="color: Blue;">MTime</span><span style="color: Gray;"> </span><span style="color: Blue;">Size</span></li></ol></div>
<p>使用这个选项，apache将只用文件修改日期和文件大小来决定etag。很不幸，这导致了另一个问题（一样能影响if-modified-since）。既然etag依赖于修改时间，就得让时间同步。可往多台服务器上传文件时，上传时间差个一到两秒是常有的事。这样一来，两台服务器生成的etag还是不一样。当然，我们还可以改变配置，让etag的生成只取决于文件大小，但这就意味着如果文件内容变了而大小没变，etag也不会变。这可不行。</p>
<p><strong>缓存真是个好东西</strong><br />
看来我们正从错误的方向入手解决问题。（现在的问题是，）这些可能的缓存策略导致了一件事情反复发生，那就是：客户端向服务器查询本地缓存是否最新。假如服务器在改动文件的时候通知客户端，客户端不就知道它的缓存是最新的了（直到接到下一次通知）？可惜天公不做美——（事实）是客户端向服务器发出请求。</p>
<p>其实，也不尽然。在获取js或css文件之前，客户端会用< script >或
<link>标记向服务器发送一个请求，说明哪个页面要加载这些文件。这时候就可以用服务器的响应来通知客户端这些文件有了改动。有点含糊，说得再详细点就是：如果改变css和js文件内容的同时，也改变它们的文件名，就可以告诉客户端对url全都永久缓存——因为每个url都是唯一的。</p>
<p>假如能确定一个资源永不更改，我们就可以发出一些霸气十足的缓存header（htmlor注：这句也很有气势吧）。在php里，两行就好：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Expires: </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: Blue;">gmdate</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">D, d M Y H:i:s</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">time</span><span style="color: Olive;">()</span><span style="color: Gray;">+</span><span style="color: Maroon;">315360000</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> GMT</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control: max-age=315360000</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>我们告诉浏览器这个内容在10年后（10年大概会有315,360,000秒，或多或少）过期，浏览器将会保留它10年。当然，很有可能不用php输出css和js文件（因此就不能发出header），这种情况将在稍后说明。</p>
<p><strong>人力有时而穷</strong><br />
当文件内容更改时，手动去改文件名是很危险的。假如你改了文件名，模板却没有指向它？假如你改了一些模板另一些却没改？假如你改了模板却没改文件名？还有最糟的，假如你改动了文件却忘了改名或者忘了改变对它的引用？最好的结果，是用户看到老的而看不到新的内容。最坏的结果，是找不到文件，网站没法运转了。听起来这（指改动文件内容时修改url）似乎是个馊主意。</p>
<p>幸运的是，计算机做这类事情——当某种变化发生，需要相当准确地完成的、重复重复再重复的（htmlor注：番茄鸡蛋伺候～）、枯燥乏味的工作——总是十分在行。</p>
<p>这个过程（改变文件的url）没那么痛苦，因为我们根本不需要改文件名。资源的url和磁盘上文件的位置也没必要保持一致。使用apache的mod_rewrite模块，可以建立简单的规则，让确定的url重定向到确定的文件。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">RewriteEngine</span><span style="color: Gray;"> </span><span style="color: Blue;">on</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">RewriteRule</span><span style="color: Gray;"> ^/</span><span style="color: Olive;">(</span><span style="color: Gray;">.*.</span><span style="color: Olive;">)</span><span style="color: Blue;">v</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Gray;">-</span><span style="color: Maroon;">9</span><span style="color: Gray;">.</span><span style="color: Olive;">]</span><span style="color: Gray;">+.</span><span style="color: Olive;">(</span><span style="color: Blue;">css</span><span style="color: Gray;">|</span><span style="color: Blue;">js</span><span style="color: Gray;">|</span><span style="color: Blue;">gif</span><span style="color: Gray;">|</span><span style="color: Blue;">png</span><span style="color: Gray;">|</span><span style="color: Blue;">jpg</span><span style="color: Olive;">)</span><span style="color: Gray;">$&nbsp; &nbsp; /$</span><span style="color: Maroon;">1</span><span style="color: Gray;">$</span><span style="color: Maroon;">2</span><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">[</span><span style="color: Blue;">L</span><span style="color: Olive;">]</span></li></ol></div>
<p>这条规则匹配任何带有指定扩展名同时含有“版本”信息（version nugget）的url，它会把这些url重定向到一个不含版本信息的路径。如下所示：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">URL</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: Blue;">Path</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">images</span><span style="color: Gray;">/</span><span style="color: Blue;">foo</span><span style="color: Gray;">.</span><span style="color: Blue;">v2</span><span style="color: Gray;">.</span><span style="color: Blue;">gif</span><span style="color: Gray;">&nbsp; &nbsp; -&gt; /</span><span style="color: Blue;">images</span><span style="color: Gray;">/</span><span style="color: Blue;">foo</span><span style="color: Gray;">.</span><span style="color: Blue;">gif</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">css</span><span style="color: Gray;">/</span><span style="color: Blue;">main</span><span style="color: Gray;">.</span><span style="color: Blue;">v1</span><span style="color: Maroon;">.27</span><span style="color: Gray;">.</span><span style="color: Blue;">css</span><span style="color: Gray;">&nbsp; &nbsp; -&gt; /</span><span style="color: Blue;">css</span><span style="color: Gray;">/</span><span style="color: Blue;">main</span><span style="color: Gray;">.</span><span style="color: Blue;">css</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">javascript</span><span style="color: Gray;">/</span><span style="color: Blue;">md5</span><span style="color: Gray;">.</span><span style="color: Blue;">v6</span><span style="color: Gray;">.</span><span style="color: Blue;">js</span><span style="color: Gray;">&nbsp; &nbsp; -&gt; /</span><span style="color: Blue;">javascript</span><span style="color: Gray;">/</span><span style="color: Blue;">md5</span><span style="color: Gray;">.</span><span style="color: Blue;">js</span></li></ol></div>
<p>使用这条规则，就可以做到不改变文件路径而更改url（因为版本号变了）。由于url变了，浏览器就认为它是另一个资源（会重新下载）。想更进一步的话，可以把我们之前说的脚本编组函数结合起来，根据需要生成一个带有版本号的< script >标记列表。</p>
<p>说到这里，你可能会问我，为什么不在url结尾加一个查询字符串（query string）呢（如/css/main.css?v=4）？根据HTTP缓存规格书所说，用户代理对含有查询字符串的url永不缓存。虽然ie跟firefox忽略了这点，opera和safari却没有——为了确保所有浏览器都缓存你的资源，还是不要在url里用查询字符串的好。</p>
<p>现在不移动文件就能更改url了，如果能让url自动更新就更好了。在小型的产品环境下（如果有大型的产品环境，就是开发环境了），使用模板功能可以很轻易的实现这点。这里用的是smarty，用其他模板引擎也行。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">SMARTY</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&lt;</span><span style="color: Blue;">link</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">xhref</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">{version xsrc='/css/group.css'}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">rel</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stylesheet</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/css</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> /&gt; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">PHP</span><span style="color: Gray;">: </span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">smarty_version</span><span style="color: Olive;">(</span><span style="color: #00008b;">$args</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #00008b;">$stat</span><span style="color: Gray;"> = </span><span style="color: Blue;">stat</span><span style="color: Olive;">(</span><span style="color: #00008b;">$GLOBALS</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">config</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">site_root</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #00008b;">$args</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">src</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #00008b;">$version</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$stat</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">mtime</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">preg_replace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">!.([a-z]+?)$!</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.v</span><span style="color: #00008b;">$version</span><span style="color: Red;">.$1</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #00008b;">$args</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">src</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">; </span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">OUTPUT</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&lt;</span><span style="color: Blue;">link</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">xhref</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/css/group.v1234567890.css</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">mce_href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/css/group.v1234567890.css</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">rel</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stylesheet</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/css</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> /&gt;</span></li></ol></div>
<p>对每个链接到的资源文件，我们得到它在磁盘上的路径，检查它的mtime（文件最后修改的日期和时间），然后把这个时间当作版本号插入到url中。对于低流量的站点（它们的stat操作开销不大）或者开发环境来说，这个方案不错，但对于高容量的环境就不适用了——因为每次stat操作都要磁盘读取（导致服务器负载升高）。</p>
<p>解决方案相当简单。在大型系统中每个资源都已经有了一个版本号，就是版本控制的修订号（你们应该使用了版本控制，对吧？）。当我们建立站点准备部署的时候，可以轻易的查到每个文件的修订号，写在一个静态配置文件里。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: #00008b;">$GLOBALS</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">config</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">resource_versions</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">/images/foo.gif</span><span style="color: #8b0000;">'</span><span style="color: Gray;">&nbsp; &nbsp; =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">2.1</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">/css/main.css</span><span style="color: #8b0000;">'</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">1.27</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">/javascript/md5.js</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">'</span><span style="color: Red;">6.1.4</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span></li>
<li><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>当我们发布产品时，可以修改模板函数来使用版本号。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">smarty_version</span><span style="color: Olive;">(</span><span style="color: #00008b;">$args</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$GLOBALS</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">config</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">is_dev_site</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$stat</span><span style="color: Gray;"> = </span><span style="color: Blue;">stat</span><span style="color: Olive;">(</span><span style="color: #00008b;">$GLOBALS</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">config</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">site_root</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #00008b;">$args</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">src</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$version</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$stat</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">mtime</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$version</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$GLOBALS</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">config</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">resource_versions</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #00008b;">$args</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">src</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]]</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">preg_replace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">!.([a-z]+?)$!</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.v</span><span style="color: #00008b;">$version</span><span style="color: Red;">.$1</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #00008b;">$args</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">src</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">; </span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>就这样，不需要改文件名，也不需要记住改了哪些文件——当文件有新版本发布时它的url就会自动更新——有意思吧？我们就快搞定了。</p>
<p><strong>只欠东风</strong><br />
之前谈到为静态文件发送超长周期（very-long-period）的缓存header时曾说过，如果不用php输出，就不能轻易的发送缓存header。很显然，有两个办法可以解决：用php输出，或者让apache来做。</p>
<p>php出马，手到擒来。我们要做的仅仅是改变rewrite规则，把静态文件指向php脚本，用php在输出文件内容之前发送header。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">Apache</span><span style="color: Gray;">: </span></li>
<li><span style="color: Blue;">RewriteRule</span><span style="color: Gray;"> ^/</span><span style="color: Olive;">(</span><span style="color: Gray;">.*.</span><span style="color: Olive;">)</span><span style="color: Blue;">v</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Gray;">-</span><span style="color: Maroon;">9</span><span style="color: Gray;">.</span><span style="color: Olive;">]</span><span style="color: Gray;">+.</span><span style="color: Olive;">(</span><span style="color: Blue;">css</span><span style="color: Gray;">|</span><span style="color: Blue;">js</span><span style="color: Gray;">|</span><span style="color: Blue;">gif</span><span style="color: Gray;">|</span><span style="color: Blue;">png</span><span style="color: Gray;">|</span><span style="color: Blue;">jpg</span><span style="color: Olive;">)</span><span style="color: Gray;">$&nbsp; /</span><span style="color: Blue;">redir</span><span style="color: Gray;">.</span><span style="color: Blue;">php</span><span style="color: Gray;">?</span><span style="color: Blue;">path</span><span style="color: Gray;">=$</span><span style="color: Maroon;">1</span><span style="color: Gray;">$</span><span style="color: Maroon;">2</span><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">[</span><span style="color: Blue;">L</span><span style="color: Olive;">]</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">PHP</span><span style="color: Gray;">: </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Expires: </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: Blue;">gmdate</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">D, d M Y H:i:s</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">time</span><span style="color: Olive;">()</span><span style="color: Gray;">+</span><span style="color: Maroon;">315360000</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> GMT</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control: max-age=315360000</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;"># 忽略带有“..”的路径 </span></li>
<li><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">preg_match</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">!..!</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: Blue;">path</span><span style="color: Olive;">])){</span><span style="color: Gray;"> </span><span style="color: Blue;">go_404</span><span style="color: Olive;">()</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;"># 保证路径开头是确定的目录 </span></li>
<li><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">preg_match</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">!^(javascript|css|images)!</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: Blue;">path</span><span style="color: Olive;">])){</span><span style="color: Gray;"> </span><span style="color: Blue;">go_404</span><span style="color: Olive;">()</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;"># 文件不存在？ </span></li>
<li><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">file_exists</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: Blue;">path</span><span style="color: Olive;">])){</span><span style="color: Gray;"> </span><span style="color: Blue;">go_404</span><span style="color: Olive;">()</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;"># 发出一个文件类型header </span></li>
<li><span style="color: #00008b;">$ext</span><span style="color: Gray;"> = </span><span style="color: Blue;">array_pop</span><span style="color: Olive;">(</span><span style="color: Blue;">explode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: Blue;">path</span><span style="color: Olive;">]))</span><span style="color: Gray;">; </span></li>
<li><span style="color: Green;">switch</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ext</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">case</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">css</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: text/css</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">break</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">case</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">js</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> : </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">break</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">case</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">gif</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: image/gif</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">break</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">case</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">jpg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: image/jpeg</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">break</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">case</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">png</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: image/png</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">break</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">default</span><span style="color: Gray;">: </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: text/plain</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;"># 输出文件内容 </span></li>
<li><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">implode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">''</span><span style="color: Gray;">, </span><span style="color: Blue;">file</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: Blue;">path</span><span style="color: Olive;">]))</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">go_404</span><span style="color: Olive;">(){</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">HTTP/1.0 404 File not found</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">exit</span><span style="color: Gray;">; </span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>这个方案有效，但并不出色。（因为）跟apache相比，php需要更多内存和执行时间。另外，我们还得小心防止可能由path参数传递伪造值引起的exploits。为避免这些问题，应该用apache直接发送header。rewrite规则语句允许当规则匹配时设置环境变量（environment variable），当给定的环境变量设置后，Header命令就可以添加header。结合以下两条语句，我们就把rewrite规则和header设置绑定在了一起：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> </span><span style="color: Blue;">RewriteEngine</span><span style="color: Gray;"> </span><span style="color: Blue;">on</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">RewriteRule</span><span style="color: Gray;"> ^/</span><span style="color: Olive;">(</span><span style="color: Gray;">.*.</span><span style="color: Olive;">)</span><span style="color: Blue;">v</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Gray;">-</span><span style="color: Maroon;">9</span><span style="color: Gray;">.</span><span style="color: Olive;">]</span><span style="color: Gray;">+.</span><span style="color: Olive;">(</span><span style="color: Blue;">css</span><span style="color: Gray;">|</span><span style="color: Blue;">js</span><span style="color: Gray;">|</span><span style="color: Blue;">gif</span><span style="color: Gray;">|</span><span style="color: Blue;">png</span><span style="color: Gray;">|</span><span style="color: Blue;">jpg</span><span style="color: Olive;">)</span><span style="color: Gray;">$ /$</span><span style="color: Maroon;">1</span><span style="color: Gray;">$</span><span style="color: Maroon;">2</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">[</span><span style="color: Blue;">L</span><span style="color: Gray;">,</span><span style="color: Blue;">E</span><span style="color: Gray;">=</span><span style="color: Blue;">VERSIONED_FILE</span><span style="color: Gray;">:</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">Header</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">add</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Expires</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Mon, 28 Jul 2014 23:30:00 GMT</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">env</span><span style="color: Gray;">=</span><span style="color: Blue;">VERSIONED_FILE</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">Header</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">add</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">max-age=315360000</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Blue;">env</span><span style="color: Gray;">=</span><span style="color: Blue;">VERSIONED_FILE</span></li></ol></div>
<p>考虑到apache的执行顺序，应该把rewrite规则加在主配置文件（httpd.conf）而不是目录配置文件（.htaccess）中。否则在环境变量设置之前，header行会先执行（就那没意义了）。至于header行，则可以放在两文件任何一个当中，没什么区别。</p>
<p><strong>眼观六路</strong><br />
（htmlor注：多谢tchaikov告知“skinning rabbits”的含义，但我不想翻的太正式，眼下的这个应该不算太离谱吧。）</p>
<p>通过结合使用以上技术，我们可以建立一个灵活的开发环境和一个快速又高性能的产品环境。当然，这离终极目标“速度”还有一段距离。有许多更深层的技术（比如分离伺服静态内容，用多域名提升并发量等）值得我们关注，包括与我们谈到的方法（建立apache过滤器，修改资源url，加上版本信息）殊途同归的其他路子。你可以留下评论，告诉我们那些你正在使用的卓有成效的技术和方法。</p>
<p>引用地址：http://www.xufeng.org/?action=show&#038;id=30</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/javascript-run-quick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone主题在线DIY小程序，主题生成程序思路解密</title>
		<link>http://www.ieliwb.com/iphone-maker-diyonline/</link>
		<comments>http://www.ieliwb.com/iphone-maker-diyonline/#comments</comments>
		<pubDate>Wed, 20 May 2009 07:25:12 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[CMS/BBS开源原创作品]]></category>
		<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[iPhone/Mac/ObjectC]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[主题]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/?p=101</guid>
		<description><![CDATA[<img src="http://www.ieliwb.com/u/img/iphonethememake.jpg" alt="iphonethememaker" title="iphonethememaker" width="443" height="80" class="alignnone size-full wp-image-108" />
<strong>程序简介：</strong>
<a href="http://www.myiphones.com.cn/theme/">iPhone主题</a>在线DIY程序前端采用jquery框架打造，基于AJAX原理来实现异步处理数据。后端服务器基于PHP5+MySQL5提供交互支持和素材库的读取支持。在完成DIY的基础上进一步提高了对javascript的理解。[......]<p class='read-more'><a href='http://www.ieliwb.com/iphone-maker-diyonline/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.ieliwb.com/u/img/iphonethememake.jpg" alt="iphonethememaker" title="iphonethememaker" width="443" height="80" class="alignnone size-full wp-image-108" /><br />
<strong>程序简介：</strong><br />
<a href="http://www.myiphones.com.cn/theme/">iPhone主题</a>在线DIY程序前端采用jquery框架打造，基于AJAX原理来实现异步处理数据。后端服务器基于PHP5+MySQL5提供交互支持和素材库的读取支持。在完成DIY的基础上进一步提高了对javascript的理解。</p>
<p><strong>效果图：</strong><br />
<img src="http://www.ieliwb.com/u/img/iphone_theme_make.jpg" alt="iphone_theme" title="iphone_theme" width="670" height="467" class="alignnone size-full wp-image-102" /></p>
<p>像不像画的图啊，其实是DIV+CSS写的。DIY过程更像是在操作iPhone手机。嘿嘿。 </p>
<p><strong>已完成及正在完成的功能： </strong><br />
1.ICON路径等入库<br />
2.生成ZIP文件下载<br />
3.网友上传文件入库，格式转换png<br />
4.与DEDECMS主题频道的接口<br />
5.解剖已发主题内置ICON并入库<br />
6.与通行证的接口（未完成）<br />
就目前的形式看，程序估计要扼杀在摇篮里。衰&#8230;&#8230;</p>
<p><strong>基本思路提示：</strong><br />
代码就不发了，说下思路。首先根据素材库选择主题图标，点击生成按钮将获取所有图标的ID和地址，接着PHP开始上场，根据提交过来的图标地址和ID，开始获取所有图标，并压缩生成ZIP文件，再根据手机主题的编码方式生成主题。在这过程中同步生成缩略图，并发布到主题频道下载。</p>
<p><strong>目前几个主题在线生成网站：</strong><br />
www.moxiu.com<br />
www.qzhuti.com<br />
www.ownskin.com<br />
思路都差不多。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/iphone-maker-diyonline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>抛弃验证码&#8211;照样可以拒绝机器人</title>
		<link>http://www.ieliwb.com/can-remove-checked-code/</link>
		<comments>http://www.ieliwb.com/can-remove-checked-code/#comments</comments>
		<pubDate>Mon, 18 May 2009 10:25:49 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[机器人]]></category>
		<category><![CDATA[验证码]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/?p=87</guid>
		<description><![CDATA[<p><img src="http://www.ieliwb.com/u/img/captcha.jpg" alt="check" title="check" width="504" height="191" class="alignnone size-full wp-image-88" /><br />
看到上面之类的验证码，估计很多人的评论欲望都没有了吧，<a href="http://cn.engadget.com/2008/09/02/15-bt-captcha/" target="_blank">这里还有更多呢！都是超级变态型的！</a></p>
<p>验证码作为防止表单垃圾信息普遍采用的方法，一直被广泛使用。但是同时它造成了很不好的用户体验，为合法用户的正常操作带来不便。本文介绍了一种抛弃使用验证码的方法，来防止自动程序进行垃圾信息的提交。<br />
原文链接：（h[......]</p><p class='read-more'><a href='http://www.ieliwb.com/can-remove-checked-code/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.ieliwb.com/u/img/captcha.jpg" alt="check" title="check" width="504" height="191" class="alignnone size-full wp-image-88" /><br />
看到上面之类的验证码，估计很多人的评论欲望都没有了吧，<a href="http://cn.engadget.com/2008/09/02/15-bt-captcha/" target="_blank">这里还有更多呢！都是超级变态型的！</a></p>
<p>验证码作为防止表单垃圾信息普遍采用的方法，一直被广泛使用。但是同时它造成了很不好的用户体验，为合法用户的正常操作带来不便。本文介绍了一种抛弃使用验证码的方法，来防止自动程序进行垃圾信息的提交。<br />
原文链接：（http://15daysofjquery.com/examples/contact-forms/），简单试验了一下效果不错。</p>
<p><strong>原理：</strong><br />
核心部分就是在页面被载入时，采用AJAX动态创建一个特定的隐藏表单元素（姑且叫令牌吧），该元素只有在真正用户访问时才会存在，对于自动化的“机器人”来说是不存在的。通过客户端提交的隐藏表单的令牌和服务器端的对比来验证是否机器人。</p>
<blockquote><p>
1、当表单被载入后，我们创建一个到PHP文件的AJAX调用；<br />
2、该PHP文件将取得当前时间（依靠服务器，并不是访问者的浏览器）；<br />
3、该PHP文件将结合时间戳，加上一个加密的字（用户自定义的一个字符串——译者注），产生一个32位的“哈希”并把它作为cookie存储到访问者的浏览器上；<br />
4、jQuery将接收这个从AJAX调用来的时间戳信息，并将该哈希值或“令牌”作为表单的隐藏标签而存储；<br />
5、当该表单为处理而被发送，这个时间戳的值（表单中的——译者注）将和存储在cookie中的32位字符“令牌”做比较；<br />
6、如果信息不匹配，或是丢失，又或者时间戳过期，我们将终止表单处理的执行，同时这个垃圾邮件发送者将会把目标转移到另一个简单的猎物上（放弃我们这个目标——译者注）。</p></blockquote>
<p><strong>实战演习：</strong><br />
核心就3个文件：<br />
1.前端提交发表页面：demo.htm<br />
2.产生令牌页面：token.php<br />
3.提交处理页面：test.php</p>
<p><strong>1.前端提交发表页面：demo.htm</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">提交页面</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jquery.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">$(document).ready(function(){</span></li>
<li><span style="color: Gray;">$.get(&quot;token.php&quot;,function(txt){</span></li>
<li><span style="color: Gray;">&nbsp; $(&quot;.secure&quot;).append('</span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">hidden</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">ts</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">'+txt+'</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;">');</span></li>
<li><span style="color: Gray;">});</span></li>
<li><span style="color: Gray;">});</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">form</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">action</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">method</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">post</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">secure</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; Name:</span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">name</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">submit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Submit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Submit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">form</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>这里用jQuery实现AJAX，在页面加载完毕后从token.php获取“令牌”,相当于获取验证码图片。<br />
上面的令牌从下面的文件获取token.php</p>
<p><strong>2.产生令牌页面：token.php</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: #00008b;">$token</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">REQUEST_TIME</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: #ffa500;">//把时间戳与自定义字符串（我这里用的'ieliwb'）拼接后进行md5加密，并存入cookie</span></li>
<li><span style="color: #ffa500;">//参数0说明该cookie随浏览器关闭而失效 </span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">setcookie</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">token</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Blue;">md5</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">ieliwb</span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: #00008b;">$token</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">/</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">//在产生“令牌”时可以加上防止缓存的代码</span></li>
<li><span style="color: #ffa500;"># 'Expires' in the past</span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Expires: Mon, 26 Jul 1997 05:00:00 GMT</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: #ffa500;"># Always modified</span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Last-Modified: </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: Blue;">gmdate</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">D, d M Y H:i:s</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> GMT</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: #ffa500;"># HTTP/1.1</span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control: no-store, no-cache, must-revalidate</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control: post-check=0, pre-check=0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: #ffa500;"># HTTP/1.0</span></li>
<li><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Pragma: no-cache</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: #ffa500;">//输出到隐藏的表单</span></li>
<li><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$token</span><span style="color: Gray;">; </span></li>
<li><span style="color: Blue;">?&gt;</span></li></ol></div>
<p><strong>3.提交处理页面：test.php</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">&lt;?php</span></li>
<li><span style="color: #00008b;">$proceed</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">$seconds</span><span style="color: Gray;"> = </span><span style="color: Maroon;">60</span><span style="color: Gray;">*</span><span style="color: Maroon;">10</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//令牌有效时间</span></li>
<li><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_POST</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">ts</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_COOKIE</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">token</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: #00008b;">$_COOKIE</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">token</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: Blue;">md5</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">ieliwb</span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: #00008b;">$_POST</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">ts</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]))</span></li>
<li><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$proceed</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: #00008b;">$proceed</span><span style="color: Olive;">)</span></li>
<li><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">die</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">令牌错误！</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">if(!isset($_POST['ts']) || empty($_POST['ts'])) {</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; die('你是机器人吧');</span></li>
<li><span style="color: #ffa500;">}</span></li>
<li><span style="color: #ffa500;">if(!isset($_COOKIE['token'])) {</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; die('父令牌丢失');</span></li>
<li><span style="color: #ffa500;">}</span></li>
<li><span style="color: #ffa500;">if(md5('ieliwb'.$_POST['ts']) != $_COOKIE['token']) {</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; die('令牌错误');</span></li>
<li><span style="color: #ffa500;">}</span></li>
<li><span style="color: #ffa500;">*/</span></li>
<li><span style="color: Green;">if</span><span style="color: Olive;">(((</span><span style="color: Blue;">int</span><span style="color: Olive;">)</span><span style="color: #00008b;">$_POST</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">ts</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> + </span><span style="color: #00008b;">$seconds</span><span style="color: Olive;">)</span><span style="color: Gray;"> &lt; </span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">REQUEST_TIME</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span></li>
<li><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">die</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">令牌已失效</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;h1&gt;Testing:&lt;/h1&gt;&lt;p&gt;Cookie: </span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: #00008b;">$_COOKIE</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">token</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;br /&gt;Timestamp: </span><span style="color: #8b0000;">'</span><span style="color: Gray;">. </span><span style="color: #00008b;">$_POST</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">ts</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;/p&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;h1&gt;Success!&lt;/h1&gt;&lt;br /&gt;Here is what you sent:</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">print_r</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_POST</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">?&gt;</span></li></ol></div>
<p>到此全部ALL了，测试吧！不过验证码也不是毫无用处，比如可以为那些手动提交垃圾信息的人带来阻碍等。大家可以尝试一下，具体情况当然还得具体对待:)，不过图片验证码用户体验确实不好，下篇我将介绍简单的计算运算验证码。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/can-remove-checked-code/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
