﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-asfman-文章分类-javascript</title><link>http://www.cnitblog.com/asfman/category/2127.html</link><description>有些事，我们明知道是错的，也要去坚持，因为不甘心；有些人，我们明知道是爱的，也要去放弃，因为没结局；有时候，我们明知道没路了，却还在前行，因为习惯了。</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 13:40:02 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 13:40:02 GMT</pubDate><ttl>60</ttl><item><title>Trimpath</title><link>http://www.cnitblog.com/asfman/articles/68019.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Tue, 10 Aug 2010 10:05:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/68019.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/68019.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/68019.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/68019.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/68019.html</trackback:ping><description><![CDATA[<font  face="song, Verdana" size="4"><span  style="border-collapse: collapse; font-size: 14px; line-height: 22px;"><span  style="border-collapse: separate; font-family: Arial; font-size: 12px; line-height: 18px; "><div class="tit" style="font-family: Arial; font-size: 14px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; line-height: 18px; font-weight: bold; overflow-x: hidden; overflow-y: hidden; ">使用模板引擎Trimpath</div><table style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-collapse: collapse; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; table-layout: fixed; width: 960px; "><tbody style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><tr style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="font-family: Arial; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; line-height: 18px; "><div id="blog_text" class="cnt" style="font-family: Arial; font-size: 14px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; word-break: normal; visibility: visible !important; zoom: 1 !important; filter: none; line-height: 20px; color: rgb(51, 51, 51); overflow-x: hidden; overflow-y: hidden; position: static; "><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">使用模板引擎，让开发模式更清晰，也让职责更明确，对维护对开发都是一件双赢的事情。</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">曾经接触过SmartTemplate和Velocity，如果纯从编写前端模板来说，都不是太难的事情，大部分流行的模板引擎都支持类似的语法，如Smarty以及本文要介绍的JS模板引擎Trimpath。</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">如果一个项目，需要前端大量的重绘数据来展现，大量的DOM树会随用户的操作而产生变化，这时，无论从功能上，还是性能上，以及维护的方便性上，Trimpath template都是一个不错的选择。唯一遗憾的是，已经有近2年的时间没有更新了，是没有bug还是作者已经放弃掉了都不得而知。因为是好的东西，就不管那么多了。</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "><strong style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">Trimpath支持的语法：</strong></p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">1）<strong style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">变量声明</strong></p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">{var yihui = '一回'}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">${yihui} // 一回</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "><br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">2）<strong style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">变量（表达式）调节器</strong></p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">Trimpath的变量调节器是可以扩展的，在使用上和Smarty几乎看不出区别：<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{var yihui = '&lt;hr /&gt;'}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">${yihui|escape|capitalize} // &amp;LT;HR /&amp;GT;</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">Trimpath默认支持以下调节器：capitalize，escape（h），default，eat。同时支持表达式的调节，如：<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">${new Date()|toFormat:'YYYY-MM-DD'}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">你也可以根据自己的需要进行扩展，上面的toFormat就是自定义的。</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "><br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">3）<strong style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">条件控制</strong></p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">{var yihui = 'b'}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{if yihui == 'a'}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${yihui}等于a<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{else}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${yihui}不等于a<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{/if}</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "><br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">4）<strong style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">循环控制</strong></p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">假设数据为：<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">var datas = [<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp; {'type' : 'market', 'name' : '市场基金', 'value' : 102.44},<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{'type' : 'channel', 'name' : '渠道基金', 'value' : 54},<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{'type' : 'customer', 'name' : '客服考核', 'value' : 98}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">];</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">模板可以这样写：<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&lt;table width="400" cellspacing="0" cellpadding="0" border="1"&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{for x in datas}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;${x.type}&lt;/td&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;${x.name}&lt;/td&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;${x.value}&lt;/td&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{forelse}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp; &lt;tr&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;没有数据&lt;/td&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{/for}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&lt;/table&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">这样书写，是不是要比字符串拼接更直观，维护也方便呢？</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "><br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">5）<strong style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">支持宏定义</strong></p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">宏可以理解为能够完成一定功能的函数，将通用的功能组织起来，有利于代码复用：<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{macro htmlList(list, optionalListType)}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp; {var listType = optionalListType != null ? optionalListType : "ul"}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp; &lt;${listType}&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {for item in list}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;${item}&lt;/li&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {/for}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp; &lt;/${listType}&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{/macro}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; "><br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">${htmlList([1,2,3], 'ol')}</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "><br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">6）<strong style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">CDATA区域</strong></p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">CDATA区域的内容将不被Trimpath解析，会原样输出<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{cdata}hello,${yihui}{/cdata}</p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "><br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">7）<strong style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">内联JS代码</strong></p><p style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; ">eval区域内可以直接书写JS代码：<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&lt;select onchange="sel_onchange()"&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp; &lt;option value="1"&gt;1&lt;/option&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp; &lt;option value="2"&gt;2&lt;/option&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&lt;/select&gt;<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{eval}<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp; sel_onchange = function() {<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert('我不小心被change了');<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">&nbsp;&nbsp; }<br style="font-family: 'Microsoft Yahei', 微软雅黑, 雅黑, Tahoma, 宋体, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; ">{/eval}</p></div></td></tr></tbody></table></span></span></font><img src ="http://www.cnitblog.com/asfman/aggbug/68019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2010-08-10 18:05 <a href="http://www.cnitblog.com/asfman/articles/68019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改title</title><link>http://www.cnitblog.com/asfman/articles/66371.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Thu, 27 May 2010 10:01:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/66371.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/66371.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/66371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/66371.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/66371.html</trackback:ping><description><![CDATA[ie不能通过document.getElementById("xxx").innerHTML = "xxx"来改变title 会出现runtime error<br>其他游览器都可以。<div>通用改变title得用document.title = "xxxx";</div><div>fk ie</div><img src ="http://www.cnitblog.com/asfman/aggbug/66371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2010-05-27 18:01 <a href="http://www.cnitblog.com/asfman/articles/66371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jQuery 1.4 ：15个新特性实例精讲</title><link>http://www.cnitblog.com/asfman/articles/65857.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Thu, 06 May 2010 13:21:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/65857.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/65857.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/65857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/65857.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/65857.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. 传参给 jQuery(&#8230;)之前，jQuery可以通过&nbsp;attr&nbsp;方法设置元素的属性，既可传属性的名和值，也可以是包含几组特定 属性名值对 的 对象。在 jQuery 1.4 中，你可以把一个参数对象作为第二个参数传给 jQuery 函数本身，同时创建HTML元素。&nbsp;比方说你想要创建一个带有几个属性的锚记元素（&lt;a&gt;&lt;/a&gt;）。...&nbsp;&nbsp;<a href='http://www.cnitblog.com/asfman/articles/65857.html'>阅读全文</a><img src ="http://www.cnitblog.com/asfman/aggbug/65857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2010-05-06 21:21 <a href="http://www.cnitblog.com/asfman/articles/65857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Storage</title><link>http://www.cnitblog.com/asfman/articles/65608.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Sun, 25 Apr 2010 14:28:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/65608.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/65608.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/65608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/65608.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/65608.html</trackback:ping><description><![CDATA[<div><br></div><div>var LC = function(){</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>var store = null, engine = null;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>var searchOrder = ['localStorage', 'userData', 'globalStorage'];</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>var engines = {</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>localStorage:{</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>test:function(){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return window.localStorage ? true : false;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>init:function(){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>store = localStorage;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>get:function(key){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return store.getItem(key);</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>set:function(key,value){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return store.setItem(key,value);</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>del:function(key){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return store.removeItem(key);</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>globalStorage: {</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>test: function(){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return window.globalStorage ? true : false;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>init: function(){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>store = globalStorage[document.domain];</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>get: function(key){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return store.getItem(key).value;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>set: function(key, value){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return store.setItem(key, value);</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>del: function(key){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return store.removeItem(key);</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>userData:{</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>test:function(){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return window.ActiveXObject ? true : false;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>init:function(){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>store = document.documentElement;</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>store.addBehavior('#default#userdata');</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>get:function(key) {</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;store.load(key);</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return store.getAttribute(key);</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>set:function(key, value) {</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>store.load(key);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span> &nbsp; &nbsp; &nbsp; &nbsp;store.setAttribute(key, value);</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return store.save(key);</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>},</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>del:function(key) {</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>store.load(key);</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>store.expires = new Date(315532799000).toUTCString();</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>return store.save(key);</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>};</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>for(var i = 0,l = searchOrder.length, engine; i &lt; l; i ++){</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>engine = engines[searchOrder[i]];</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>if(engine.test()){</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>try{</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>engine.init();</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>break;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>}catch(ex){</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>engine = null;</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>if(engine){</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>delete engine.test;</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>delete engine.init;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>return engine;</div><div>}();</div>
<img src ="http://www.cnitblog.com/asfman/aggbug/65608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2010-04-25 22:28 <a href="http://www.cnitblog.com/asfman/articles/65608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为啥null == undefined 是true</title><link>http://www.cnitblog.com/asfman/articles/64001.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Tue, 26 Jan 2010 10:13:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/64001.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/64001.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/64001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/64001.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/64001.html</trackback:ping><description><![CDATA[<div>11.9.3 &nbsp;The Abstract Equality Comparison Algorithm</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;The comparison x == y, where x and y are values, produces true or false. Such a comparison is</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;performed as follows:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; 1. &nbsp;If Type(x) is the same as Type(y), then</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a. If Type(x) is Undefined, return true.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b. If Type(x) is Null, return true.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c. If Type(x) is Number, then</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i. If x is NaN, return false.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ii. If y is NaN, return false.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iii. If x is the same number value as y, return true.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iv. If x is +0 and y is 0, return true.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;v. If x is 0 and y is +0, return true.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vi. Return false.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d. If Type(x) is String, then return true if x and y are exactly the same sequence of characters</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(same length and same characters in corresponding positions). Otherwise, return false.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;false.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f. Return true if x and y refer to the same object. Otherwise, return false.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; 2. &nbsp;If x is null and y is undefined, return true.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; 3. &nbsp;If x is undefined and y is null, return true.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 75 -</div><div>4. &nbsp; If Type(x) is Number and Type(y) is String,</div><div>&nbsp;&nbsp; &nbsp; return the result of the comparison x == ToNumber(y).</div><div>5. If Type(x) is String and Type(y) is Number,</div><div>&nbsp;&nbsp; &nbsp; return the result of the comparison ToNumber(x) == y.</div><div>6. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.</div><div>7. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).</div><div>8. If Type(x) is either String or Number and Type(y) is Object,</div><div>&nbsp;&nbsp; &nbsp; return the result of the comparison x == ToPrimitive(y).</div><div>9. If Type(x) is Object and Type(y) is either String or Number,</div><div>&nbsp;&nbsp; &nbsp; return the result of the comparison ToPrimitive(x) == y.</div><div>10. Return false.</div><div>&nbsp;NOTE</div><div>&nbsp;Given the above definition of equality:</div><div>&nbsp;String comparison can be forced by: "" + a == "" + b.</div><div>&nbsp;Numeric comparison can be forced by: a - 0 == b - 0.</div><div>&nbsp;Boolean comparison can be forced by: !a == !b.</div><div>&nbsp;The equality operators maintain the following invariants:</div><div>&nbsp;A != B is equivalent to !(A == B).</div><div>&nbsp;A == B is equivalent to B == A, except in the order of evaluation of A and B.</div><div>&nbsp;The equality operator is not always transitive. For example, there might be two distinct String objects,</div><div>&nbsp;each representing the same string value; each String object would be considered equal to the string</div><div>&nbsp;value by the == operator, but the two String objects would not be equal to each other.</div><div>&nbsp;Comparison of strings uses a simple equality test on sequences of code unit values. There is no attempt</div><div>&nbsp;to use the more complex, semantically oriented definitions of character or string equality and collating</div><div>&nbsp;order defined in the Unicode specification. Therefore strings that are canonically equal according to the</div><div>&nbsp;Unicode standard could test as unequal. In effect this algorithm assumes that both strings are already in</div><div>&nbsp;normalised form.</div><div><br></div>
<img src ="http://www.cnitblog.com/asfman/aggbug/64001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2010-01-26 18:13 <a href="http://www.cnitblog.com/asfman/articles/64001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript作用域原理</title><link>http://www.cnitblog.com/asfman/articles/63076.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Wed, 09 Dec 2009 10:06:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/63076.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/63076.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/63076.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/63076.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/63076.html</trackback:ping><description><![CDATA[<span  style="font-family: Arial, Verdana, sans-serif; font-size: 14px; "><h2>问题的提出</h2><p>首先看一个例子:</p><pre class="sh_&lt;a href=" http:="" www.itstrike.cn="" home="" language="" javascript"="" title="javascript" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><strong>javascript</strong> sh_sourceCode"&gt;<span class="sh_keyword">var</span> name <span class="sh_symbol">=</span> <span class="sh_string">'laruence'</span><span class="sh_symbol">;</span><br><span class="sh_keyword">function</span> <span class="sh_function">echo</span><span class="sh_symbol">()</span> <span class="sh_cbracket">{</span><br>	<span class="sh_function">alert</span><span class="sh_symbol">(</span>name<span class="sh_symbol">);</span><br>	<span class="sh_keyword">var</span> name <span class="sh_symbol">=</span> <span class="sh_string">'eve'</span><span class="sh_symbol">;</span><br>	<span class="sh_function">alert</span><span class="sh_symbol">(</span>name<span class="sh_symbol">);</span><br>	<span class="sh_function">alert</span><span class="sh_symbol">(</span>age<span class="sh_symbol">);</span><br><span class="sh_cbracket">}</span><br><br><span class="sh_function">echo</span><span class="sh_symbol">();</span><br></pre><p>运行结果是什么呢?</p><p>上面的问题, 我相信会有很多人会认为是:</p><pre class="sh_shell" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; ">laruence<br>eve<br>[脚本出错]<br></pre><p>因为会以为在echo中, 第一次alert的时候, 会取到全局变量name的值, 而第二次值被局部变量name覆盖, 所以第二次alert是&#8217;eve&#8217;. 而age属性没有定义, 所以脚本会出错.</p><p>但其实, 运行结果应该是:</p><pre class="sh_shell" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; ">undefined<br>eve<br>[脚本出错]<br></pre><p>为什么呢?</p><h2>JavaScript的作用域链</h2><p>首先让让我们来看看Javasript(简称JS, 不完全代表JScript)的作用域的原理: JS权威指南中有一句很精辟的描述:　&#8221;JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.&#8221;</p><p>为了接下来的知识, 你能顺利理解, 我再提醒一下, 在JS中:&#8221;一切皆是对象, 函数也是&#8221;.</p><p>在JS中，作用域的概念和其他语言差不多， 在每次调用一个函数的时候 ，就会进入一个函数内的作用域，当从函数返回以后，就返回调用前的作用域.</p><p>JS的语法风格和C/C++类似, 但作用域的实现却和C/C++不同，并非用&#8220;堆栈&#8221;方式，而是使用列表，具体过程如下(ECMA262中所述):<br>任何执行上下文时刻的作用域, 都是由作用域链(scope chain, 后面介绍)来实现.<br>在一个函数被定义的时候, 会将它定义时刻的scope chain链接到这个函数对象的[[scope]]属性.<br>在一个函数对象被调用的时候，会创建一个活动对象(也就是一个对象), 然后对于每一个函数的形参，都命名为该活动对象的命名属性, 然后将这个活动对象做为此时的作用域链(scope chain)最前端, 并将这个函数对象的[[scope]]加入到scope chain中.</p><p>看个例子:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; ">	<span class="sh_keyword">var</span> func <span class="sh_symbol">=</span> <span class="sh_keyword">function</span><span class="sh_symbol">(</span>lps<span class="sh_symbol">,</span> rps<span class="sh_symbol">)</span><span class="sh_cbracket">{</span><br>		<span class="sh_keyword">var</span> name <span class="sh_symbol">=</span> <span class="sh_string">'laruence'</span><span class="sh_symbol">;</span><br>		<span class="sh_symbol">........</span><br>	<span class="sh_cbracket">}</span><br>	<span class="sh_function">func</span><span class="sh_symbol">();</span><br></pre><p>在执行func的定义语句的时候, 会创建一个这个函数对象的[[scope]]属性(内部属性,只有JS引擎可以访问, 但FireFox的几个引擎(SpiderMonkey和Rhino)提供了私有属性__parent__来访问它), 并将这个[[scope]]属性, 链接到定义它的作用域链上(后面会详细介绍), 此时因为func定义在全局环境, 所以此时的[[scope]]只是指向全局活动对象window active object.</p><p>在调用func的时候, 会创建一个活动对象(假设为aObj, 由JS引擎预编译时刻创建, 后面会介绍)，并创建arguments属性, 然后会给这个对象添加俩个命名属性aObj.lps, aObj.rps; 对于每一个在这个函数中申明的局部变量和函数定义, 都作为该活动对象的同名命名属性.</p><p>然后将调用参数赋值给形参数，对于缺少的调用参数，赋值为undefined。</p><p>然后将这个活动对象做为scope chain的最前端, 并将func的[[scope]]属性所指向的,定义func时候的顶级活动对象, 加入到scope china.</p><p>有了上面的作用域链, 在发生标识符解析的时候, 就会逆向查询当前scope chain列表的每一个活动对象的属性，如果找到同名的就返回。找不到，那就是这个标识符没有被定义。</p><p>注意到, 因为函数对象的[[scope]]属性是在定义一个函数的时候决定的, 而非调用的时候, 所以如下面的例子:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; ">	<span class="sh_keyword">var</span> name <span class="sh_symbol">=</span> <span class="sh_string">'laruence'</span><span class="sh_symbol">;</span><br>	<span class="sh_keyword">function</span> <span class="sh_function">echo</span><span class="sh_symbol">()</span> <span class="sh_cbracket">{</span><br>		<span class="sh_function">alert</span><span class="sh_symbol">(</span>name<span class="sh_symbol">);</span><br>	<span class="sh_cbracket">}</span><br><br>	<span class="sh_keyword">function</span> <span class="sh_function">env</span><span class="sh_symbol">()</span> <span class="sh_cbracket">{</span><br>		<span class="sh_keyword">var</span> name <span class="sh_symbol">=</span> <span class="sh_string">'eve'</span><span class="sh_symbol">;</span><br>		<span class="sh_function">echo</span><span class="sh_symbol">();</span><br>	<span class="sh_cbracket">}</span><br><br>	<span class="sh_function">env</span><span class="sh_symbol">();</span><br></pre><p>运行结果是:</p><pre class="sh_shell" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; ">laruence<br></pre><p>结合上面的知识, 我们来看看下面这个例子:</p><pre class="sh_php sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><span class="sh_keyword">function</span> <span class="sh_function">factory</span><span class="sh_symbol">()</span> <span class="sh_cbracket">{</span><br>	<span class="sh_keyword">var</span> name <span class="sh_symbol">=</span> <span class="sh_string">'laruence'</span><span class="sh_symbol">;</span><br>	<span class="sh_keyword">var</span> intro <span class="sh_symbol">=</span> <span class="sh_keyword">function</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span><br>		<span class="sh_function">alert</span><span class="sh_symbol">(</span><span class="sh_string">'I am '</span> <span class="sh_symbol">+</span> name<span class="sh_symbol">);</span><br>	<span class="sh_cbracket">}</span><br>	<span class="sh_keyword">return</span> intro<span class="sh_symbol">;</span><br><span class="sh_cbracket">}</span><br><br><span class="sh_keyword">function</span> <span class="sh_function">app</span><span class="sh_symbol">(</span>para<span class="sh_symbol">)</span><span class="sh_cbracket">{</span><br>	<span class="sh_keyword">var</span> name <span class="sh_symbol">=</span> para<span class="sh_symbol">;</span><br>	<span class="sh_keyword">var</span> func <span class="sh_symbol">=</span> <span class="sh_function">factory</span><span class="sh_symbol">();</span><br>	<span class="sh_function">func</span><span class="sh_symbol">();</span><br><span class="sh_cbracket">}</span><br><br><span class="sh_function">app</span><span class="sh_symbol">(</span><span class="sh_string">'eve'</span><span class="sh_symbol">);</span><br></pre><p>当调用app的时候, scope chain是由: {window活动对象(全局)}-&gt;{app的活动对象} 组成.</p><p>在刚进入app函数体时, app的活动对象有一个arguments属性, 俩个值为undefined的属性: name和func. 和一个值为&#8217;eve&#8217;的属性para;</p><p>此时的scope chain如下:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><span class="sh_symbol">[[</span>scope chain<span class="sh_symbol">]]</span> <span class="sh_symbol">=</span> <span class="sh_symbol">[</span><br><span class="sh_cbracket">{</span><br>	para <span class="sh_symbol">:</span> <span class="sh_string">'eve'</span><span class="sh_symbol">,</span><br>	name <span class="sh_symbol">:</span> <span class="sh_predef_var">undefined</span><span class="sh_symbol">,</span><br>	func <span class="sh_symbol">:</span> <span class="sh_predef_var">undefined</span><span class="sh_symbol">,</span><br>	<span class="sh_predef_var">arguments</span> <span class="sh_symbol">:</span> <span class="sh_symbol">[]</span><br><span class="sh_cbracket">}</span><span class="sh_symbol">,</span> <span class="sh_cbracket">{</span><br>	window call object<br><span class="sh_cbracket">}</span><br><span class="sh_symbol">]</span><br></pre><p>当调用进入factory的函数体的时候, 此时的factory的scope chain为:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><span class="sh_symbol">[[</span>scope chain<span class="sh_symbol">]]</span> <span class="sh_symbol">=</span> <span class="sh_symbol">[</span><br><span class="sh_cbracket">{</span><br>	name <span class="sh_symbol">:</span> <span class="sh_predef_var">undefined</span><span class="sh_symbol">,</span><br>	intor <span class="sh_symbol">:</span> <span class="sh_predef_var">undefined</span><br><span class="sh_cbracket">}</span><span class="sh_symbol">,</span> <span class="sh_cbracket">{</span><br>	window call object<br><span class="sh_cbracket">}</span><br><span class="sh_symbol">]</span><br></pre><p>注意到, 此时的作用域链中, 并不包含app的活动对象.</p><p>在定义intro函数的时候, intro函数的[[scope]]为:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><span class="sh_symbol">[[</span>scope chain<span class="sh_symbol">]]</span> <span class="sh_symbol">=</span> <span class="sh_symbol">[</span><br><span class="sh_cbracket">{</span><br>	name <span class="sh_symbol">:</span> <span class="sh_string">'laruence'</span><span class="sh_symbol">,</span><br>	intor <span class="sh_symbol">:</span> <span class="sh_predef_var">undefined</span><br><span class="sh_cbracket">}</span><span class="sh_symbol">,</span> <span class="sh_cbracket">{</span><br>	window call object<br><span class="sh_cbracket">}</span><br><span class="sh_symbol">]</span><br></pre><p>从factory函数返回以后,在app体内调用intor的时候, 发生了标识符解析, 而此时的sope chain是:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><span class="sh_symbol">[[</span>scope chain<span class="sh_symbol">]]</span> <span class="sh_symbol">=</span> <span class="sh_symbol">[</span><br><span class="sh_cbracket">{</span><br>	intro call object<br><span class="sh_cbracket">}</span><span class="sh_symbol">,</span> <span class="sh_cbracket">{</span><br>	name <span class="sh_symbol">:</span> <span class="sh_string">'laruence'</span><span class="sh_symbol">,</span><br>	intor <span class="sh_symbol">:</span> <span class="sh_predef_var">undefined</span><br><span class="sh_cbracket">}</span><span class="sh_symbol">,</span> <span class="sh_cbracket">{</span><br>	window call object<br><span class="sh_cbracket">}</span><br><span class="sh_symbol">]</span><br></pre><p>因为scope chain中,并不包含factory活动对象. 所以, name标识符解析的结果应该是factory活动对象中的name属性, 也就是&#8217;laruence&#8217;.</p><p>所以运行结果是:</p><pre class="sh_shell" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; ">I am laruence<br></pre><p>现在, 大家对&#8221;JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.&#8221;这句话, 应该有了个全面的认识了吧?</p><h2>Javascript的预编译</h2><p>我们都知道,JS是一种脚本语言, JS的执行过程, 是一种翻译执行的过程.<br>那么JS的执行中, 有没有类似编译的过程呢?</p><p>首先, 我们来看一个例子:</p><pre class="sh_php sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; ">	<span class="sh_symbol">&lt;</span>script<span class="sh_symbol">&gt;</span><br>	<span class="sh_function">alert</span><span class="sh_symbol">(</span>typeof eve<span class="sh_symbol">);</span> <span class="sh_comment">//function</span><br>		<span class="sh_keyword">function</span> <span class="sh_function">eve</span><span class="sh_symbol">()</span> <span class="sh_cbracket">{</span><br>			<span class="sh_function">alert</span><span class="sh_symbol">(</span><span class="sh_string">'I am Laruence'</span><span class="sh_symbol">);</span><br>		<span class="sh_cbracket">}</span><span class="sh_symbol">;</span><br>	<span class="sh_symbol">&lt;/</span>script<span class="sh_symbol">&gt;</span><br></pre><p>诶? 在alert的时候, eve不是应该还是未定义的么? 怎么eve的类型还是function呢?</p><p>恩, 对, 在JS中, 是有预编译的过程的, JS在执行每一段JS代码之前, 都会首先处理var关键字和function定义式(函数定义式和函数表达式).<br>如上文所说, 在调用函数执行之前, 会首先创建一个活动对象, 然后搜寻这个函数中的局部变量定义,和函数定义, 将变量名和函数名都做为这个活动对象的同名属性, 对于局部变量定义,变量的值会在真正执行的时候才计算, 此时只是简单的赋为undefined.</p><p>而对于函数的定义,是一个要注意的地方:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><span class="sh_symbol">&lt;</span>script<span class="sh_symbol">&gt;</span><br>	<span class="sh_function">alert</span><span class="sh_symbol">(</span><span class="sh_keyword">typeof</span> eve<span class="sh_symbol">);</span> <span class="sh_comment">//结果:function</span><br>	<span class="sh_function">alert</span><span class="sh_symbol">(</span><span class="sh_keyword">typeof</span> walle<span class="sh_symbol">);</span> <span class="sh_comment">//结果:undefined</span><br>	<span class="sh_keyword">function</span> <span class="sh_function">eve</span><span class="sh_symbol">()</span> <span class="sh_cbracket">{</span> <span class="sh_comment">//函数定义式</span><br>		<span class="sh_function">alert</span><span class="sh_symbol">(</span><span class="sh_string">'I am Laruence'</span><span class="sh_symbol">);</span><br>	<span class="sh_cbracket">}</span><span class="sh_symbol">;</span><br>	<span class="sh_keyword">var</span> walle <span class="sh_symbol">=</span> <span class="sh_keyword">function</span><span class="sh_symbol">()</span> <span class="sh_cbracket">{</span> <span class="sh_comment">//函数表达式</span><br>	<span class="sh_cbracket">}</span><br>	<span class="sh_function">alert</span><span class="sh_symbol">(</span><span class="sh_keyword">typeof</span> walle<span class="sh_symbol">);</span> <span class="sh_comment">//结果:function</span><br><span class="sh_symbol">&lt;/</span>script<span class="sh_symbol">&gt;</span><br></pre><p>这就是函数定义式和函数表达式的不同, 对于函数定义式, 会将函数定义提前. 而函数表达式, 会在执行过程中才计算.</p><p>说到这里, 顺便说一个问题 :</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; ">	<span class="sh_keyword">var</span> name <span class="sh_symbol">=</span> <span class="sh_string">'laruence'</span><span class="sh_symbol">;</span><br>	age <span class="sh_symbol">=</span> <span class="sh_number">26</span><span class="sh_symbol">;</span><br></pre><p>我们都知道不使用var关键字定义的变量, 相当于是全局变量, 联系到我们刚才的知识:</p><p>在对age做标识符解析的时候, 因为是写操作, 所以当找到到全局的window活动对象的时候都没有找到这个标识符的时候, 会在window活动对象的基础上, 返回一个值为undefined的age属性.</p><p>也就是说, age会被定义在顶级作用域中.</p><p>现在, 也许你注意到了我刚才说的: JS在执行<strong>每一段JS代码</strong>..<br>对, 让我们看看下面的例子:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><span class="sh_symbol">&lt;</span>script<span class="sh_symbol">&gt;</span><br>	<span class="sh_function">alert</span><span class="sh_symbol">(</span><span class="sh_keyword">typeof</span> eve<span class="sh_symbol">);</span> <span class="sh_comment">//结果:undefined</span><br><span class="sh_symbol">&lt;/</span>script<span class="sh_symbol">&gt;</span><br><span class="sh_symbol">&lt;</span>script<span class="sh_symbol">&gt;</span><br>	<span class="sh_keyword">function</span> <span class="sh_function">eve</span><span class="sh_symbol">()</span> <span class="sh_cbracket">{</span><br>		<span class="sh_function">alert</span><span class="sh_symbol">(</span><span class="sh_string">'I am Laruence'</span><span class="sh_symbol">);</span><br>	<span class="sh_cbracket">}</span><br><span class="sh_symbol">&lt;/</span>script<span class="sh_symbol">&gt;</span><br></pre><p>明白了么? 也就是JS的预编译是以段为处理单元的&#8230;</p><h2>揭开谜底</h2><p>现在让我们回到我们的第一个问题:</p><p>当echo函数被调用的时候, echo的活动对象已经被预编译过程创建, 此时echo的活动对象为:</p><pre class="sh_javascript sh_sourceCode" style="background-color: rgb(245, 245, 245); font-family: Consolas, Monaco, 'Liberation Mono', 'Lucida Console', monospace; font-size: 14px; margin-bottom: 10px; overflow-x: auto; overflow-y: auto; padding-left: 5px; padding-top: 5px; width: 1505px; "><span class="sh_symbol">[</span>callObj<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_cbracket">{</span><br>name <span class="sh_symbol">:</span> <span class="sh_predef_var">undefined</span><br><span class="sh_cbracket">}</span><br></pre><p>当第一次alert的时候, 发生了标识符解析, 在echo的活动对象中找到了name属性, 所以这个name属性, 完全的遮挡了全局活动对象中的name属性.</p><p>现在你明白了吧?</p></span>
<img src ="http://www.cnitblog.com/asfman/aggbug/63076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-12-09 18:06 <a href="http://www.cnitblog.com/asfman/articles/63076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>匹配&lt;xxx&gt;...&lt;/xxx&gt; &lt;xxx/&gt; ....的正则</title><link>http://www.cnitblog.com/asfman/articles/62800.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Tue, 24 Nov 2009 10:34:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/62800.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/62800.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/62800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/62800.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/62800.html</trackback:ping><description><![CDATA[&lt;script&gt;<br>var v = '要理 &gt; = &lt;的 &gt;话 要完美估计超复杂了 比如&lt;div on="的&lt;" on="的&gt;"&gt;1&gt;2dd&lt;dd&lt;/div&gt;等等&lt;div t=1/&gt;';<br>alert('result:'<br>+v.match(/(?:&lt;(\S+?)\s+(?:"[^"]*"|'[^']*'|[^"'&gt;&lt;])+&gt;.+?&lt;\/\1&gt;)|(?:&lt;\S+?\s+(?:"[^"]*"|'[^']*'|[^"'&gt;&lt;])+\/&gt;)|(?:(?!(?:&lt;(\S+?)\s+(?:"[^"]*"|'[^']*'|[^"'&gt;&lt;])+&gt;.+?&lt;\/\2&gt;|&lt;\S+?\s+(?:"[^"]*"|'[^']*'|[^"'&gt;&lt;])+\/&gt;))[\s\S])+/g)<br>);<br>&lt;/script&gt;<br><img src ="http://www.cnitblog.com/asfman/aggbug/62800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-11-24 18:34 <a href="http://www.cnitblog.com/asfman/articles/62800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS获取输入框当前光标左右文本(zt)</title><link>http://www.cnitblog.com/asfman/articles/61366.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Fri, 11 Sep 2009 03:31:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/61366.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/61366.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/61366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/61366.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/61366.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="color: #999999; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;">&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function getcursor() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var obj = document.getElementById("source");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var nStart = 0;//设置初始位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var nEnd = 0;//设置初始位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (obj.selectionStart) {// 非IE浏览器<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nStart = obj.selectionStart;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nEnd = obj.selectionEnd;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {//IE浏览器<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.focus();&nbsp;&nbsp;//输入框获得焦点,这句也不能少,不然后面会出错,血的教训啦<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var rngSel = document.selection.createRange();&nbsp;&nbsp;//创建文档选择对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var selText = rngSel.text;&nbsp;&nbsp;//当前选择的文本<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var rngTxt = obj.createTextRange();&nbsp;&nbsp;//创建输入框文本对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rngTxt.collapse(true);&nbsp;&nbsp;//将光标移到头<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rngTxt.select();&nbsp;&nbsp;//显示光标,这个不能少,不然的话,光标没有移到头<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var rngSelNew = document.selection.createRange();&nbsp;&nbsp;//为新的光标位置创建文档选择对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rngSel.setEndPoint('StartToStart', rngSelNew);&nbsp;&nbsp;//在以前的文档选择对象和新的对象之间创建对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var str = rngSel.text;&nbsp;&nbsp;//获得对象的文本<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var re = new RegExp("[\\r]", "g"); ////过滤掉换行符,不然你的文字会有问题,会比你的文字实际长度要长一些<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str = str.replace(re, "");&nbsp;&nbsp;//过滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nEnd = str.length;&nbsp;&nbsp;/获得长度.也就是光标的位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rngSel.collapse(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rngSel.select();&nbsp;&nbsp;//把光标恢复到以前的位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nStart = nEnd - selText.length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var objTarget = document.getElementById("target");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objTarget.value = obj.value.substr(0, nStart) + "\r\n\r\n" + obj.value.substr(nEnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br></span></span><span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="color: #999999; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;">原始字符串：<br>&lt;textarea id="source" cols="70" rows="10"&gt;&lt;/textarea&gt;<br>替换后的字符串：<br>&lt;textarea id="target" cols="70" rows="10"&gt;&lt;/textarea&gt;<br><br>&lt;input type="button" value="substr" onclick="javascript:getcursor();" /&gt;</span></span><br><img src ="http://www.cnitblog.com/asfman/aggbug/61366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-09-11 11:31 <a href="http://www.cnitblog.com/asfman/articles/61366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>addBookmark</title><link>http://www.cnitblog.com/asfman/articles/59957.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Thu, 09 Jul 2009 03:58:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/59957.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/59957.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/59957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/59957.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/59957.html</trackback:ping><description><![CDATA[function addBookmark(title,url) {<br>&nbsp;if (window.sidebar) {<br>&nbsp;window.sidebar.addPanel(title, url,"");<br>&nbsp;} else if( document.all ) {<br>&nbsp;window.external.AddFavorite( url, title);<br>&nbsp;} else if( window.opera &amp;&amp; window.print ) {<br>&nbsp;return true;<br>&nbsp;}<br>}<br><img src ="http://www.cnitblog.com/asfman/aggbug/59957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-07-09 11:58 <a href="http://www.cnitblog.com/asfman/articles/59957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>new [[Construct]]</title><link>http://www.cnitblog.com/asfman/articles/59769.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Wed, 01 Jul 2009 13:21:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/59769.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/59769.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/59769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/59769.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/59769.html</trackback:ping><description><![CDATA[[[Construct]]<br>When the [[Construct]] property for a Function object F is called, the following steps are taken:<br>1. Create a new native ECMAScript object.<br>2. Set the [[Class]] property of Result(1) to "Object".<br>3. Get the value of the prototype property of the F.<br>4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).<br>5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object<br>prototype object as described in 15.2.3.1.<br>6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument<br>list passed into [[Construct]] as the argument values.<br>7. If Type(Result(6)) is Object then return Result(6).<br>8. Return Result(1).<br><img src ="http://www.cnitblog.com/asfman/aggbug/59769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-07-01 21:21 <a href="http://www.cnitblog.com/asfman/articles/59769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>layerX offsetX pageX</title><link>http://www.cnitblog.com/asfman/articles/59694.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Sun, 28 Jun 2009 08:53:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/59694.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/59694.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/59694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/59694.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/59694.html</trackback:ping><description><![CDATA[offsetX/offsetY：相对于当前元素的位移<br>x/y：相对于当前座标系的位移，但是IE常常搞错当前座标系<br>layerX/layerY：相对于当前座标系的位移<br>pageX/pageY：相对于网页的位移<br>clientX/clientY：相对于可视窗口的位移<br>screenX/screenY：相对于屏幕的位移<br><br>offsetX/offsetY：W3C-
IE+ Firefox- Opera+ Safari+<br>x/y：W3C- IE+ Firefox- Opera+
Safari+<br>layerX/layerY：W3C- IE- Firefox+ Opera- Safari+<br>pageX/pageY：W3C-
IE- Firefox+ Opera+ Safari+<br>clientX/clientY：W3C+ IE+ Firefox+ Opera+
Safari+<br>screenX/screenY：W3C+ IE+ Firefox+ Opera+
Safari+<br><br>六对属性只有clientX/clientY和screenX/screenY是W3C规范内的。<br>而offsetX/offsetY和pageX/pageY知其一组即可通过计算取得另一组，对于JS开发者而言，Firefox/Opera/Safari提供的pageX/pageY更加实用。x/y和layerX/layerY本应该是作用相同、名称不同的两组属性，即相对于offsetParent对象的位移，但是IE对offsetParent的判断却相当不准确，大部份情况下offsetParent对象都等于body对象，最严重的后果就是在一个绝对定位的层中offsetParent对象本应该为层对象，可IE却依旧为body对象，导致座标系混乱，而Opera和Safari中的x/y则同样继承了IE中的错误，因此x/y属性能不用则不用<img src ="http://www.cnitblog.com/asfman/aggbug/59694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-06-28 16:53 <a href="http://www.cnitblog.com/asfman/articles/59694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>createRange</title><link>http://www.cnitblog.com/asfman/articles/59590.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Wed, 24 Jun 2009 07:05:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/59590.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/59590.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/59590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/59590.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/59590.html</trackback:ping><description><![CDATA[function() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (document.selection &amp;&amp; document.selection.createRange) return document.selection.createRange().text ? document.selection.createRange().htmlText.replace(/[\r|\n]/g, ""): "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (window.getSelection) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var a = window.getSelection();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (a.rangeCount &gt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var b = document.createElement("div");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.appendChild(a.getRangeAt(0).cloneContents());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return b.innerHTML.replace(/[\r|\n]/g, "");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";<br>&nbsp;&nbsp;&nbsp; }<br><img src ="http://www.cnitblog.com/asfman/aggbug/59590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-06-24 15:05 <a href="http://www.cnitblog.com/asfman/articles/59590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mousewheel</title><link>http://www.cnitblog.com/asfman/articles/56521.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Tue, 21 Apr 2009 02:02:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/56521.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/56521.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/56521.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/56521.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/56521.html</trackback:ping><description><![CDATA[$.fn.extend({//添加滚轮事件//by<br>&nbsp;&nbsp;&nbsp; mousewheel:function(Func){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.each(function(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var _self = this;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _self.D = 0;//滚动方向<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($.browser.msie||$.browser.safari){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _self.onmousewheel=function(){_self.D = event.wheelDelta;event.returnValue = false;Func &amp;&amp; Func.call(_self);};<br>&nbsp;&nbsp;&nbsp;&nbsp; }else{//ff<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _self.addEventListener("DOMMouseScroll",function(e){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _self.D = e.detail&gt;0?-1:1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.preventDefault();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Func &amp;&amp; Func.call(_self);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },false);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; });<br>//e.wheelData为正表示向上<br>//ff e.details为负表示向上<br><br><img src ="http://www.cnitblog.com/asfman/aggbug/56521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-04-21 10:02 <a href="http://www.cnitblog.com/asfman/articles/56521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>how-javascript-timers-work翻译</title><link>http://www.cnitblog.com/asfman/articles/55714.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Tue, 24 Mar 2009 09:42:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/55714.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/55714.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/55714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/55714.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/55714.html</trackback:ping><description><![CDATA[&nbsp;原文地址：http://ejohn.org/blog/how-javascript-timers-work/ <br>&nbsp;作为基本点去明白js定时器如何工作的是非常重要的。因为js是单线程的所以通常它们表现的和我们直观想像的不太一样。让我们通过查看3个可以构造和操作定时器的函数开始吧。<br>&nbsp;&nbsp; 1.var id = setTimeout(fn, delay);-初始化一个定时器,在延时后调用指定函数,返回一个以后可以取消定时器的的id.<br>&nbsp;&nbsp; 2.var id = setInterval(fn, delay);- 类似setTimeout,但会持续的调用指定函数(每次延时后)直到被取消.<br>&nbsp;&nbsp; 3.clearInterval(id), clearTimeout(id);-接受一个定时器id(可以通过前面任意一个函数返回)，终止定时器回调发生。<br>&nbsp; 为了明白定时器内部是如何工作，有一个重要的概念我们需要仔细查看：定时器的延时是没有保证的。由于所有在游览器执行的js都是单线程异步事件(比如鼠标单击和定时器)，执行过程中只有在有空闲的时候才会被执行。通过下图可以很好的说明这一观点：<br>&nbsp;&nbsp; <img src="http://ejohn.org/files/Timers.png"> <br>&nbsp;&nbsp; 在上图中有很多信息是需要好好去消化下的，完全理解会让你对js的异步工作有更好的认识。上面图表是一维的：垂直表示时间，按毫秒计算。蓝色的盒子表示正在执行的部分js。如第一个js块执行的时间大约为18ms，鼠标点击块执行的时间大约为11ms,等等。<br>&nbsp; 因为js只能在某一时刻执行一小段代码(由于它的单线程天性)，这些执行代码块中的每个都会"阻塞"其他异步事件的进行。这意味着当一个异步事件发生时(如鼠标单击事件，定时器触发，或者异步请求完成时)，它会排队等待执行(至于队列实际上是如何排列的,想必各个游览器表现都会不一样，所以这样考虑是一个简化)。<br>&nbsp; 一开始在第一个js代码块里，2个定时器被初始化：1个10ms的setTimeout和1个10ms的setInterval。根据定时器何时何地会被初始化,他实际上会在第一个执行块完成之前被触发。注意，不管怎样，它不会被马上执行(由于线程关系，没有能力做到)。相反,延时执行的回调函数会进入队列以便在下一空闲的时刻执行。<br>&nbsp;&nbsp; 此外，在第一个代码块里,我们看到一个鼠标单击事件发生。一个js回调函数被绑定于这个异步事件(我们不知道用户何时会点击，所以这被认为是异步的)，但不会被马上执行，它像开始的那个定时器一样，会进入队列等待执行。<br>&nbsp;&nbsp; 在第一个js代码块初始化完成后，游览器会立刻询问：谁正在等待执行啊？这种情况下，鼠标单击事件处理函数和定时器回调函数正在等待执行。然后游览器挑选一个(鼠标单击事件处理函数)马上执行，定时器回调函数继续等待下一个可能的时间去执行。<br>&nbsp;&nbsp; 注意到当鼠标单击回调函数正在执行的时候，第一个interval回调执行，与其他定时器一样，它的回调函数排队等待执行。不管怎样，注意到当interval再次被触发(当最初的那个定时器回调函数执行的时候)，这次interval回调函数会被丢弃。当一大块代码正在执行时如果你把所有interval的回调函数都放到队列里的话，代码块执行完成后，结果会有一大堆interval回调函数一个接着一个没有时间间隔地执行，直到全部完成。相反，在把更多的回调函数放入队列之前，游览器更倾向于简单地等待，直到队列里没有这个interval的回调函数。&nbsp; <br>&nbsp;&nbsp; 事实上，我们可以看到当interval回调函数正在执行的时候,interval第三次被触发。这给我们一个很重要的信息：interval并不关心当前谁在执行，它的回调函数会不加区分地进入队列，即使存在这个回调函数会被丢弃的可能。<br>&nbsp;&nbsp; 最后，在第二个interval回调函数执行完成后，我们可以看到没有任何其它东西等待js引擎去执行了，这意味着游览器在等候一个新的异步事件的发生。我们看到50ms处interval再次被触发。这次，没有任何东西阻塞它的执行，所以马上执行。<br>&nbsp; 我们看一下下面这个例子，能更好的描述setTimeout和setInterval之间的区别。<br>&nbsp; setTimeout(function(){<br>&nbsp;&nbsp;&nbsp; /* 一些长代码块... */<br>&nbsp;&nbsp;&nbsp; setTimeout(arguments.callee, 10);<br>&nbsp; }, 10);<br>&nbsp;<br>&nbsp; setInterval(function(){<br>&nbsp;&nbsp;&nbsp; /* 一些长代码块... */<br>&nbsp; }, 10);<br>&nbsp;&nbsp; 第一眼看上去这两段代码也许功能上是一样，但其实并不然。值得注意的是setTimeout代码总是会在10ms以后执行(有可能更长，但不会比10ms少)，而setInterval会尝试每隔10ms去执行一次，不管上一个回调函数是否执行完成。<br><br>在这里学到了很多东西，我们来概括一下：<br>&nbsp; 1.js引擎是单线程的，使得异步事件只能进入队列等候执行。<br>&nbsp; 2.在如何执行异步代码上setTimeout和setInterval有着根本的不同。<br>&nbsp; 3.如果一个定时器被正在执行的代码阻塞了，它会延迟到下一个可能执行的点再执行(可能会比期望的时间长很多)。<br>&nbsp; 4.如果interval回调函数执行需要花很长时间的话(比指定的延时长)，interval有可能没有延迟背靠背地执行。<br><br>上述这一切无疑是很重要的知识，理解js引擎是如果工作的，尤其是大量的典型的异步事件发生时，对于构建一个高效的应用代码片段来说是一个非常有利的基础。<br>&nbsp;&nbsp;&nbsp; <br><img src ="http://www.cnitblog.com/asfman/aggbug/55714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-03-24 17:42 <a href="http://www.cnitblog.com/asfman/articles/55714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js Interface</title><link>http://www.cnitblog.com/asfman/articles/55473.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Mon, 16 Mar 2009 13:42:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/55473.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/55473.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/55473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/55473.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/55473.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; var Interface = function(name, methods){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; if(arguments.length != 2){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Error("Interface constructor called with " + arguments.length + " argument, but expected exactly 2.");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; this.name = name;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; this.methods = [];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; for(var i = 0, l =&nbsp; methods.length; i &lt; l; i++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(typeof methods[i] !== "string"){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new Error("Interface constructor expects method names to be passed in as a string");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.methods.push(methods[i]);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; Interface.ensureImplements = function(obj){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(arguments.length &lt; 2){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new Error("Function Interface.ensureImplements called with " +<br>arguments.length + " argument, but expected at least 2.");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(var i = 1, l =&nbsp; arguments.length; i &lt; l; i++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; var interface = arguments[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; if(interface.constructor !== Interface){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Error("Function Interface.ensureImplements expects arguments two and above to be instances of Interface.");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; for(var j = 0, len = interface.methods.length ; j &lt; len; j++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var method = interface.methods[j];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!obj[method] || typeof obj[method] !== 'function'){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; throw new Error("Function Interface.ensureImplements: object "<br>+ "does not implement the " + interface.name<br>+ " interface. Method " + method + " was not found.");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>It might seem like interfaces reduce JavaScript&#8217;s flexibility, but they actually improve it by allowing<br>your objects to be more loosely coupled.<br><br><img src ="http://www.cnitblog.com/asfman/aggbug/55473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-03-16 21:42 <a href="http://www.cnitblog.com/asfman/articles/55473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《悟透JavaScript》之 甘露模型(转)</title><link>http://www.cnitblog.com/asfman/articles/55318.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Thu, 12 Mar 2009 09:27:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/55318.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/55318.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/55318.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/55318.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/55318.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 《悟透JavaScript》之甘露模型 Posted on 2008-06-04 08:00 李战 -->注意：如果您尚未阅读过原来那篇老文章《悟透JavaScript》，请先行阅读该文，以了解上下文关系。在上面的示例中，我们定义了两个语法甘露，一个是Class()函数，一个是New()函数。使用Class()甘露，我们已经可以用非常优雅的格式定义一个类。例如前例中的：...&nbsp;&nbsp;<a href='http://www.cnitblog.com/asfman/articles/55318.html'>阅读全文</a><img src ="http://www.cnitblog.com/asfman/aggbug/55318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-03-12 17:27 <a href="http://www.cnitblog.com/asfman/articles/55318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动调整left和top</title><link>http://www.cnitblog.com/asfman/articles/55297.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Thu, 12 Mar 2009 02:31:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/55297.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/55297.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/55297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/55297.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/55297.html</trackback:ping><description><![CDATA[/**<br>&nbsp; * @param {domArray} <br>&nbsp; * @param {config} an Object contains maxN, baseTop and baseLeft<br>&nbsp; * Author: asfman<br>&nbsp;**/<br>&nbsp;&nbsp;&nbsp; function autoPosition(domArray, config){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(var i = 0; i &lt; domArray.length; i++){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;domArray[i].style.top = ((i - config.maxN &lt; 0 ? i : (i - config.maxN) % config.maxN) * config.baseTop) + "px";<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;domArray[i].style.left = Math.floor(i / config.maxN) * config.baseLeft + "px";<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><img src ="http://www.cnitblog.com/asfman/aggbug/55297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-03-12 10:31 <a href="http://www.cnitblog.com/asfman/articles/55297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AddText</title><link>http://www.cnitblog.com/asfman/articles/55135.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Thu, 05 Mar 2009 13:44:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/55135.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/55135.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/55135.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/55135.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/55135.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; function AddText(txt) {<br>&nbsp;&nbsp;&nbsp; obj = document.getElementById("test");<br>&nbsp;&nbsp;&nbsp; selection = document.selection;<br>&nbsp;&nbsp;&nbsp; obj.focus();<br>&nbsp;&nbsp;&nbsp; if (typeof obj.selectionStart != "undefined") {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var opn = obj.selectionStart + 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj.value = obj.value.substr(0, obj.selectionStart) + txt + obj.value.substr(obj.selectionEnd);<br>&nbsp;&nbsp;&nbsp; } else if (selection &amp;&amp; selection.createRange) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var sel = selection.createRange();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel.text = txt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel.moveStart("character", -txt.length);<br>&nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj.value += txt;<br>&nbsp;&nbsp;&nbsp; }<br>}<br><img src ="http://www.cnitblog.com/asfman/aggbug/55135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-03-05 21:44 <a href="http://www.cnitblog.com/asfman/articles/55135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>身份证严格验证</title><link>http://www.cnitblog.com/asfman/articles/55076.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Tue, 03 Mar 2009 13:34:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/55076.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/55076.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/55076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/55076.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/55076.html</trackback:ping><description><![CDATA[&nbsp; //身份证严格验证<br>var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}<br>function isCardID(sId){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var iSum=0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var info="" ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!/^\d{17}(\d|x)$/i.test(sId)) return "你输入的身份证长度或格式错误";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sId=sId.replace(/x$/i,"a");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(aCity[parseInt(sId.substr(0,2))]==null) return "你的身份证地区非法";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var d=new Date(sBirthday.replace(/-/g,"/")) ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "身份证上的出生日期非法";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i = 17;i&gt;=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(iSum%11!=1) return "你输入的身份证号非法";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;//aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")<br>}<br><img src ="http://www.cnitblog.com/asfman/aggbug/55076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-03-03 21:34 <a href="http://www.cnitblog.com/asfman/articles/55076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何直接调试线上页面的JavaScript和CSS by lifesinger </title><link>http://www.cnitblog.com/asfman/articles/55070.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Tue, 03 Mar 2009 07:34:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/55070.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/55070.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/55070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/55070.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/55070.html</trackback:ping><description><![CDATA[<p>作为一名前端工程师，除了开发新项目，还有一个重要任务是线上网站的日常维护。一个典型的工作场景是：线上的某个页面出现了bugs，需要紧急修复。这时候有个简单的传统做法是，将问题页面<strong> 另存为本地html</strong> 文件，然后疯狂的寻找并修复bugs，等弄好了，再将修改后的js和css上传到线上并检查校验bugs是否已修正。</p>
<p>上面的方法，对于简单页面，是够用的。但是对于稍微复杂的页面，IE的另存为经常不保真，如果页面中涉及Ajax等bugs，保存到本地更是难以调试。这时有个很自然的做法是，<strong> 将开发环境Run起来，当时怎么开发的，现在就怎么调试</strong> 。这样做肯定能解决问题，但要调动很多资源，后台开发工程师、前台开发工程师等等都要参与。对于小团队来说，也许是可行的，对于大团队来说，如此大动干戈，除非到了最后，是不会这样做的。那我们应该怎么做呢？先来看一个工具：</p>
<blockquote>
<p>Web开发中有个大名鼎鼎的工具：<a href="http://www.fiddlertool.com/fiddler/">Fiddler</a>.
Fiddler是一个http调试代理，它能够记录你电脑和互联网之间的所有http通讯。Fiddler可以让你检查所有的http通讯，设置断点，以
及Fiddle（Fiddle的英文意思是胡乱修改，很幽默的表达Fiddler的用途）所有&#8220;进出&#8221;的数据（指cookie,html,js,css等
数据）。</p>
</blockquote>
<p>嘿嘿，是否从上面的介绍中嗅探到了某种解决方案？<strong> Fiddler可以让我们Fiddle所有&#8221;进出&#8220;的数据！</strong> 我
们要调试线上页面的bugs时，可以先分析是什么文件引起的，找出这些嫌疑文件，下载到本地，然后利用Fiddler将线上的请求Fiddle到本地的对
应文件。这样我们就可以随心所欲的修改这些嫌疑文件了，直接刷新线上的页面就可以看到效果，烦人的环境问题根本就不用考虑，而且一切都是高保真的。</p>
<p>上面说的是思路，下面我会举个例子来说明。</p>
<p>举例子之前，请先安装Fiddler（怎么下载安装就不多了，一路Next）。安装好后，在IE的工具条上会出现Fiddler2图标，点击启动
Fiddler.
启动后，通过IE访问任何网站时，所有http进出数据都会在Fiddler上显示出来。但是等等，怎么老说IE呢？虽然在IE上能通过IE
Developer
Toolbar和Companion.JS来调试CSS和JS，但被firebug宠坏了的我们，总期望着Firefox上能搞定的问题绝不通过IE去调
试。为了我们的美好期望，根据Fiddler的官方说明，我们只要简单的进行以下操作即可：</p>
<p>首先，找到BrowserPAC.js这个文件，默认放在</p>
<ul>
    <li>c:Documents and SettingsYour NameMy DocumentsFiddler2ScriptsBrowserPAC.js</li>
</ul>
<p>Vista下在User的对等目录里。</p>
<p>接着，打开亲爱的Firefox3，Tools - Options - Advanced - Network:</p>
<p><img class="alignnone size-full wp-image-31" title="firefox_conn_settings" src="http://lifesinger.org/blog/wp-content/uploads/2008/08/firefox_conn_settings.png" alt="" width="500" height="171"></p>
<p>点击Settings&#8230;:</p>
<p><img class="alignnone size-full wp-image-32" title="firefox_conn_settings_auto_proxy" src="http://lifesinger.org/blog/wp-content/uploads/2008/08/firefox_conn_settings_auto_proxy.png" alt="" width="427" height="411"></p>
<p>选中自动代理配置URL，将BrowserPAC.js的绝对路径复制过去，确定。如果想让Fiddler监听其他浏览器，同上设置即可。</p>
<p>至此准备工作完毕，我们进入正题（才进入正题？各位看官稍安毋躁，喝杯茶，养养神，再接着往下看）。</p>
<p>在我的淘宝 - 已卖出的宝贝页面，有个修改价格的功能：</p>
<p><img class="alignnone size-full wp-image-35" title="modify_price" src="http://lifesinger.org/blog/wp-content/uploads/2008/08/modify_price.png" alt="" width="482" height="268"></p>
<p>前些天发现一个bug，当点击修改价格按钮之后，主页面上的价格没有更新。</p>
<p>初步分析后，觉得以下js文件有问题：</p>
<ul>
    <li>http://assets.taobaocdn.com/js/app/trade/trade.js</li>
    <li>http://assets.taobaocdn.com/js/app/trade/trade_business.js</li>
</ul>
<p>因为涉及Ajax调用，保存为HTML本地调试不了。这时想起Fiddler，问题迎刃而解。</p>
<p>首先将上面两个文件下载到本地，启动Fiddler，在AutoResponder栏添加替换规则：</p>
<p><a href="http://lifesinger.org/blog/wp-content/uploads/2008/08/fidder_1.png"><img class="alignnone size-medium wp-image-36" title="fidder_1" src="http://lifesinger.org/blog/wp-content/uploads/2008/08/fidder_1-300x153.png" alt="" width="300" height="153"></a></p>
<p><a href="http://lifesinger.org/blog/wp-content/uploads/2008/08/fidder_2.png"><img class="alignnone size-medium wp-image-37" title="fidder_2" src="http://lifesinger.org/blog/wp-content/uploads/2008/08/fidder_2-300x153.png" alt="" width="300" height="153"></a></p>
<p>如上图添加两条规则后，在Firefox中刷新页面，上面两个js文件就从本地获取了，嘿嘿。接下来，用喜欢的文本编辑器加Firebug尽情的调
试吧，就像当初开发时一样。等把bugs解决了，压缩并上传相应的js文件，并通知后台开发者修改vm中js文件的时间戳，然后等着发布就行。</p>
<p>CSS也是一样的调试，不赘述。在IE、Safari、Opera中的的使用方法类似，不多说。</p>
希望本文能对你有所帮助
<br><img src ="http://www.cnitblog.com/asfman/aggbug/55070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-03-03 15:34 <a href="http://www.cnitblog.com/asfman/articles/55070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>check repetitive id</title><link>http://www.cnitblog.com/asfman/articles/55042.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Mon, 02 Mar 2009 12:40:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/55042.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/55042.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/55042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/55042.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/55042.html</trackback:ping><description><![CDATA[function chkid(){ <br>&nbsp;&nbsp;&nbsp; var did={},tmpid; <br>&nbsp;&nbsp;&nbsp; divs = document.getElementsByTagName("*"); <br>&nbsp;&nbsp;&nbsp; for (var i=divs.length-1; i+1; i--){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (tmpid=divs[i].id) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;did[tmpid]===undefined <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?did[tmpid]=0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :did[tmpid]++; <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; for (var i in did) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; did[i]&amp;&amp;alert("id="+i+"重复了"+(did[i]+1)+"次"); <br>&nbsp;&nbsp;&nbsp; } <br>}<br><img src ="http://www.cnitblog.com/asfman/aggbug/55042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-03-02 20:40 <a href="http://www.cnitblog.com/asfman/articles/55042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tab类</title><link>http://www.cnitblog.com/asfman/articles/54919.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Fri, 27 Feb 2009 03:07:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/54919.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/54919.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/54919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/54919.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/54919.html</trackback:ping><description><![CDATA[&lt;script type="text/javascript"&gt;<br>&lt;!--<br>function Tab(callback, active, interval, direction, auto){<br>&nbsp;&nbsp; this.active = active||null;<br>&nbsp;&nbsp; this.list = [];<br>&nbsp;&nbsp; this.timer = 0;<br>&nbsp;&nbsp; this.interval = interval || 2000;<br>&nbsp;&nbsp; this.direction = direction || "right";<br>&nbsp;&nbsp; this.auto = auto || false;<br>&nbsp;&nbsp; this.callback = callback;<br>}<br>function addEvent(o, type, fn)<br>{<br>&nbsp;&nbsp; &nbsp;var func = function(o){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return function()<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return fn.apply(o, arguments);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }(o);<br>&nbsp;&nbsp; &nbsp;if(o.attachEvent)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;o.attachEvent("on" + type, func);<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;else if(o.addEventListener)<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;o.addEventListener(type, func, false);<br>&nbsp;&nbsp; &nbsp;}else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;o["on" + type] = func;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;return func;<br>}<br>Tab.prototype.push = function(elem, type){<br>&nbsp;&nbsp;&nbsp; type = type || "click";<br>&nbsp;&nbsp;&nbsp; this.list.push(elem); <br>&nbsp;&nbsp; &nbsp;var _this = this;<br>&nbsp;&nbsp; &nbsp;addEvent(elem, type, this.attachEvent.call(this)); <br>}<br>Tab.prototype.attachEvent = function(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var _this = this;<br>&nbsp;&nbsp; &nbsp;&nbsp; return function(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _this.stop();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(_this.active == this) return false;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(var i = 0, l = _this.list.length; i &lt; l; i++){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(this == _this.list[i]){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; _this.execute(this);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; break;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return false;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>}<br>Tab.prototype.execute = function(elem){<br>&nbsp;&nbsp; this.callback(elem, this.active);<br>&nbsp;&nbsp; this.active = elem;<br>}<br>Tab.prototype.autorun = function(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(this.timer) clearInterval(this.timer);<br>&nbsp;&nbsp; &nbsp;&nbsp; var _this = this;<br>&nbsp;&nbsp; &nbsp;&nbsp; this.active = this.active || this.list[0];<br>&nbsp;&nbsp; &nbsp;&nbsp; this.timer = setInterval(function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i = 0, l =&nbsp; _this.list.length; i &lt; l; i++){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(_this.active == _this.list[i]){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(_this.direction == "right"){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i == l-1) <br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; _this.execute(_this.list[0], _this.callback);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; _this.execute(_this.list[i+1], _this.callback);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; break;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if(i == 0) <br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; _this.execute(_this.list[l], _this.callback);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; _this.execute(_this.list[i-1], _this.callback);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp; }, this.interval);<br>}<br>Tab.prototype.stop = function(){<br>&nbsp;&nbsp; if(this.timer) clearInterval(this.timer);<br>}<br>var oLis = document.getElementsByTagName("a");<br>var o = new Tab(callback, oLis[0],500);<br>function callback (elem, active){<br>&nbsp;&nbsp; elem.className = "active";<br>&nbsp;&nbsp; if(active) active.className = "";<br>}<br>for(var i = 0, l =&nbsp; oLis.length; i &lt; l; i++){<br>&nbsp;&nbsp; o.push(oLis[i]);<br>}<br>o.autorun(500);<br><br>//--&gt;<br>&lt;/script&gt;
<br><img src ="http://www.cnitblog.com/asfman/aggbug/54919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-02-27 11:07 <a href="http://www.cnitblog.com/asfman/articles/54919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Decorator</title><link>http://www.cnitblog.com/asfman/articles/54899.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Thu, 26 Feb 2009 09:38:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/54899.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/54899.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/54899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/54899.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/54899.html</trackback:ping><description><![CDATA[CSS=function(key,val){<br>&nbsp;var $=this.style;<br>&nbsp;if(val!==undefined){<br>&nbsp;&nbsp;$[key]=val;<br>&nbsp;&nbsp;return this;<br>&nbsp;}<br>&nbsp;if ($[key])return $[key];&nbsp; <br>&nbsp;&nbsp;&nbsp; if (this.currentStyle) return this.currentStyle[key]<br>&nbsp;&nbsp;&nbsp; if (document.defaultView &amp;&amp; document.defaultView.getComputedStyle){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = key.replace(/([A-Z])/g,"-$1").toLowerCase();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var V = document.defaultView.getComputedStyle(this,""); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return V &amp;&amp; s.getPropertyValue(key); <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return null; <br>}<br>&lt;script&gt;<br>// 目标函数<br>function base(){<br>&nbsp;alert('原函数')<br>}<br>// 装饰器<br>Decorator={<br>&nbsp;beginList:[]//前置列表<br>&nbsp;,endList:[]//后置列表<br>&nbsp;,append:function (fn){<br>&nbsp;&nbsp;this.endList.push(fn);<br>&nbsp;}<br>&nbsp;,before:function (fn){<br>&nbsp;&nbsp;this.beginList.splice(0,0,fn)<br>&nbsp;}<br>&nbsp;,wrap:function (fn/* 待装饰的函数 */){<br>&nbsp;&nbsp;var $=this,$1=[],$2=[];<br>&nbsp;&nbsp;// 拷贝两个列表内容放到闭包<br>&nbsp;&nbsp;for (var i=0;i&lt;$.beginList.length;i++ )<br>&nbsp;&nbsp;&nbsp;$1[i]=$.beginList[i];<br>&nbsp;&nbsp;for (var i=0;i&lt;$.endList.length;i++ )<br>&nbsp;&nbsp;&nbsp;$2[i]=$.endList[i];<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp;&nbsp;// 返回装饰完毕的函数<br>&nbsp;&nbsp;&nbsp;return function (){<br>&nbsp;&nbsp;&nbsp;&nbsp;for (var i=0;i&lt;$1.length;i++ )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$1[i]();<br>&nbsp;&nbsp;&nbsp;&nbsp;if(typeof fn == 'function')fn();<br>&nbsp;&nbsp;&nbsp;&nbsp;for (var i=0;i&lt;$2.length;i++ )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$2[i]();<br>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;<br>&nbsp;&nbsp;}finally{<br>&nbsp;&nbsp;&nbsp;// 用finally技巧在返回后清空缓存的列表，以备下次使用<br>&nbsp;&nbsp;&nbsp;this.beginList.length=this.endList.length=0;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br>Decorator.append(function (){<br>&nbsp;alert('第1个追加函数')<br>});<br>Decorator.append(function (){<br>&nbsp;alert('第2个追加函数')<br>});<br>Decorator.before(function (){<br>&nbsp;alert('第1个前插函数')<br>});<br>Decorator.before(function (){<br>&nbsp;alert('第2个前插函数')<br>});<br>v=Decorator.wrap(base);<br>alert('装饰器的列表长度现在为: '+Decorator.endList.length)<br>v()<br>&lt;/script&gt;
<img src ="http://www.cnitblog.com/asfman/aggbug/54899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-02-26 17:38 <a href="http://www.cnitblog.com/asfman/articles/54899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>职责链模式</title><link>http://www.cnitblog.com/asfman/articles/54880.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Thu, 26 Feb 2009 02:40:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/54880.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/54880.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/54880.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/54880.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/54880.html</trackback:ping><description><![CDATA[/* 创建一个职责链 */<br>Chain={<br>&nbsp;list:[]<br>&nbsp;,bind:function (o){<br>&nbsp;&nbsp;/* 绑定链驱动 */<br>&nbsp;&nbsp;o.onclick=function (){Chain.carry(this)}<br>&nbsp;}<br>&nbsp;,carry:function(e){<br>&nbsp;&nbsp;if(e == this.list[0]) return;<br>&nbsp;&nbsp;/* 插到链首 */<br>&nbsp;&nbsp;this.list.unshift(e);<br>&nbsp;&nbsp;/* 控制链长始终为2 */<br>&nbsp;&nbsp;this.list.length=2;<br>&nbsp;&nbsp;/*&nbsp; 职责 */<br>&nbsp;&nbsp;currentJob(this.list);<br>&nbsp;}<br>}<br>// 绑定传送，并添加当前选中tab到链表中<br>for (var i=0;i&lt;btns.length;i++ ) {<br>&nbsp;Chain.bind(btns[i]);<br>&nbsp;btns[i].index=i;<br>&nbsp;if(i==0)Chain.list[0]=btns[i];<br>}<br>function currentJob(list){<br>&nbsp;&nbsp;list[0].className= "hot";<br>&nbsp;&nbsp;list[1].className= "";<br>&nbsp;&nbsp;divs[list[0].index].style.display='block';<br>&nbsp;&nbsp;divs[list[1].index].style.display='none';<br>}
<img src ="http://www.cnitblog.com/asfman/aggbug/54880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-02-26 10:40 <a href="http://www.cnitblog.com/asfman/articles/54880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>drag</title><link>http://www.cnitblog.com/asfman/articles/53862.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Mon, 19 Jan 2009 05:26:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/53862.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/53862.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/53862.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/53862.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/53862.html</trackback:ping><description><![CDATA[&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br>&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;<br>&lt;title&gt;&lt;/title&gt;<br>&lt;style type="text/css"&gt;<br>#bg{background: url(7689827.gif) no-repeat; position: relative; width: 676px; height: 23px;}<br>#slidebar{position: relative; left: 28px; top: 4px; width: 10px; cursor: pointer}<br>&lt;/style&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;div id="bg"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="slidebar"&gt;&lt;img onselectstart="return false" unselectable="on" align="absmiddle" src="7689824.gif" /&gt;&lt;/div&gt;<br>&lt;/div&gt;<br>&lt;div id="show"&gt;<br><br>&lt;/div&gt;<br>&lt;script type="text/javascript"&gt;<br>&lt;!--<br>&nbsp;&nbsp;&nbsp; var o = document.getElementById("slidebar");<br>&nbsp;&nbsp;&nbsp; o.onmousedown = function(e){<br>&nbsp;&nbsp;&nbsp; &nbsp; e = e || window.event;<br>&nbsp;&nbsp;&nbsp; &nbsp; /*record the screenX and left pos*/<br>&nbsp;&nbsp;&nbsp; &nbsp; var screenX = e.screenX, s = parseInt(o.style.left)||28;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.onmousemove = function(e2){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e2 = e2 || window.event;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; diffX = e2.screenX - screenX;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var ret = s + diffX ;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*limit pos*/<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(ret &gt; 638) ret = 638;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(ret &lt; 28) ret = 28;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.style.left = ret + "px";<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; document.getElementById("show").innerHTML = ret;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; &nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp; document.onmouseup = function(){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; document.onmousemove = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.onmouseup = null;<br>&nbsp;&nbsp;&nbsp; &nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp; if(e.preventDefault){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.style.MozUserSelect = 'none'<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; e.preventDefault();<br>&nbsp;&nbsp;&nbsp; &nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>//--&gt;<br>&lt;/script&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br><img src ="http://www.cnitblog.com/asfman/aggbug/53862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-01-19 13:26 <a href="http://www.cnitblog.com/asfman/articles/53862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>arguments: A JavaScript Oddity</title><link>http://www.cnitblog.com/asfman/articles/53770.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Wed, 14 Jan 2009 08:29:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/53770.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/53770.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/53770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/53770.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/53770.html</trackback:ping><description><![CDATA[<div class="submitter-heading">
<h1 class="blogicon"><code>arguments</code>: A JavaScript Oddity</h1>
</div>
<p class="blogauthor"><span class="regular_author">by <a  href="http://www.sitepoint.com/articlelist/487" title="Andrew Tetlaw's Author Bio">Andrew Tetlaw</a></span></p>
<!-- load needed syntax highlighting brushes -->
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<script type="text/javascript" src="http://sitepointstatic.com/blogs/wp-content/plugins/code-highlight/js/shBrushJScript.js"></script>
<p><strong><code>arguments</code> is the name of a local, array-like
object available inside every function. It&#8217;s quirky, often ignored, but
the source of much programming wizardry; all the major JavaScript
libraries tap into the power of the <code>arguments</code> object. It&#8217;s something every JavaScript programmer should become familiar with.</strong></p>
<p>Inside any function you can access it through the variable: <code>arguments</code>,
and it contains an array of all the arguments that were supplied to the
function when it was called. It&#8217;s not actually a JavaScript array; <code>typeof arguments</code> will return the value: <code>"object"</code>. You can access the individual argument values through an array index, and it has a <code>length</code> property like other arrays, but it doesn&#8217;t have the standard <code>Array</code> methods like <code>push</code> and <code>pop</code>.</p>
<h2>Create Flexible Functions</h2>
<p>Even though it may appear limited, <code>arguments</code> is a very useful object. For example, you can make functions that accept a variable number of arguments. The <code>format</code> function, found in the <a  href="http://base2.googlecode.com/">base2</a> library by Dean Edwards, demonstrates this flexibility:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span></span><span class="keyword">function</span><span>&nbsp;format(string)&nbsp;{&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">2</td>
            <td class="line2">&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;args&nbsp;=&nbsp;arguments;&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">3</td>
            <td class="line1">&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;pattern&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;RegExp(</span><span class="string">"%([1-"</span><span>&nbsp;+&nbsp;arguments.length&nbsp;+&nbsp;</span><span class="string">"])"</span><span>,&nbsp;</span><span class="string">"g"</span><span>);&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">4</td>
            <td class="line2">&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;String(string).replace(pattern,&nbsp;</span><span class="keyword">function</span><span>(match,&nbsp;index)&nbsp;{&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">5</td>
            <td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;args[index];&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">6</td>
            <td class="line2">&nbsp;&nbsp;});&nbsp;</td>
        </tr>
        <tr>
            <td class="gutter">7</td>
            <td class="line1">};&nbsp;</td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">function format(string) {
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
return String(string).replace(pattern, function(match, index) {
return args[index];
});
};</code></pre>
<p>You supply a template string, in which you add place-holders for values using <code>%1</code> to <code>%9</code>, and then supply up to 9 other arguments which represent the strings to insert. For example:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span>format(</span><span class="string">"And&nbsp;the&nbsp;%1&nbsp;want&nbsp;to&nbsp;know&nbsp;whose&nbsp;%2&nbsp;you&nbsp;%3"</span><span>,&nbsp;</span><span class="string">"papers"</span><span>,&nbsp;</span><span class="string">"shirt"</span><span>,&nbsp;</span><span class="string">"wear"</span><span>);&nbsp;</span></td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");</code></pre>
<p>The above code will return the string <code>"And the papers want to know whose shirt you wear"</code>.</p>
<p>One thing you may have noticed is that, in the function definition for <code>format</code>, we only specified one argument: <code>string</code>. JavaScript allows us to pass any number of arguments to a function, regardless of the function definition, and the <code>arguments</code> object has access to all of them.</p>
<h2>Convert it to a Real Array</h2>
<p>Even though <code>arguments</code> is not an actual JavaScript array we can easily convert it to one by using the standard <code>Array</code> method,  <code>slice</code>, like this:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span></span><span class="keyword">var</span><span>&nbsp;args&nbsp;=&nbsp;Array.prototype.slice.call(arguments);&nbsp;</span></td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">var args = Array.prototype.slice.call(arguments);</code></pre>
<p>The variable <code>args</code> will now contain a proper JavaScript <code>Array</code> object containing all the values from the <code>arguments</code> object.</p>
<h2>Create Functions with Preset Arguments</h2>
<p>The <code>arguments</code> object allows us to perform all sorts of JavaScript tricks. Here is the definition for the <code>makeFunc</code>
function. This function allows you to supply a function reference and
any number of arguments for that function. It will return an anonymous
function that calls the function you specified, and supplies the preset
arguments together with any new arguments supplied when the anonymous
function is called:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span></span><span class="keyword">function</span><span>&nbsp;makeFunc()&nbsp;{&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">2</td>
            <td class="line2">&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;args&nbsp;=&nbsp;Array.prototype.slice.call(arguments);&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">3</td>
            <td class="line1">&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;func&nbsp;=&nbsp;args.shift();&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">4</td>
            <td class="line2">&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">5</td>
            <td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;func.apply(</span><span class="keyword">null</span><span>,&nbsp;args.concat(Array.prototype.slice.call(arguments)));&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">6</td>
            <td class="line2">&nbsp;&nbsp;};&nbsp;</td>
        </tr>
        <tr>
            <td class="gutter">7</td>
            <td class="line1">}&nbsp;</td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">function makeFunc() {
var args = Array.prototype.slice.call(arguments);
var func = args.shift();
return function() {
return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
};
}</code></pre>
<p>The first argument supplied to <code>makeFunc</code> is considered
to be a reference to the function you wish to call (yes, there&#8217;s no
error checking in this simple example) and it&#8217;s removed from the
arguments array. <code>makeFunc</code> then returns an anonymous function that uses the <code>apply</code> method of the <code>Function</code> object to call the function specified.</p>
<p>The first argument for <code>apply</code> refers to the scope the function will be called in; basically what the keyword <code>this</code> will refer to inside the function being called. That&#8217;s a little advanced for now, so we just keep it <code>null</code>. The second argument is an array of values that will be converted into the <code>arguments</code> object for the function. <code>makeFunc</code>
concatenates the original array of values onto the array of arguments
supplied to the anonymous function and supplies this to the called
function.</p>
<p>Lets say there was a message you needed to output where the template
was always the same. To save you from always having to quote the
template every time you called the <code>format</code> function you could use the <code>makeFunc</code> utility function to return a function that will call <code>format</code> for you and fill in the template argument automatically:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span></span><span class="keyword">var</span><span>&nbsp;majorTom&nbsp;=&nbsp;makeFunc(format,&nbsp;</span><span class="string">"This&nbsp;is&nbsp;Major&nbsp;Tom&nbsp;to&nbsp;ground&nbsp;control.&nbsp;I'm&nbsp;%1."</span><span>);&nbsp;</span></td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");</code></pre>
<p>You can call the <code>majorTom</code> function repeatedly like this:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span>majorTom(</span><span class="string">"stepping&nbsp;through&nbsp;the&nbsp;door"</span><span>);&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">2</td>
            <td class="line2">majorTom(<span class="string">"floating&nbsp;in&nbsp;a&nbsp;most&nbsp;peculiar&nbsp;way"</span><span>);&nbsp;</span></td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">majorTom("stepping through the door");
majorTom("floating in a most peculiar way");</code></pre>
<p>Each time you call the <code>majorTom</code> function it calls the <code>format</code> function with the first argument, the template, already filled in. The above calls return:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span>"This&nbsp;is&nbsp;Major&nbsp;Tom&nbsp;to&nbsp;ground&nbsp;control.&nbsp;I'm&nbsp;stepping&nbsp;through&nbsp;the&nbsp;door."&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">2</td>
            <td class="line2">"This&nbsp;is&nbsp;Major&nbsp;Tom&nbsp;to&nbsp;ground&nbsp;control.&nbsp;I'm&nbsp;floating&nbsp;in&nbsp;a&nbsp;most&nbsp;peculiar&nbsp;way."&nbsp;</td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code>"This is Major Tom to ground control. I'm stepping through the door."
"This is Major Tom to ground control. I'm floating in a most peculiar way."</code></pre>
<h2>Create Self-referencing Functions</h2>
<p>You may think that&#8217;s pretty cool, but wait, arguments has one more surprise; it has another useful property: <code>callee</code>. <code>arguments.callee</code> contains a reference to the function that created the <code>arguments</code> object. How can we use such a thing? <code>arguments.callee</code> is a handy way an anonymous function can refer to itself.</p>
<p><code>repeat</code> is a function that takes a function reference,
and 2 numbers. The first number is how many times to call the function
and the second represents the delay, in milliseconds, between each
call. Here&#8217;s the definition for <code>repeat</code>:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span></span><span class="keyword">function</span><span>&nbsp;repeat(fn,&nbsp;times,&nbsp;delay)&nbsp;{&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">2</td>
            <td class="line2">&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">3</td>
            <td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(times--&nbsp;&gt;&nbsp;0)&nbsp;{&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">4</td>
            <td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn.apply(<span class="keyword">null</span><span>,&nbsp;arguments);&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">5</td>
            <td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;args&nbsp;=&nbsp;Array.prototype.slice.call(arguments);&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">6</td>
            <td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;self&nbsp;=&nbsp;arguments.callee;&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">7</td>
            <td class="line1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTimeout(<span class="keyword">function</span><span>(){self.apply(</span><span class="keyword">null</span><span>,args)},&nbsp;delay);&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">8</td>
            <td class="line2">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</td>
        </tr>
        <tr>
            <td class="gutter">9</td>
            <td class="line1">&nbsp;&nbsp;};&nbsp;</td>
        </tr>
        <tr>
            <td class="gutter">10</td>
            <td class="line2">}&nbsp;</td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">function repeat(fn, times, delay) {
return function() {
if(times-- &gt; 0) {
fn.apply(null, arguments);
var args = Array.prototype.slice.call(arguments);
var self = arguments.callee;
setTimeout(function(){self.apply(null,args)}, delay);
}
};
}</code></pre>
<p><code>repeat</code> uses <code>arguments.callee</code> to get a reference, in the variable <code>self</code>,
to the anonymous function that runs the originally supplied function.
This way the anonymous function can call itself again after a delay
using the standard <code>setTimeout</code> function.</p>
<p>So, I have this, admittedly simplistic, function in my application
that takes a string and pops-up an alert box containing that string:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span></span><span class="keyword">function</span><span>&nbsp;comms(s)&nbsp;{&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">2</td>
            <td class="line2">&nbsp;&nbsp;alert(s);&nbsp;</td>
        </tr>
        <tr>
            <td class="gutter">3</td>
            <td class="line1">}&nbsp;</td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">function comms(s) {
alert(s);
}</code></pre>
<p>However, I want to create a special version of that function that
repeats 3 times with a delay of 2 seconds between each time. With my <code>repeat</code> function, I can do this:</p>
<div class="dp-highlighter">
<table class="dp-c" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="tools-corner"><br></td>
        </tr>
        <tr>
            <td class="gutter">1</td>
            <td class="line1"><span></span><span class="keyword">var</span><span>&nbsp;somethingWrong&nbsp;=&nbsp;repeat(comms,&nbsp;3,&nbsp;2000);&nbsp;</span></td>
        </tr>
        <tr>
            <td class="gutter">2</td>
            <td class="line2">&nbsp;</td>
        </tr>
        <tr>
            <td class="gutter">3</td>
            <td class="line1">somethingWrong(<span class="string">"Can&nbsp;you&nbsp;hear&nbsp;me,&nbsp;major&nbsp;tom?"</span><span>);&nbsp;</span></td>
        </tr>
    </tbody>
    <thead>
        <tr>
            <td class="tools-corner"><br></td>
            <td class="tools"><a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.ViewSource(this); return false;">view plain</a> | <a  href="http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/#" onclick="dp.sh.Utils.PrintSource(this); return false;">print</a></td>
        </tr>
    </thead>
</table>
</div>
<pre style="display: none;"><code class="javascript">var somethingWrong = repeat(comms, 3, 2000);
somethingWrong("Can you hear me, major tom?");</code></pre>
<p>The result of calling the <code>somethingWrong</code> function is an alert box repeated 3 times with a 2 second delay between each alert.</p>
<p><code>arguments</code> is not often used, a little quirky, but full of surprises and well worth getting to know!</p><img src ="http://www.cnitblog.com/asfman/aggbug/53770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2009-01-14 16:29 <a href="http://www.cnitblog.com/asfman/articles/53770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Break </title><link>http://www.cnitblog.com/asfman/articles/52721.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Wed, 17 Dec 2008 08:32:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/52721.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/52721.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/52721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/52721.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/52721.html</trackback:ping><description><![CDATA[&lt;form method="post" id="fm" action=""&gt;<br>&nbsp;&lt;input type="checkbox" /&gt;<br>&nbsp; &lt;input type="checkbox" /&gt;<br>&lt;/form&gt;<br>&lt;div&gt;&lt;div&gt;2&lt;/div&gt;1&lt;/div&gt;<br>&lt;script type="text/javascript"&gt;<br>&lt;!--<br>&nbsp;&nbsp;&nbsp; var Break = function (sentinel, F) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return function () {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (exp) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (exp.message != sentinel) throw exp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp; var each = function (nodes, callback, endcallback) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var array = [], l = nodes.length, i = 0;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Break('break', function () {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (; i &lt; l ; i ++) callback(nodes[i], i, array);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; endcallback &amp;&amp; endcallback();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; })();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return array;<br>&nbsp;&nbsp;&nbsp; };<br>Break("exit", function(){<br>&nbsp;&nbsp;&nbsp; each(document.getElementById("fm").elements, function(chk){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(chk.checked){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new Error("break");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }, function(){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; alert("至少选择1个");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; throw new Error("exit");<br>&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp; alert("success exit");<br>})();<br>//--&gt;<br>&lt;/script&gt;<br><img src ="http://www.cnitblog.com/asfman/aggbug/52721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2008-12-17 16:32 <a href="http://www.cnitblog.com/asfman/articles/52721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>避免在div内部触发over和out</title><link>http://www.cnitblog.com/asfman/articles/52644.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Mon, 15 Dec 2008 08:20:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/52644.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/52644.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/52644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/52644.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/52644.html</trackback:ping><description><![CDATA[&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br>&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;<br>&lt;title&gt;&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;div id="test" style="border: 1px solid green; position: absolute; left: 100px; top: 10px; width: 100px; height: 100px; background: yellow;"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;div&gt;test&lt;/div&gt;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;dddd<br>&lt;/div&gt;<br>&lt;script type="text/javascript"&gt;<br>&lt;!--<br>function withinElement(event, elem) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; event.target = event.target ? event.target : event.srcElement;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ( !event.relatedTarget &amp;&amp; event.fromElement )<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var parent = event.relatedTarget;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ( parent &amp;&amp; parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return parent == elem;<br>}<br>var oDiv = document.getElementById("test")<br>oDiv.onmouseover = function(e){<br>&nbsp;&nbsp;&nbsp; e = event || e;<br>&nbsp;&nbsp; if(!withinElement(e, this)){<br>&nbsp;&nbsp;&nbsp; alert("over");<br>&nbsp;&nbsp; }<br>}<br>oDiv.onmouseout = function(e){<br>&nbsp;&nbsp;&nbsp; e = event || e;<br>&nbsp;&nbsp; if(!withinElement(e, this)){<br>&nbsp;&nbsp;&nbsp; alert("out");<br>&nbsp;&nbsp; }<br>}<br>//--&gt;<br>&lt;/script&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br><img src ="http://www.cnitblog.com/asfman/aggbug/52644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2008-12-15 16:20 <a href="http://www.cnitblog.com/asfman/articles/52644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>检测重复</title><link>http://www.cnitblog.com/asfman/articles/52460.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Wed, 10 Dec 2008 09:33:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/52460.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/52460.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/52460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/52460.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/52460.html</trackback:ping><description><![CDATA[&lt;script type="text/javascript"&gt;<br>&lt;!--<br>var arr0=[1,2,3],arr1=[2,1,4],arr2=[1,2,5],arr3=[2,5,1];<br>&nbsp;&nbsp;&nbsp; ("\f"+arr0.concat(arr1,arr2,arr3).sort().join("\f")).replace(/(\f(.*?))\1{3}/g,function(a,b,c){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if(c) alert("重复4次的值是："+c);<br>&nbsp;&nbsp;&nbsp; });<br>//--&gt;<br>&lt;/script&gt;<br><img src ="http://www.cnitblog.com/asfman/aggbug/52460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2008-12-10 17:33 <a href="http://www.cnitblog.com/asfman/articles/52460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断当前文章算法</title><link>http://www.cnitblog.com/asfman/articles/52247.html</link><dc:creator>汪杰</dc:creator><author>汪杰</author><pubDate>Fri, 05 Dec 2008 06:31:00 GMT</pubDate><guid>http://www.cnitblog.com/asfman/articles/52247.html</guid><wfw:comment>http://www.cnitblog.com/asfman/comments/52247.html</wfw:comment><comments>http://www.cnitblog.com/asfman/articles/52247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/asfman/comments/commentRss/52247.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/asfman/services/trackbacks/52247.html</trackback:ping><description><![CDATA[/***current artical***/<br>var curObj = $(".artical")[0], fTop = curObj.offsetTop, clickObj = null;<br>$(curObj).addClass("curRecord");<br>$(window).scroll(function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $(".artical").each(function(i){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var curLimit = {start: i ? this.offsetTop - fTop : 0, end: i ? this.offsetTop - fTop + this.offsetHeight: this.offsetHeight} ;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var scrollLimit ={start: $(window).scrollTop(), end: $(window).scrollTop() + $(window).height()};<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var diffH = curDiffH = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(curObj.offsetTop - fTop &lt; scrollLimit.start &amp;&amp; curObj.offsetTop - fTop + curObj.offsetHeight &gt; scrollLimit.start){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(curLimit.start &gt; scrollLimit.start &amp;&amp; curLimit.end &gt; scrollLimit.end &amp;&amp; curLimit.start &lt; scrollLimit.end){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; diffH = curObj.offsetTop - fTop + curObj.offsetHeight - scrollLimit.start;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; curDiffH = scrollLimit.end - curLimit.start;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else if(curObj.offsetTop - fTop &gt; scrollLimit.start &amp;&amp; curObj.offsetTop - fTop &lt; scrollLimit.end &amp;&amp; curObj.offsetTop - fTop + curObj.offsetHeight &gt; scrollLimit.end){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(curLimit.start &lt; scrollLimit.start &amp;&amp; curLimit.end &gt; scrollLimit.start){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; diffH = scrollLimit.end - curObj.offsetTop + fTop;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; curDiffH = curLimit.end - scrollLimit.start;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(curLimit.start &gt;= scrollLimit.start &amp;&amp; curLimit.end &lt;= scrollLimit.end ||<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; curLimit.start &lt; scrollLimit.start &amp;&amp; curLimit.end &gt;= scrollLimit.end ||<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; curDiffH &amp;&amp; diffH &amp;&amp; curDiffH &gt; diffH){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $(curObj).removeClass("curRecord");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(this).addClass("curRecord");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; curObj = this;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });<br>});<br><br>function clickFunc(){<br>&nbsp;&nbsp;&nbsp; clickObj = this;<br>&nbsp;&nbsp;&nbsp; if(this.offsetTop - fTop &gt; $(document).height() - $(window).height()){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $(curObj).removeClass("curRecord");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(this).addClass("curRecord");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; curObj = this;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(window).scrollTop(this.offsetTop - fTop);<br>&nbsp;&nbsp;&nbsp; }<br>};<br><br>$(".artical").click(clickFunc);<br><img src ="http://www.cnitblog.com/asfman/aggbug/52247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/asfman/" target="_blank">汪杰</a> 2008-12-05 14:31 <a href="http://www.cnitblog.com/asfman/articles/52247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>