﻿<?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>BlogJava-憨厚生-随笔分类-JS</title><link>http://www.blogjava.net/hulizhong/category/20313.html</link><description>----Java's Slave----&lt;br&gt;
***Java's Host***</description><language>zh-cn</language><lastBuildDate>Mon, 07 Jun 2010 18:41:06 GMT</lastBuildDate><pubDate>Mon, 07 Jun 2010 18:41:06 GMT</pubDate><ttl>60</ttl><item><title>readyState的五种状态详解【转】</title><link>http://www.blogjava.net/hulizhong/archive/2010/06/07/322942.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Mon, 07 Jun 2010 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2010/06/07/322942.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/322942.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2010/06/07/322942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/322942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/322942.html</trackback:ping><description><![CDATA[<a href="http://www.cnblogs.com/myssh/archive/2009/12/18/1627368.html">【转】http://www.cnblogs.com/myssh/archive/2009/12/18/1627368.html</a><br />
<span class="Apple-style-span" style="word-spacing: 0px; font: medium 'Times New Roman'; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-text-size-adjust: auto; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 13px; color: rgb(75,75,75); line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">在《Pragmatic <a title="" href="http://www.blogjava.net/hulizhong/articles/112412.html">AJAX中文问题</a>&nbsp;A Web 2.0 Primer 》中偶然看到对readyStae状态的介绍，感觉这个介绍很实在，摘译如下：</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">&nbsp;0: (Uninitialized) the send( ) method has not yet been invoked.&nbsp;<br />
&nbsp;1: (Loading) the send( ) method has been invoked, request in&nbsp;progress.&nbsp;<br />
&nbsp;2: (Loaded) the send( ) method has completed, entire response&nbsp;received.<br />
&nbsp;3: (Interactive) the response is being parsed.&nbsp;<br />
&nbsp;4: (Completed) the response has been parsed, is ready for harvesting.&nbsp;</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">&nbsp;0 －&nbsp;（未初始化）还没有调用send()方法<br />
&nbsp;1 －&nbsp;（载入）已调用send()方法，正在发送请求<br />
&nbsp;2 －&nbsp;（载入完成）send()方法执行完成，已经接收到全部响应内容<br />
&nbsp;3 －&nbsp;（交互）正在解析响应内容<br />
&nbsp;4 －&nbsp;（完成）响应内容解析完成，可以在客户端调用了</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">对于readyState的这五种状态，其他书中大都语焉不详。像《Foundations of <a title="" href="http://www.blogjava.net/hulizhong/articles/112412.html">AJAX中文问题</a>》中，只在书中的表2-2简单地列举了状态的&#8220;名称&#8221;－－The state of the request. The five possible values are 0 = uninitialized,&nbsp;1 = loading, 2 = loaded, 3 = interactive, and 4 = complete。而《Ajax in Action》中好像根本就没有提到这5种状态的细节。《Professional <a title="" href="http://www.blogjava.net/hulizhong/articles/112412.html">AJAX中文问题</a>》中虽不尽人意，但还是有可取之处：</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">There are five possible values for readyState:&nbsp;<br />
0 (Uninitialized): The object has been created but the open() method hasn&#8217;t been&nbsp;called.&nbsp;<br />
1 (Loading): The open() method has been called but the request hasn&#8217;t been sent.&nbsp;<br />
2 (Loaded): The request has been sent.&nbsp;<br />
3 (Interactive). A partial response has been received.&nbsp;<br />
4 (Complete): All data has been received and the connection has been closed.&nbsp;</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">readyState有五种可能的值：<br />
0 (未初始化)： (XMLHttpRequest)对象已经创建，但还没有调用open()方法。<br />
1 (载入)：已经调用open() 方法，但尚未发送请求。<br />
2 (载入完成)： 请求已经发送完成。<br />
3 (交互)：可以接收到部分响应数据。<br />
4 (完成)：已经接收到了全部数据，并且连接已经关闭。</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">在《<strong>Understanding <a title="" href="http://www.blogjava.net/hulizhong/articles/112412.html">AJAX中文问题</a>: Using JavaScript to Create Rich Internet Applications</strong>》中，则用下表进行了说明：</p>
<table cellspacing="0" align="center" border="1">
    <thead>
        <tr>
            <th valign="top" scope="col" align="left">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 24px">readyState Status Code</p>
            </th>
            <th valign="top" scope="col" align="left">Status of the<span class="Apple-converted-space">&nbsp;</span><tt>XMLHttpRequest</tt><span class="Apple-converted-space">&nbsp;</span>Object</th>
        </tr>
        <tr>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">(0) UNINITIALIZED<br />
            未初始化</td>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">The object has been created but not initialized. (The<span class="Apple-converted-space">&nbsp;</span><tt>open</tt><span class="Apple-converted-space">&nbsp;</span>method has not been called.)<br />
            （XMLHttpRequest）对象已经创建，但尚未初始化（还没有调用open方法）。</td>
        </tr>
        <tr>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif"><tt>(1) LOADING<br />
            载入</tt></td>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">The object has been created, but the<span class="Apple-converted-space">&nbsp;</span><tt>send</tt><span class="Apple-converted-space">&nbsp;</span>method has not been called.<br />
            （XMLHttpRequest）对象已经创建，但尚未调用send方法。</td>
        </tr>
        <tr>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif"><tt>(2) LOADED<br />
            载入完成</tt></td>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">The<span class="Apple-converted-space">&nbsp;</span><tt>send</tt><span class="Apple-converted-space">&nbsp;</span>method has been called, but the status and headers are not yet available.<br />
            已经调用send方法，（HTTP响应）状态及头部还不可用。</td>
        </tr>
        <tr>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif"><tt>(3) INTERACTIVE<br />
            交互</tt></td>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">Some data has been received. Calling the<span class="Apple-converted-space">&nbsp;</span><tt>responseBody</tt><span class="Apple-converted-space">&nbsp;</span>and<span class="Apple-converted-space">&nbsp;</span><tt>responseText</tt><span class="Apple-converted-space">&nbsp;</span>properties at this state to obtain partial results will return an error, because status and response headers are not fully available.<br />
            已经接收部分数据。但若在此时调用responseBody和responseText属性获取部分结果将会产生错误，因为状态和响应头部还不完全可用。</td>
        </tr>
        <tr>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif"><tt>(4) COMPLETED<br />
            完成</tt></td>
            <td style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">All the data has been received, and the complete data is available in the<span class="Apple-converted-space">&nbsp;</span><tt>responseBody</tt><span class="Apple-converted-space">&nbsp;</span>and<span class="Apple-converted-space">&nbsp;</span><tt>responseText</tt><span class="Apple-converted-space">&nbsp;</span>properties.<br />
            已经接收到了全部数据，并且在responseBody和responseText属性中可以提取到完整的数据。</td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">根据以上几本书中的关于readyState五种状态的介绍，我认为还是《Pragmatic <a title="" href="http://www.blogjava.net/hulizhong/articles/112412.html">AJAX中文问题</a>&nbsp;A Web 2.0 Primer 》比较到位，因为它提到了对接收到的数据的解析问题，其他书中都没有提到这一点，而这一点正是&#8220;(3)交互&#8221;阶段作为一个必要的转换过程存在于&#8220;(2)载入完成&#8221;到&#8220;(4)完成&#8221;之间的理由，也就是其任务是什么。归结起来，我觉得比较理想的解释方法应该以&#8220;状态：任务（目标）+过程+表现（或特征）&#8221;表达模式来对这几个状态进行定义比较准确，而且让人容易理解。现试总结如下：</p>
<table cellspacing="0" cellpadding="5" rules="groups" align="center" border="1" frame="hsides">
    <thead>
        <tr>
            <th class="bottomBorder thead" valign="middle" scope="col" bordercolor="#ffffff" align="left" bgcolor="#6666cc">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 24px"><font color="#ffffff">readyState 状态</font></p>
            </th>
            <th class="bottomBorder thead" valign="middle" scope="col" bordercolor="#ffffff" align="left" bgcolor="#6666cc" height="35">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 24px"><tt><font color="#ffffff">状态说明</font></tt></p>
            </th>
        </tr>
        <tr>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px" align="left"><tt>(0)未初始化</tt></p>
            </td>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px">此阶段确认XMLHttpRequest对象是否创建，并为调用open()方法进行未初始化作好准备。值为0表示对象已经存在，否则浏览器会报错－－对象不存在。</p>
            </td>
        </tr>
        <tr>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left" bgcolor="#ffffcc">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px" align="left"><tt>(1)载入</tt></p>
            </td>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left" bgcolor="#ffffcc">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px">此阶段对XMLHttpRequest对象进行初始化，即调用open()方法，根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。</p>
            </td>
        </tr>
        <tr>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px" align="left"><tt>(2)载入完成</tt></p>
            </td>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px">此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据，并不能直接在客户端使用。值为2表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。</p>
            </td>
        </tr>
        <tr>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left" bgcolor="#ffffcc">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px" align="left"><tt>(3)交互</tt></p>
            </td>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left" bgcolor="#ffffcc">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px">此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式，为在客户端调用作好准备。状态3表示正在解析数据。</p>
            </td>
        </tr>
        <tr>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px" align="left"><tt>(4)完成</tt></p>
            </td>
            <td class="docTableCell" style="font-size: 12px; color: rgb(69,69,69); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif" valign="top" align="left">
            <p class="docText" style="margin: 5px auto; text-indent: 0px; line-height: 18px">此阶段确认全部数据都已经解析为客户端可用的格式，解析已经完成。值为4表示数据解析完毕，可以通过XMLHttpRequest对象的相应属性取得数据。</p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">概而括之，整个XMLHttpRequest对象的生命周期应该包含如下阶段：<br />
创建－初始化请求－发送请求－接收数据－解析数据－完成</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">在具体应用中，明确了readyState的五个状态（XMLHttpRequest对象的生命周期各个阶段）的含义，就可以消除对Ajax核心的神秘感（语焉不详的背后要么是故弄玄虚，制造神秘感；要么就是&#8220;以其昏昏，使人昭昭&#8221;），迅速把握其实质，对减少学习中的挫折感和增强自信心都极其有益。</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">比如，通过如下示例：</p>
<pre style="margin-top: 0px; margin-bottom: 0px">
<p class="code" style="margin: 5px auto; text-indent: 0px; line-height: 19px">
//声明数组
var states ＝ [&#8220;正在初始化&#8230;&#8230;&#8221;,
&#8220;正在初始化请求&#8230;&#8230;成功！
正在发送请求&#8230;&#8230;&#8221;,
&#8220;成功！
正在接收数据&#8230;&#8230;&#8221;,
&#8220;完成！
正在解析数据&#8230;&#8230;&#8221;,
&#8220;完成！
&#8221;];
//回调函数内部代码片段
if (xmlHttp.readyState==4)
{
var span = document.createElement(&#8220;span&#8221;);
span.innerHTML = states[xmlHttp.readyState];
document.body.appendChild(span);
if (xmlHttp.status == 200)
{
var xmldoc = xmlHttp.responseXML;
//其他代码
}
//别忘记销毁，防止内存泄漏
xmlHttp = null;
}else{
var span = document.createElement(&#8220;span&#8221;);
span.innerHTML = states[xmlHttp.readyState];
document.body.appendChild(span);
}</p>
</pre>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">结果如下：</p>
<p class="code" style="margin: 5px auto; text-indent: 0px; line-height: 19px">正在初始化请求&#8230;&#8230;成功！<br />
正在发送请求&#8230;&#8230;成功！<br />
正在接收数据&#8230;&#8230;完成！<br />
正在解析数据&#8230;&#8230;完成！</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">我们很容易明白XMLHttpRequest对象在各个阶段都在做什么。因此，也就很容易对Ajax的核心部分有一个真正简单明了的理解。</p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px"><span style="color: red; line-height: 19px">本博PS：readyState一般用在异步请求时程序响应的判断，Iframe， javaScript脚本同样适用,参考另一篇文章：</span><a style="color: rgb(26,139,200); text-decoration: none" href="http://d-tune.javaeye.com/blog/506074" target="_blank"><span style="color: red; line-height: 19px">http://d-tune.javaeye.com/blog/506074</span></a></p>
<p style="margin: 5px auto; text-indent: 0px; line-height: 19px">文章出处：<a style="color: rgb(26,139,200); text-decoration: none" href="http://www.cn-cuckoo.com/2007/07/16/the-details-for-five-states-of-readystate-9.html" target="_blank">http://www.cn-cuckoo.com/2007/07/16/the-details-for-five-states-of-readystate-9.html</a></p>
</span></span><img src ="http://www.blogjava.net/hulizhong/aggbug/322942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2010-06-07 09:19 <a href="http://www.blogjava.net/hulizhong/archive/2010/06/07/322942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 JavaScript:全面解析Ajax跨站数据传输和iframe跨域名js调用(6种方法)</title><link>http://www.blogjava.net/hulizhong/archive/2009/12/16/306196.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 16 Dec 2009 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/12/16/306196.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/306196.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/12/16/306196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/306196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/306196.html</trackback:ping><description><![CDATA[转 http://blog.youmila.com/?p=513<br />
<br />
<p>关于跨域名问题还是问题么，这方面的解决实践非常多，今天我就旧话重提把我所知道的通过几个应用场景来分别总结一下</p>
<p>先说明一点：我说的某某域名在您的控制下的意思是这个域名下的网页由您来负责开发内部的JavaScript<br />
<span style="font-weight: bold">场景一</span>：将bbs.xxx.com的页面用iframe嵌入到www.xxx.com的中，如何在iframe内外使用js通信<br />
一级域名都是xxx.com 这个域名一定是在您的控制下，所以你只要在两个页面中同时升级域名即可<br />
在父窗口和iframe内部分别加上js语句：document.domain=&#8221;xxx.com&#8221;;<br />
之后2个页面就等于在同一域名下，通过window.parent oIframe.contentDocument就可以相互访问，进行无障碍的JS通信<br />
在新浪、淘宝等很多页面都能找到这样的语句。不过document.domain不可以随便指定，只能向上升级，从bbs.xxx.com升级到yyy.com肯定会出错</p>
<p><span style="font-weight: bold">场景二</span>：将www.yyy.com的页面用iframe嵌入到www.xxx.com的中，两个域名都在您的控制下，如何在iframe内外进行一定的数据交流<br />
你可以通过相互改变hash值的方式来进行一些数据的通信</p>
<p>这里的实现基于如下技术要点：<br />
1、父窗口通过改变子窗口的src中的hash值把一部分信息传入，如果src只有hash部分改变，那么子窗口是不会重新载入的。<br />
2、子窗口可以重写父窗口的location.href，但是注意这里子窗口无法读取而只能重写location.href所以要求前提是您控制两个域名，知道当前父窗口的location.href是什么并写在子窗口内，这样通过parent.location.href = &#8220;已知的父窗口的href&#8221;+&#8221;#&#8221;+hash。这样父窗口只有hash改变也不会重载。<br />
3、上面两步分别做到了两个窗口之间的无刷新数据通知，那么下面的来说如何感知数据变化。标准中没有相关规定，所以当前的任意浏览器遇到location.hash变化都不会触发任何javaScript事件，也就是说您要自己写监听函数来监视loaction.hash的值的变化。做法是通过setTimeout或者setInterval来写一个监听函数每20-100ms查看一下hash是否变化，如果变化了驱动js根据新的数据做想做的事情。</p>
<p>这种实现的一些分析：<br />
1、信息通道是双向的，当然会兼容单向，如果只是父窗口向子窗口通知数据，只需要子窗口写hash监听，反之亦然。<br />
2、局限性也是颇大，因为这种通信的前提是双方知道对方的location.href。如果父窗口带有动态的location.search也就是查询参数，那么子窗口的处理上就比较困难，需要把父窗口的location.search作为传递信息的一部分告知子窗口。<br />
3、另外的困扰会有浏览器带给你，IE之外的浏览器遇到hash的改变会记录历史，这样你在处理前进后退的时候会非常头疼</p>
<p><span style="font-weight: bold">场景三</span>：将www.yyy.com的页面用iframe嵌入到www.xxx.com的中，只有被嵌入的yyy.com在您的控制下，如何在iframe内外进行一定的交流<br />
真实场景：google adsence的一个需求，你希望google发现您的页面不能匹配出相关性非常好的按点击付费广告时，你希望google的广告iframe能够隐藏。<br />
google的广告iframe在google域下显然不能把自己隐藏掉，那么怎么办呢？<br />
1、google会提供给你一个html页面<br />
2、您将这个页面放置在您的域名下，并告诉google它的位置<br />
3、当google发现没有很好的广告时，会将子窗口的loaction重定向到您的那个页面下，这样您的页面因为同域名就可以访问父页面来隐藏自己了<br />
是不是很巧的方法？</p>
<p><span style="font-weight: bold">场景四</span>：您是内容发布商，如何改造接口，让其他域名下的页面可以从浏览器端出发获得您的数据<br />
我们知道ajax的xmlHttpRequest()说到底是一个无刷新请求服务器数据的辅助工具，但是xmlHttpRequest并不能跨域名请求数据，在某些情况下成了极大的限制。<br />
但是我们如果通过其他方式完成无刷新请求数据不也可以么，我们用Dom方法操作动态JS脚本请求来做这件事。<br />
&nbsp;&nbsp;&nbsp; //创建一个脚本节点<br />
&nbsp;&nbsp;&nbsp; var oScript = document.createElement(&#8217;script&#8217;);<br />
&nbsp;&nbsp;&nbsp; //指定脚本src src可以指向任意域名<br />
&nbsp;&nbsp;&nbsp; //注意src不再指向静态js，而是带着查询参数指向一个动态脚本广播服务。<br />
&nbsp;&nbsp;&nbsp; oScript.src = &#8220;http://yyy.com/query.php?&#8221;+yourQueryString;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; //如果指定了charset 同时还可以解决xmlHttpRequest另一大困扰 乱码问题&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;&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;&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; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; //oScript.charset = &#8220;utf-8&#8243;;<br />
&nbsp;&nbsp;&nbsp; //通过Dom操作把这个新的节点加入到文档当中&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; document.getElementsByTagName(&#8221;head&#8221;)[0].appendChild(oScript);</p>
<p>这样只要query.php的输出是可执行的javaScript脚本，比如：djsCallBack（{jsondata}）;<br />
当他从服务器返回后就会自动执行,你可以方便的用json方式来做数据传递了。<br />
要注意，您的脚本请求最好带上时间戳，避免浏览器缓存造成取回数据实时性下降。</p>
<p>如果您是数据提供者，您可以要求数据索取者在查询参数中提供回调函数名，比如query.php?callback=myDataHandler&amp;key=&#8230;?<br />
这样您就可以根据参数来提供给他myDataHandler({jsondata}),这样不同的数据索取者都会得到自定义的正确的异步回调。</p>
<p><span style="font-weight: bold">场景五</span>：通过后端程序语言，为了跨域名而做各自的后台数据抓取转化服务，比如php curl，YAHOO&nbsp; CHINA NCP就是用这种方案。</p>
<p><span style="font-weight: bold">场景六</span>：通过flash proxy，因为flash的跨域调用可以通过crossdomain.xml和security.allowdomain(&#8217;*')文件实现，而js又可以和flash进行通信，所以js完全可以借用flash</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现js跨域通信。</p>
<p>&nbsp;<br />
<span style="font-weight: bold">总结总结</span>：<br />
第一种场景，相应的处理办法有这非常好的效果，可以说完全解决了问题。<br />
第二种场景，相应的处理办法具有一定的跨域数据交流功效，具有相当大的局限，并不适合在复杂业务流程中应用，实际上我也确实也没看到过基于此的大规模应用。<br />
第三种场景，相应的处理办法比较巧妙，虽然redirect之后就不干你什么事了，但如果你是google一样面向众多域名的内容提供商，也是个不错的解决思路。<br />
第四种场景，相应的处理办法非常强大，对比Ajax可以看到，跨域名没问题，无刷新没问题，本身又是异步的，JSON比xml快的多，同时解决乱码问题，只是请求都是Get方式的，不能做Post方式的请求。多一种武器自然可以从容选择了。</p>
<p>第五种场景，处理很方便，也很实用。</p>
<p>第六种场景，需要一定的flash基础哈，作用当然非常强大。</p><img src ="http://www.blogjava.net/hulizhong/aggbug/306196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-12-16 17:51 <a href="http://www.blogjava.net/hulizhong/archive/2009/12/16/306196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化JavaScript代码</title><link>http://www.blogjava.net/hulizhong/archive/2009/12/14/305961.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Mon, 14 Dec 2009 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/12/14/305961.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/305961.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/12/14/305961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/305961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/305961.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我google一下,已有人翻译了此文.比我翻译的要好!是译言站翻译的见url: http://www.yeeyan.com/articles/view/92135/47626/dz原文见:http://code.google.com/intl/zh-CN/speed/articles/optimizing-javascript.html不合适的地方,请大家指出来!希望对你有用!...&nbsp;&nbsp;<a href='http://www.blogjava.net/hulizhong/archive/2009/12/14/305961.html'>阅读全文</a><img src ="http://www.blogjava.net/hulizhong/aggbug/305961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-12-14 21:43 <a href="http://www.blogjava.net/hulizhong/archive/2009/12/14/305961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何判断浏览器是否禁用Cookie</title><link>http://www.blogjava.net/hulizhong/archive/2009/12/07/304955.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Mon, 07 Dec 2009 01:17:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/12/07/304955.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/304955.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/12/07/304955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/304955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/304955.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Ｗeb开发中常用到Cookie，所以有时需要判断客户端浏览器是否禁用Cookie！我看了一个gmail的页面原码！它是这样写的，如下：<br />
<br />
var c="jscookietest=valid";<br />
document.cookie=c;<br />
if(document.cookie.indexOf(c)==-1)<br />
location="html/zh-CN/nocookies.html";<br />
//不支持Cookie<br />
<br />
原理是：先对Cookie赋值，然后再读取<br />
希望对大家有用！<img src ="http://www.blogjava.net/hulizhong/aggbug/304955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-12-07 09:17 <a href="http://www.blogjava.net/hulizhong/archive/2009/12/07/304955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript中的null和undefined</title><link>http://www.blogjava.net/hulizhong/archive/2009/12/05/304844.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Sat, 05 Dec 2009 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/12/05/304844.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/304844.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/12/05/304844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/304844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/304844.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; JavaScript中的null和undefined,感觉有点易混淆!把Ecma-262下载下来看了看!摘要如下:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; Undefined Value<br />
The undefined value is a primitive value used when a variable has not been assigned a value.<br />
4.3.10 Undefined Type<br />
The type Undefined has exactly one value, called undefined.<br />
4.3.11 Null Value<br />
The null value is a primitive value that represents the null, empty, or non-existent reference.<br />
4.3.12 Null Type<br />
The type Null has exactly one value, called null.<br />
<br />
感兴趣的可以看看如下文章:<br />
http://www.blogjava.net/hulizhong/archive/2009/10/22/299430.html<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/304844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-12-05 13:45 <a href="http://www.blogjava.net/hulizhong/archive/2009/12/05/304844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript中+运算符号</title><link>http://www.blogjava.net/hulizhong/archive/2009/12/04/304733.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Fri, 04 Dec 2009 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/12/04/304733.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/304733.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/12/04/304733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/304733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/304733.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 在一些框架中看到了类似这样的写法:+new Date();感觉有些怪,查阅了相关资料和一些网友的帮助.对此用法解释如下,希望对大家有所帮助,<strong>不合适的地方请大家指正</strong>!<br />
<span style="color: red"><strong>一,对于引用类型对象(我指的是String,Date,Object,Array,Function,Boolean)的+运算符运算过程如下!</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;1,首先调用此对象的valueOf方法,得到返回数值A<br />
&nbsp;&nbsp;&nbsp; 2,然后把此数值A转换成数字,得到的是最终数值&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; 我的测试如下:<br />
&nbsp;&nbsp;&nbsp;<br />
function w(s){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.writeln("&lt;br/&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.writeln(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.writeln("&lt;br/&gt;-----------------------------");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; String.prototype.valueOf=function(){return 1;};<br />
&nbsp;&nbsp;&nbsp;w(+new String("sss"));//输出1 <br />
&nbsp;&nbsp; String.prototype.valueOf=function(){return "a";};<br />
&nbsp;&nbsp;&nbsp; w(+new String("sss"));//输出NaN <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; Date.prototype.valueOf=function(){return 1;};<br />
&nbsp;&nbsp;&nbsp;w(+new Date());//输出1 <br />
&nbsp;&nbsp; Date.prototype.valueOf=function(){return "a";};<br />
&nbsp;&nbsp;&nbsp; w(+new Date());//输出NaN <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; Object.prototype.valueOf=function(){return 1;};<br />
&nbsp;&nbsp;&nbsp;w(+{});//输出1 <br />
&nbsp;&nbsp; Object.prototype.valueOf=function(){return "a";};<br />
&nbsp;&nbsp;&nbsp; w(+{});//输出NaN <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; Array.prototype.valueOf=function(){return 1;};<br />
&nbsp;&nbsp;&nbsp;w(+[]);//输出1 <br />
&nbsp;&nbsp; Array.prototype.valueOf=function(){return "a";};<br />
&nbsp;&nbsp;&nbsp; w(+[]);//输出NaN <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; var s=function(){};<br />
&nbsp;&nbsp; Function.prototype.valueOf=function(){return 1;};<br />
&nbsp;&nbsp;&nbsp;w(+s);//输出1 <br />
&nbsp;&nbsp; Function.prototype.valueOf=function(){return "a";};<br />
&nbsp;&nbsp;&nbsp; w(+s);//输出NaN <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; Boolean.prototype.valueOf=function(){return 1;};<br />
&nbsp;&nbsp;&nbsp;w(+new Boolean());//输出1 <br />
&nbsp;&nbsp; Boolean.prototype.valueOf=function(){return "a";};<br />
&nbsp;&nbsp; w(+new Boolean());//输出NaN <br />
<span style="color: red"><strong>二,对于基本数据数据类型,其值转换成数字</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;w(+5);//输出5<br />
&nbsp;&nbsp;&nbsp; w(+true);//输出1<br />
&nbsp;&nbsp;&nbsp; w(+false);//输出0<br />
&nbsp;&nbsp;&nbsp; w(+"ss");//输出NaN<br />
&nbsp;&nbsp;&nbsp; w(+"111");//输出111<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/304733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-12-04 10:00 <a href="http://www.blogjava.net/hulizhong/archive/2009/12/04/304733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于(new Date).getTime()的疑惑</title><link>http://www.blogjava.net/hulizhong/archive/2009/12/03/304600.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 03 Dec 2009 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/12/03/304600.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/304600.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/12/03/304600.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/304600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/304600.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;在看gmail页面原码的时候,有类似(new Date).getTime()/(new Image).src的写法.这样的写法与new Date().getTime()有什么不同?这样写有什么好处呢?<br />
不明白,那位知道给说一下!<img src ="http://www.blogjava.net/hulizhong/aggbug/304600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-12-03 13:34 <a href="http://www.blogjava.net/hulizhong/archive/2009/12/03/304600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于jquery-1.3.1.js中的window=this的理解</title><link>http://www.blogjava.net/hulizhong/archive/2009/11/05/301323.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 05 Nov 2009 10:19:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/11/05/301323.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/301323.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/11/05/301323.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/301323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/301323.html</trackback:ping><description><![CDATA[&nbsp;在jquery-1.3.1.js中发现了如下写法：<br />
&nbsp;var <br />
&nbsp;// Will speed up references to window, and allows munging its name.<br />
&nbsp;window = this,<br />
&nbsp;// Will speed up references to undefined, and allows munging its name.<br />
&nbsp;undefined<br />
&nbsp;<br />
&nbsp;从上面的注释可以得知：这些写是为了提高性能<br />
&nbsp;<br />
&nbsp;查了一下资料，得知这些写为什么能提高性能。<br />
&nbsp;首先,jquery-1.3.1.js的代码都写在一个匿名函数中,上面的代码就定义2个局部变量:window和undefined;<br />
&nbsp;window变量被赋值为this(既window对象,感觉有点迷惑人,只不过2个变量名一样而已);局部变量undefined没有<br />
&nbsp;赋值,但是在js代码预编译的时候会被赋值为window.undefined;这样在匿名函数内部引用window,undefined时候<br />
&nbsp;直接引用局部变量window,undefined就可以了!不用再向上引用全局变量的window,undefined;<br />
<br />
&nbsp;从本质上说,这里利用了<span style="color: red">函数的作用域</span>效果;当在函数内部调用window,undefined对象时候,系统会先在本地作用域<br />
&nbsp;查找,找到就调用;找不到,就到上一级的作用域查找;如此类推;<br />
&nbsp;<br />
&nbsp;不合适的地方,请大家指出!<img src ="http://www.blogjava.net/hulizhong/aggbug/301323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-11-05 18:19 <a href="http://www.blogjava.net/hulizhong/archive/2009/11/05/301323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 耦合异步脚本</title><link>http://www.blogjava.net/hulizhong/archive/2009/11/04/301074.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 04 Nov 2009 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/11/04/301074.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/301074.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/11/04/301074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/301074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/301074.html</trackback:ping><description><![CDATA[转 http://www.cnblogs.com/yslow/archive/2009/04/29/1446236.html<br />
<br />
<h1 class="postTitle">
<a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/yslow/archive/2009/04/29/1446236.html">耦合异步脚本</a>
</h1>
<a href="http://www.stevesouders.com/blog/2008/12/27/coupling-async-scripts/" target="_new">英文原文地址</a>
<div class="post-entry">
<p><em></em>&nbsp;</p>
<p>最近我的工作都是围绕<a href="http://sites.google.com/site/io/even-faster-web-sites">异步加载外部脚本(loading external scripts asynchronously) </a>展开。当外部脚本以普通方式加载时(<code>&lt;script src="..."&gt;</code>) 会阻塞页面内所有其它资源的下载和脚本下方元素的渲染.你可以查看<a href="http://stevesouders.com/hpws/move-scripts.php">将脚本放在底部(Put Scripts at the Bottom)</a>的样例的效果. 异步加载脚本会避免阻塞行为进而更快的加载页面.</p>
<p>异步加载脚本产生的问题是内嵌脚本使用外部脚本中定义的符号的问题. 如果内嵌脚本使用了异步加载的外部脚本符号，竞争条件下可能会导致未定义的符号错误。因此有必要保证异步脚本和内嵌脚本以下面方式进行耦合：在异步脚本下载完毕之前内嵌脚本不能被执行。</p>
<p style="margin-bottom: 4px;">下面有几种方式耦合异步脚本.</p>
<ul style="margin-top: 0px;">
    <li><em>window&#8217;s onload</em> - 内嵌脚本可以尝试使用窗口的<code>onload</code>事件. 实现起来非常简单，但是内嵌脚本不会尽可能早的执行.</li>
    <li style="margin-top: 4px;"><em>script&#8217;s onreadystatechange</em> - 内嵌脚本可以尝试使用脚本的<code>onreadystatechange</code>和<code>onload </code>事件(在所有流行的浏览器里面均需要你自己来实现) 代码比较长而复杂，但是可以确保在脚本下载完毕之后马上执行内嵌脚本.</li>
    <li style="margin-top: 4px;"><em>hardcoded callback</em> - 外部脚本可以修改为通过一个回调函数(callback function)来明确的调用内嵌脚本，如果外部脚本和内嵌脚本是一个团队开发的话，这样是没有问题的，但如果使用第3方的脚本，这就提供不了必要的灵活性。 </li>
</ul>
<p>在这个博客帖子里我讨论两个问题: 如何使用异步脚本加快页面,如何通过<a href="http://ejohn.org/blog/degrading-script-tags/" target="_new">Degrading Script Tags</a>模式耦合外部脚本和内嵌脚本. 我通过我最近刚刚完成的一个项目<a href="http://www.stevesouders.com/blog/2008/12/19/ua-profiler-improvements/">UA Profiler results sortable</a>图表来演示. 我还使用了Stuart Langridge的 <a href="http://www.kryogenix.org/code/browser/sorttable/">sorttable</a>排序脚本. 把他的脚本增加到我的页面并排序结果耗费了我大约5分钟.通过增加一点使用异步脚本和耦合脚本的工作量我可以使这个页面提高30%的加载速度</p>
<h3 style="margin-bottom: 4px;">普通Script标记</h3>
<p>最初我使用普通的方法(<code>&lt;script src="..."&gt;</code>)将Stuart Langridge的<a href="http://www.kryogenix.org/code/browser/sorttable/">sorttable</a>排序脚本加入到UA Profiler, 例子见<a href="http://stevesouders.com/ua/report.php?sortjs=normal" target="_new">Normal Script Tag</a>. HTTP瀑布图见图1.</p>
<p style="margin-left: 40px;"><img title="Normal Script Tags" alt="普通Script标记" src="http://stevesouders.com/images/sorttable-normal-577x69.jpg" height="69" width="577" /><br />
<strong>图1: 普通Script标记的瀑布图</strong></p>
<p>表格排序工作正常，但由于它使页面慢了许多，我并不满意. 图1中我们可以看到脚本(sorttable-async.js)阻塞了页面内唯一的后继HTTP请求(arrow-right- 20X9.gif), 造成页面加载变慢. 瀑布图是使用<a href="http://getfirebug.com/releases/index.html">Firebug 1.3 beta</a>来产生的(你也可以使用<a href="http://www.httpwatch.com/" target="_new">httpwatch</a>或<a href="http://www.networkbench.com/" target="_new">基调网络</a>的<a href="http://update.networkbench.com/client/3.0.3/WebWatch.exe" target="_new">webwatch工具</a>来查看效果)。 新版本的Firebug在<code>onload</code>事件发生的地方标记了一条红竖线. (蓝竖线是DOMContentLoaded事件.) 对于<a href="http://stevesouders.com/ua/report.php?sortjs=normal">普通Script标记</a> 来说, onload 事件在第487毫秒产生.</p>
<h3 style="margin-bottom: 4px;">异步加载脚本</h3>
<p>对初始页面渲染来说，脚本sorttable-async.js是没有必要的 - 表格被渲染之后才会排序. 这种情况(外部脚本不会被初始页面使用)是可以使用异步脚本加载的主要特征 . 例子<a href="http://stevesouders.com/ua/report.php?sortjs=async">异步加载脚本</a> 使用DOM方式异步加载:</p>
<div class="code">
<pre>var script = document.createElement('script');<br />
script.src = "sorttable-async.js";<br />
script.text = "sorttable.init()"; // 这会在下面解释<br />
document.getElementsByTagName('head')[0].appendChild(script);</pre>
</div>
<p><a href="http://stevesouders.com/ua/report.php?sortjs=async">异步加载脚本</a>的HTTP瀑布图见图2。注意我是如何使用异步加载技术来避免阻塞行为的 - sorttable-async.js和arrow-right-20&#215;9.gif 被同时下载. onload时间为429毫秒.</p>
<p style="margin-left: 40px;"><img title="Async Script Loading" alt="异步加载脚本" src="http://stevesouders.com/images/sorttable-async-529x69.jpg" height="69" width="529" /><br />
<strong>图2: 异步加载脚本的HTTP瀑布图</strong></p>
<h3 style="margin-bottom: 4px;">John Resig介绍的 Degrading Script Tags 模式</h3>
<p>例子<a href="http://stevesouders.com/ua/report.php?sortjs=async">异步加载脚本</a>使页面加载更快了，但仍旧有进一步提高的空间. 默认<a href="http://www.kryogenix.org/code/browser/sorttable/">sorttable</a>排序是通过在onload事件中增加<code>sorttable.init()</code>来触发。当外部脚本被加载完毕后内嵌脚本立即调用<code>sorttable.init()</code>能进一步提升性能. 在这种情况下,我使用的API仅仅是一个函数，但是我将尝试一个足够灵活的模式来支持更复杂的情况。</p>
<p>前面我列出了各种内嵌脚本和外部异步脚本耦合的方法: window&#8217;s onload, script&#8217;s onreadystatechange, 和 hardcoded callback. 这里,我使用了来自John Resig的被称为<a href="http://ejohn.org/blog/degrading-script-tags/">Degrading Script Tags</a>模式的技术。 John描述了如何耦合一个内嵌脚本和外部脚本，例如:</p>
<div class="code">
<pre>&lt;script src="jquery.js"&gt;<br />
jQuery("p").addClass("pretty");<br />
&lt;/script&gt;</pre>
</div>
<p>他提到的这个方法是使内联脚本在外部脚本下载完毕之后才开始执行。使用这种方式耦合内嵌脚本和外部脚本有几个好处:</p>
<ul>
    <li>更简单 - 将2个script标记替换为1个script标记</li>
    <li>更清晰 - 内嵌代码依赖于外部脚本的关系更为明显</li>
    <li>更安全 - 如果外部脚本下载失败，内嵌脚本就不会执行，避免抛出未定义的符号错误 </li>
</ul>
<p>当使用异步加载外部脚本时这也是一个很棒的模式。为了使用这个技术，我必须修改我的内嵌代码和外部脚本. 对于内嵌代码, 我增加了第3行来设置 <code>script.text</code>的属性. 为了耦合代码, 我在sorttable-async.js末尾增加了如下代码:</p>
<div class="code">
<pre>var scripts = document.getElementsByTagName("script");<br />
var cntr = scripts.length;<br />
while ( cntr ) {<br />
var curScript = scripts[cntr-1];<br />
if ( -1 != curScript.src.indexOf('sorttable-async.js') ) {<br />
eval( curScript.innerHTML );<br />
break;<br />
}<br />
cntr--;<br />
}</pre>
</div>
<p>此代码遍历网页的所有脚本，直到它找到脚本块本身 (此时脚本的<code>src</code>属性包含sorttable-async.js)，然后利用eval将代码(<code>sorttable.init ()</code>)增加到脚本触发运行. (备注:虽然内嵌代码使用text属性增加代码内容，但是需要使用innerHTML获取代码. 这是代码跨浏览器工作的必要保证) 经过这样的优化，外部脚本不会阻塞其它资源的下载，同时，内嵌代码也会尽可能早的执行.</p>
<h3 style="margin-bottom: 4px;">延迟加载</h3>
<p>通过延迟加载能更快的加载页面 (通过onload事件动态加载). 例如 <a href="http://stevesouders.com/ua/report.php?sortjs=lazy">Lazyload</a> 是在onload 事件中包含如下代码:</p>
<div class="code">
<pre>window.onload = function() {<br />
var script = document.createElement('script');<br />
script.src = "sorttable-async.js";<br />
script.text = "sorttable.init()";<br />
document.getElementsByTagName('head')[0].appendChild(script);<br />
}</pre>
</div>
<p>这种情况绝对需要脚本耦合技术，在onload事件里面的代码<code>sorttable.init()</code>不会被执行，因为此时onload事件已经发生,而sorttable-async.js还没被下载。延迟加载的好处是使onload事件更快的发生，见图3。红竖线表明onload事件发生在第320毫秒.</p>
<p style="margin-left: 40px;"><img title="Lazyloading" alt="延迟加载" src="http://stevesouders.com/images/sorttable-lazyload-519x69.jpg" height="69" width="519" /><br />
<strong>图3: 延迟加载的HTTP瀑布图</strong></p>
<h3 style="margin-bottom: 4px;">结论</h3>
<p>通过避免通常的阻塞行为，异步加载脚本和延迟加载脚本可以提高网页的加载时间. 下面是增加不同版本的<a href="http://www.kryogenix.org/code/browser/sorttable/">sorttable</a>排序例子代码：</p>
<ul>
    <li><a href="http://stevesouders.com/ua/report.php?sortjs=normal">普通Script标记</a> - 487毫秒</li>
    <li><a href="http://stevesouders.com/ua/report.php?sortjs=async">异步加载</a> - 429 毫秒</li>
    <li><a href="http://stevesouders.com/ua/report.php?sortjs=lazy">延迟加载</a> - ~320 毫秒 </li>
</ul>
<p>以上时间指的是onload事件发生的时间。</p>
</div>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/301074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-11-04 15:25 <a href="http://www.blogjava.net/hulizhong/archive/2009/11/04/301074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 解剖JavaScript中的null和undefined.</title><link>http://www.blogjava.net/hulizhong/archive/2009/10/22/299430.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 22 Oct 2009 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/10/22/299430.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/299430.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/10/22/299430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/299430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/299430.html</trackback:ping><description><![CDATA[转 http://www.playgoogle.com/view.asp?id=58<br />
<br />
<div class="post-body">
<p><span id="desc_content_0">在JavaScript开发中，被人问到：null与undefined到底有啥区别？<br />
&nbsp;&nbsp;&nbsp;&nbsp;一时间不好回答，特别是undefined，因为这涉及到undefined的实现原理。于是，细想之后，写下本文，请各位大侠拍砖。<br />
&nbsp;&nbsp;&nbsp;&nbsp;总所周知：null == undefined<br />
&nbsp;&nbsp;&nbsp;&nbsp;但是：null !== undefined<br />
&nbsp;&nbsp;&nbsp;&nbsp;那么这两者到底有啥区别呢？<br />
&nbsp;&nbsp;&nbsp;&nbsp;请听俺娓娓道来&#8230;<br />
<br />
<strong>null</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;这是一个对象，但是为空。因为是对象，所以 typeof null&nbsp;&nbsp;返回 &#8216;object&#8217; 。<br />
&nbsp;&nbsp;&nbsp;&nbsp;null 是 JavaScript 保留关键字。<br />
&nbsp;&nbsp;&nbsp;&nbsp;null 参与数值运算时其值会自动转换为 0 ，因此，下列表达式计算后会得到正确的数值：<br />
表达式：123 + null    结果值：123<br />
表达式：123 * null    结果值：0<br />
<br />
<strong>undefined</strong><br />
undefined是全局对象（global）的一个特殊属性，其值是未定义的。但 typeof undefined 返回 &#8216;undefined&#8217; 。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虽然undefined是有特殊含义的，但它确实是一个属性，而且是全局对象（window）的属性。请看下面的代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;alert(&#8217;undefined&#8217; in window);&nbsp;&nbsp; //输出：true<br />
&nbsp;&nbsp;&nbsp;&nbsp; var anObj = {};<br />
&nbsp;&nbsp;&nbsp;&nbsp; alert(&#8217;undefined&#8217; in anObj);&nbsp;&nbsp;&nbsp;&nbsp;//输出：false<br />
<br />
从中可以看出，undefined是window对象的一个属性，但却不是anObj对象的一个属性。<br />
<strong><br />
注意：</strong>尽管undefined是有特殊含义的属性，但却不是JavaScript的保留关键字。<br />
undefined参与任何数值计算时，其结果一定是NaN。<br />
顺便说一下，NaN是全局对象（global）的另一个特殊属性，Infinity也是。这些特殊属性都不是JavaScript的保留关键字！<span class="Apple-style-span" style="line-height: normal;"><span class="Apple-style-span" style="font-weight: bold; line-height: 18px;">全局对象是预定义的对象，作为 JavaScript 的全局函数和全局属性的占位符。通过使用全局对象，可以访问所有其他所有预定义的对象、函数和属性。全局对象不是任何对象的属性，所以它没有名称。<strong style="font-size: 12px;">全局对象只是一个对象，而不是类。既没有构造函数，也无法实例化一个新的全局对象。(感谢<span class="Apple-style-span" style="font-size: 14px; font-weight: bold; line-height: normal;"><a style="text-decoration: none;">sunder同学的留言<span class="Apple-style-span" style="font-size: 12px; font-weight: 800; line-height: 18px;">)</span></a></span></strong></span></span></span></p>
<p><span id="desc_content_0"><strong>提高undefined性能</strong><br />
当我们在程序中使用undefined值时，实际上使用的是global对象的undefined属性。<br />
同样，当我们定义一个变量但未赋予其初始值，例如：<br />
var aValue;<br />
这时，JavaScript在所谓的预编译时会将其初始值设置为对window.undefined属性的引用，<br />
于是，当我们将一个变量或值与undefined比较时，实际上是与window对象的undefined属性比较。这个比较过程中，JavaScript会搜索window对象名叫&#8217;undefined&#8217;的属性，然后再比较两个操作数的引用指针是否相同。<br />
由
于window对象的属性值是非常多的，在每一次与undefined的比较中，搜索window对象的undefined属性都会花费时
间。在需要频繁与undefined进行比较的函数中，这可能会是一个性能问题点。因此，在这种情况下，我们可以自行定义一个局部的undefined变
量，来加快对undefined的比较速度。例如：</span></p>
<p><span id="desc_content_0"><br />
</span></p>
<div class="code">&nbsp;&nbsp;&nbsp;&nbsp;function anyFunc()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var undefined;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//自定义局部undefined变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(x == undefined)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//作用域上的引用比较<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(y != undefined)&nbsp;&nbsp; //作用域上的引用比较<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};</div>
<p>&nbsp;</p>
<p><span id="desc_content_0">其
中，定义undefined局部变量时，其初始值会是对window.undefined属性值的引用。新定义的局部undefined变
量存在与该函数的作用域上。在随后的比较操作中，JavaScript代码的书写方式没有任何的改变，但比较速度却很快。因为作用域上的变量数量会远远少
于window对象的属性，搜索变量的速度会极大提高。<br />
这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因！</span></p>
</div>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/299430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-10-22 22:14 <a href="http://www.blogjava.net/hulizhong/archive/2009/10/22/299430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Dojo Javascript 编程规范</title><link>http://www.blogjava.net/hulizhong/archive/2009/10/22/299343.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 22 Oct 2009 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/10/22/299343.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/299343.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/10/22/299343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/299343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/299343.html</trackback:ping><description><![CDATA[<a href="http://code.google.com/p/grace/wiki/DojoStyle">转 http://code.google.com/p/grace/wiki/DojoStyle</a><br />
<br />
<h2><a name="前言">前言</a></h2>
<p><a name="前言">相当不错的 Javascript 编程风格规范，建议大家采用此规范编写 Javascript。原文链接： </a><a href="http://dojotoolkit.org/developer/StyleGuide" rel="nofollow">http://dojotoolkit.org/developer/StyleGuide</a> 。 </p>
<p>翻译（Translated by）：i.feelinglucky{at}gmail.com from <a href="http://www.gracecode.com/" rel="nofollow">http://www.gracecode.com</a> ，转载请注明出处、作者和翻译者，谢谢配合。 </p>
<p>本文地址： <a href="http://code.google.com/p/grace/wiki/DojoStyle" rel="nofollow">http://code.google.com/p/grace/wiki/DojoStyle</a> 。 </p>
<h2><a name="序">序</a></h2>
<p><a name="序">Any violation to this guide is allowed if it enhances readability. </a></p>
<p><a name="序">所有的代码都要变成可供他人容易阅读的。 </a></p>
<h2><a name="快读参考">快读参考</a></h2>
<p><a name="快读参考">核心 API 请使用下面的风格： </a></p>
<p>&nbsp;</p>
<table>
    <tbody>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid"><strong>结构</strong> </td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid"><strong>规则</strong> </td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid"><strong>注释</strong> </td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">模块</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">小写</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">不要使用多重语义（Never multiple words）</td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">类</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">骆驼</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid"></td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">公有方法</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">混合</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">其他的外部调用也可以使用 lower_case()，这样的风格</td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">公有变量</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">混合</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid"></td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">常量</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">骆驼 或 大写 </td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid"></td>
        </tr>
    </tbody>
</table>
<p><a name="快读参考">下面的虽然不是必要的，但建议使用： </a></p>
<p>&nbsp;</p>
<table>
    <tbody>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid"><strong>结构</strong> </td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid"><strong>规则</strong> </td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">私有方法</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">混合，例子：<tt>_mixedCase</tt></td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">私有变量</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">混合，例子：<tt>_mixedCase</tt></td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">方法（method）参数</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">混合，例子：<tt>_mixedCase, mixedCase</tt></td>
        </tr>
        <tr>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">本地（local）变量</td>
            <td style="border-right: rgb(170,170,170) 1px solid; padding-right: 5px; border-top: rgb(170,170,170) 1px solid; padding-left: 5px; padding-bottom: 5px; border-left: rgb(170,170,170) 1px solid; padding-top: 5px; border-bottom: rgb(170,170,170) 1px solid">混合，例子：<tt>_mixedCase, mixedCase</tt></td>
        </tr>
    </tbody>
</table>
<h2><a name="命名规范">命名规范</a></h2>
<ol>
    <li><a name="命名规范">变量名称 <em>必须为</em> 小写字母。 </a></li>
    <li><a name="命名规范">类的命名使用骆驼命名规则，例如： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="typ">Account</span><span class="pun">,</span><span class="pln"> </span><span class="typ">EventHandler</span></a></pre>
    <li><a name="命名规范">常量 <em>必须</em> 在对象（类）或者枚举变量的前部声明。枚举变量的命名必须要有实际的意义，并且其成员 <em>必须</em> 使用骆驼命名规则或使用大写： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="kwd">var</span><span class="pln"> </span><span class="typ">NodeTypes</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
    &nbsp; &nbsp; </span><span class="typ">Element</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"><br />
    &nbsp; &nbsp; DOCUMENT</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"><br />
    </span><span class="pun">}</span></a></pre>
    <li><a name="命名规范">简写单词 <em>不能使用</em> 大写名称作为变量名： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="pln">getInnerHtml</span><span class="pun">(),</span><span class="pln"> getXml</span><span class="pun">(),</span><span class="pln"> </span><span class="typ">XmlDocument</span></a></pre>
    <li><a name="命名规范">方法的命令 <em>必须</em> 为动词或者是动词短语： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="pln">obj</span><span class="pun">.</span><span class="pln">getSomeValue</span><span class="pun">()</span></a></pre>
    <li><a name="命名规范">公有类的命名 <em>必须</em> 使用混合名称（mixedCase）命名。 </a></li>
    <li><a name="命名规范">CSS 变量的命名 <em>必须</em> 使用其对应的相同的公共类变量。 </a></li>
    <li><a name="命名规范">私有类的变量属性成员 <em>必须</em> 使用混合名称（mixedCase）命名，并前面下下划线（<tt>_</tt>）。例如： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="kwd">var</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(){</span><span class="pln"><br />
    &nbsp; &nbsp;</span><span class="kwd">var</span><span class="pln"> _buffer</span><span class="pun">;</span><span class="pln"><br />
    &nbsp; &nbsp;</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">doSomething </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(){</span><span class="pln"><br />
    &nbsp; &nbsp;</span><span class="pun">};</span><span class="pln"><br />
    </span><span class="pun">}</span></a></pre>
    <li><a name="命名规范">变量如果设置为私有，则前面 <em>必须</em> 添加下划线。 </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="kwd">this</span><span class="pun">.</span><span class="pln">_somePrivateVariable </span><span class="pun">=</span><span class="pln"> statement</span><span class="pun">;</span></a></pre>
    <li><a name="命名规范">通用的变量 <em>必须</em> 使用与其名字一致的类型名称： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="pln">setTopic</span><span class="pun">(</span><span class="pln">topic</span><span class="pun">)</span><span class="pln"> </span><span class="com">// 变量 topic 为 Topic 类型的变量</span></a></pre>
    <li><a name="命名规范">所有的变量名 <em>必须</em> 使用英文名称。 </a></li>
    <li><a name="命名规范">变量如有较广的作用域（large scope），必须使用全局变量；此时可以设计成一个类的成员。相对的如作用域较小或为私有变量则使用简洁的单词命名。 </a></li>
    <li><a name="命名规范">如果变量有其隐含的返回值，则避免使用其相似的方法： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="pln">getHandler</span><span class="pun">();</span><span class="pln"> </span><span class="com">// 避免使用 getEventHandler()</span></a></pre>
    <li><a name="命名规范">公有变量必须清楚的表达其自身的属性，避免字义含糊不清，例如： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="typ">MouseEventHandler</span><span class="pun">，而非</span><span class="pln"> </span><span class="typ">MseEvtHdlr</span><span class="pun">。</span></a></pre>
    <blockquote><a name="命名规范">请再次注意这条规定，这样做得的好处是非常明显的。它能明确的表达表达式所定义的含义。例如： </a>
    <pre class="prettyprint"><a name="命名规范"><span class="pln">dojo</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">mouse</span><span class="pun">.</span><span class="typ">Handler</span><span class="pln"> </span><span class="com">// 而非 dojo.events.mouse.MouseEventHandler</span></a></pre>
    </blockquote>
    <li><a name="命名规范">类/构造函数 <em>可以使用</em> 扩展其基类的名称命名，这样可以正确、迅速的找到其基类的名称： </a></li>
    <pre class="prettyprint"><a name="命名规范"><span class="typ">EventHandler</span><span class="pln"><br />
    </span><span class="typ">UIEventHandler</span><span class="pln"><br />
    </span><span class="typ">MouseEventHandler</span></a></pre>
    <blockquote><a name="命名规范">基类可以在明确描述其属性的前提下，缩减其命名： </a>
    <pre class="prettyprint"><a name="命名规范"><span class="typ">MouseEventHandler</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> opposed to </span><span class="typ">MouseUIEventHandler</span><span class="pun">.</span></a></pre>
    </blockquote></ol>
    <h2><a name="特殊命名规范">特殊命名规范</a></h2>
    <ol>
        <li><a name="特殊命名规范">术语 "get/set" 不要和一个字段相连，除非它被定义为私有变量。 </a></li>
        <li><a name="特殊命名规范">前面加 "is" 的变量名 <em>应该</em> 为布尔值，同理可以为 "has", "can" 或者 "should"。 </a></li>
        <li><a name="特殊命名规范">术语 "compute" 作为变量名应为已经计算完成的变量。 </a></li>
        <li><a name="特殊命名规范">术语 "find" 作为变量名应为已经查找完成的变量。 </a></li>
        <li><a name="特殊命名规范">术语 "initialize" 或者 "init" 作为变量名应为已经实例化（初始化）完成的类或者其他类型的变量。 </a></li>
        <li><a name="特殊命名规范">UI （用户界面）控制变量应在名称后加控制类型，例如： leftComboBox, TopScrollPane。 </a></li>
        <li><a name="特殊命名规范">复数必须有其公共的名称约定（原文：Plural form MUST be used to name collections）。 </a></li>
        <li><a name="特殊命名规范">带有 "num" 或者 "count" 开头的变量名约定为数字（对象）。 </a></li>
        <li><a name="特殊命名规范">重复变量建议使用 "i", "j", "k" （依次类推）等名称的变量。 </a></li>
        <li><a name="特殊命名规范">补充用语必须使用补充词，例如： get/set, add/remove, create/destroy, start/stop, insert/delete, begin/end, etc. </a></li>
        <li><a name="特殊命名规范">能缩写的名称尽量使用缩写。 </a></li>
        <li><a name="特殊命名规范">避免产生歧义的布尔变量名称，例如： </a></li>
        <pre class="prettyprint"><a name="特殊命名规范"><span class="pln">isNotError</span><span class="pun">,</span><span class="pln"> isNotFound </span><span class="pun">为非法</span></a></pre>
        <li><a name="特殊命名规范">错误类建议在变量名称后加上 "Exception" 或者 "Error"。 </a></li>
        <li><a name="特殊命名规范">方法如果返回一个类，则应该在名称上说明返回什么；如果是一个过程，则应该说明做了什么。 </a></li>
    </ol>
    <h2><a name="文件">文件</a></h2>
    <ol>
        <li><a name="文件">缩进请使用 4 个空白符的制表位。 </a></li>
        <li><a name="文件">如果您的编辑器支持 <em>文件标签_（file tags），请加添如下的一行使我们的代码更容易阅读： </em></a></li>
        <pre class="prettyprint"><a name="文件"><em><span class="com">// vim:ts=4:noet:tw=0:</span></em></a></pre>
    </ol>
    <p><a name="文件"><em></em>译注：老外用 VIM 编辑器比较多，此条可以选择遵循。<em> </em></a></p>
    <ol>
        <li><a name="文件"><em>代码折叠必须看起来是完成并且是合乎逻辑的： </em></a></li>
        <a name="文件"><em></em></a>
        <pre class="prettyprint"><a name="文件"><span class="kwd">var</span><span class="pln"> someExpression </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Expression1</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="pun">+</span><span class="pln"> </span><span class="typ">Expression2</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="pun">+</span><span class="pln"> </span><span class="typ">Expression3</span><span class="pun">;</span><span class="pln"><br />
        <br />
        </span><span class="kwd">var</span><span class="pln"> o </span><span class="pun">=</span><span class="pln"> someObject</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="typ">Expression1</span><span class="pun">,</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="typ">Expression2</span><span class="pun">,</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="typ">Expression3</span><span class="pln"><br />
        </span><span class="pun">);</span></a></pre>
        <blockquote><a name="文件">注：表达式的缩进与变量声明应为一致的。 </a></blockquote></ol>
        <blockquote><a name="文件">注：函数的参数应采用明确的缩进，缩进规则与其他块保持一致。 </a></blockquote>
        <h2><a name="变量">变量</a></h2>
        <ol>
            <li><a name="变量">变量必须在声明初始化以后才能使用，即便是 NULL 类型。 </a></li>
            <li><a name="变量">变量不能产生歧义。 </a></li>
            <li><a name="变量">相关的变量集应该放在同一代码块中，非相关的变量集不应该放在同一代码块中。 </a></li>
            <li><a name="变量">变量应该尽量保持最小的生存周期。 </a></li>
            <li><a name="变量">循环/重复变量的规范： </a></li>
            <ol>
                <li><a name="变量">只有循环控制块的话，则必须使用 FOR 循环。 </a></li>
                <li><a name="变量">循环变量应该在循环开始前就被初始化；如使用 FOR 循环，则使用 FOR 语句初始化循环变量。 </a></li>
                <li><a name="变量">"do ... while" 语句是被允许的。 </a></li>
                <li><a name="变量">"break" 和 "continue" 语句仍然允许使用（但请注意）。 </a></li>
            </ol>
            <li><a name="变量">条件表达式 </a></li>
            <ol>
                <li><a name="变量">应该尽量避免复杂的条件表达式，如有必要可以使用临时布尔变量。 </a></li>
                <li><a name="变量">The nominal case SHOULD be put in the "if" part and the exception in the "else" part of an "if" statement. </a></li>
                <li><a name="变量">应避免在条件表达式中加入块。 </a></li>
            </ol>
            <li><a name="变量">杂项 </a></li>
            <ol>
                <li><a name="变量">尽量避免幻数（Magic numbers），他们应该使用常量来代替。 </a></li>
                <li><a name="变量">浮点变量必须指明小数点后一位（即使是 0）。 </a></li>
                <li><a name="变量">浮点变量必须指明实部，即使它们为零（使用 0. 开头）。 </a></li>
            </ol>
        </ol>
        <h2><a name="布局">布局</a></h2>
        <h3><a name="块">块</a></h3>
        <ol>
            <li><a name="块">普通代码段 <em>应该</em> 看起来如下： </a></li>
            <pre class="prettyprint"><a name="块"><span class="kwd">while</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">isDone</span><span class="pun">){</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; doSomething</span><span class="pun">();</span><span class="pln"><br />
            &nbsp; &nbsp; isDone </span><span class="pun">=</span><span class="pln"> moreToDo</span><span class="pun">();</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            <li><a name="块">IF 语句 <em>应该</em> 看起来像这样： </a></li>
            <pre class="prettyprint"><a name="块"><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">someCondition</span><span class="pun">){</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">someOtherCondition</span><span class="pun">){</span><span class="pln"><br />
            &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            <li><a name="块">FOR 语句 <em>应该</em> 看起来像这样： </a></li>
            <pre class="prettyprint"><a name="块"><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">initialization</span><span class="pun">;</span><span class="pln"> condition</span><span class="pun">;</span><span class="pln"> update</span><span class="pun">){</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            <li><a name="块">WHILE 语句 <em>应该</em> 看起来像这样： </a></li>
            <pre class="prettyprint"><a name="块"><span class="kwd">while</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">isDone</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; doSomething</span><span class="pun">();</span><span class="pln"><br />
            &nbsp; &nbsp; isDone </span><span class="pun">=</span><span class="pln"> moreToDo</span><span class="pun">();</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            <li><a name="块">DO ... WHILE 语句 <em>应该</em> 看起来像这样： </a></li>
            <pre class="prettyprint"><a name="块"><span class="kwd">do</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">condition</span><span class="pun">);</span></a></pre>
            <li><a name="块">SWITCH 语句 <em>应该</em> 看起来像这样： </a></li>
            <pre class="prettyprint"><a name="块"><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">condition</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            </span><span class="kwd">case</span><span class="pln"> ABC</span><span class="pun">:</span><span class="pln"><br />
            &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// &nbsp;fallthrough</span><span class="pln"><br />
            </span><span class="kwd">case</span><span class="pln"> DEF</span><span class="pun">:</span><span class="pln"><br />
            &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="kwd">default</span><span class="pun">:</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="kwd">break</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            <li><a name="块">TRY ... CATCH 语句 <em>应该</em> 看起来像这样： </a></li>
            <pre class="prettyprint"><a name="块"><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pun">(</span><span class="pln">ex</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">finally</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; statements</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            <li><a name="块">单行的 IF - ELSE，WHILE 或者 FOR 语句也 <em>必须</em> 加入括号，不过他们可以这样写： </a></li>
            <pre class="prettyprint"><a name="块"><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">condition</span><span class="pun">){</span><span class="pln"> statement</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
            </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">condition</span><span class="pun">){</span><span class="pln"> statement</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"><br />
            </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">intialization</span><span class="pun">;</span><span class="pln"> condition</span><span class="pun">;</span><span class="pln"> update</span><span class="pun">){</span><span class="pln"> statement</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></a></pre>
        </ol>
        <h3><a name="空白">空白</a></h3>
        <ol>
            <li><a name="空白">操作符 <em>建议</em> 使用空格隔开（包括三元操作符）。 </a></li>
            <li><a name="空白">下面的关键字 <em>避免使用</em> 空白隔开： </a></li>
            <ul>
                <li><a name="空白">break </a></li>
                <li><a name="空白">catch </a></li>
                <li><a name="空白">continue </a></li>
                <li><a name="空白">do </a></li>
                <li><a name="空白">else </a></li>
                <li><a name="空白">finally </a></li>
                <li><a name="空白">for </a></li>
                <li><a name="空白">function （如果为匿名函数，例如：var foo = function(){}; ） </a></li>
                <li><a name="空白">if </a></li>
                <li><a name="空白">return </a></li>
                <li><a name="空白">switch </a></li>
                <li><a name="空白">this </a></li>
                <li><a name="空白">try </a></li>
                <li><a name="空白">void </a></li>
                <li><a name="空白">while </a></li>
                <li><a name="空白">with </a></li>
            </ul>
            <li><a name="空白">下面的关键字必须使用空白隔开： </a></li>
            <ul>
                <li><a name="空白">case </a></li>
                <li><a name="空白">default </a></li>
                <li><a name="空白">delete </a></li>
                <li><a name="空白">function （如果为申明，例如：function foo(){}; ） </a></li>
                <li><a name="空白">in </a></li>
                <li><a name="空白">instanceof </a></li>
                <li><a name="空白">new </a></li>
                <li><a name="空白">throw </a></li>
                <li><a name="空白">typeof </a></li>
                <li><a name="空白">var </a></li>
            </ul>
            <li><a name="空白"><strong>逗号（,）</strong> <em>建议</em> 使用空白隔开。 </a></li>
            <li><a name="空白"><strong>冒号（:）</strong> <em>建议</em> 使用空白隔开。 </a></li>
            <li><a name="空白"><strong>点（.）</strong> 在后部 <em>建议</em> 使用空白隔开。 </a></li>
            <li><a name="空白"><strong>点（.）</strong> <em>避免</em> 在前部使用空白。 </a></li>
            <li><a name="空白"><strong>函数调用和方法</strong> <em>避免</em> 使用空白，例如：<tt> doSomething(someParameter); // 而非 doSomething (someParameter) </tt></a></li>
            <li><a name="空白"><strong>逻辑块</strong> 之间使用空行。 </a></li>
            <li><a name="空白"><strong>声明</strong> <em>建议</em> 对齐使其更容易阅读。 </a></li>
        </ol>
        <h3><a name="注释">注释</a></h3>
        <ol>
            <li><a name="注释">生涩的代码就 <em>没有必要</em> 添加注释了，首先您需要 <strong>重写</strong> 它们。 </a></li>
            <li><a name="注释">所有的注释请使用英文。 </a></li>
            <li><a name="注释">从已解决的方案到未开发的功能，注释 <em>必须</em> 与代码相关。 </a></li>
            <li><a name="注释">大量的变量申明后 <em>必须</em> 跟随一段注释。 </a></li>
            <li><a name="注释">注释需要说明的是代码段的用处，尤其是接下来的代码段。 </a></li>
            <li><a name="注释">注释 <em>没有必要</em> 每行都添加。 </a></li>
        </ol>
        <p><a name="注释"></a></p>
        <h2><a name="文档">文档</a></h2>
        <p><a name="文档">下面提供了一些基本的函数或者对象的描述方法： </a></p>
        <ul>
            <li><a name="文档"><strong>总结（summary）</strong>: 简短的表述此函数或者对象实现的目的 </a></li>
            <li><a name="文档"><strong>描述（description）</strong>: 对于此函数或者类的简短的描述 </a></li>
            <li><a name="文档"><strong>返回（return）</strong>: 描述此函数返回什么（并不包括返回类型） </a></li>
        </ul>
        <h3><a name="基本函数信息">基本函数信息</a></h3>
        <pre class="prettyprint"><a name="基本函数信息"><span class="kwd">function</span><span class="pun">(){</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// summary: Soon we will have enough treasure to rule all of New Jersey.</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// description: Or we could just get a new roomate.</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Look, you go find him. &nbsp;He don't yell at you.</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;All I ever try to do is make him smile and sing around</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;him and dance around him and he just lays into me.</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;He told me to get in the freezer 'cause there was a carnival in there.</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// returns: &nbsp;Look, a Bananarama tape!</span><span class="pln"><br />
        </span><span class="pun">}</span></a></pre>
        <h3><a name="对象函数信息">对象函数信息</a></h3>
        <p><a name="对象函数信息">没有返回值描述 </a></p>
        <pre class="prettyprint"><a name="对象函数信息"><span class="pun">{</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// summary: Dingle, engage the rainbow machine!</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// description: </span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Tell you what, I wish I was--oh my g--that beam,</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;coming up like that, the speed, you might wanna adjust that.</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;It really did a number on my back, there. I mean, and I don't</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;wanna say whiplash, just yet, cause that's a little too far,</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;but, you're insured, right?</span><span class="pln"><br />
        </span><span class="pun">}</span></a></pre>
        <h3><a name="函数的声明">函数的声明</a></h3>
        <p><a name="函数的声明">在有的情况下，对于函数的调用和声明是隐义（invisible）的。在这种情况下，我们没有办法在函数中加入说明等（供程序调用）。如果您遭遇了这种情况，您可以使用一个类来封装函数。 </a></p>
        <p><a name="函数的声明">注：此此方法只能在函数没有初始化的参数情况下。如过不是，则它们会被忽略。 </a></p>
        <pre class="prettyprint"><a name="函数的声明"><span class="pln">dojo</span><span class="pun">.</span><span class="pln">declare</span><span class="pun">(</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="str">"foo"</span><span class="pun">,</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="kwd">null</span><span class="pun">,</span><span class="pln"><br />
        &nbsp; &nbsp; </span><span class="pun">{</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// summary: Phew, this sure is relaxing, Frylock.</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// description: </span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Thousands of years ago, before the dawn of</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;man as we knew him, there was Sir Santa of Claus: an</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ape-like creature making crude and pointless toys out</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;of dino-bones, hurling them at chimp-like creatures with</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;crinkled hands regardless of how they behaved the</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;previous year.</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="com">// returns: Unless Carl pays tribute to the Elfin Elders in space.</span><span class="pln"><br />
        &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">}</span><span class="pln"><br />
        </span><span class="pun">);</span></a></pre>
        <h3><a name="参数">参数</a></h3>
        <ol>
            <li><a name="参数">简单类型 </a></li>
            <blockquote><a name="参数">简单的类型的参数可以直接在函数参数定义中注释说明。 </a>
            <pre class="prettyprint"><a name="参数"><span class="kwd">function</span><span class="pun">(</span><span class="com">/*String*/</span><span class="pln"> foo</span><span class="pun">,</span><span class="pln"> </span><span class="com">/*int*/</span><span class="pln"> bar</span><span class="pun">)...</span></a></pre>
            </blockquote>
            <li><a name="参数">可变类型参数 </a></li>
            <blockquote><a name="参数">下面是几个修饰符供参考： </a></blockquote>
            <ul>
                <li><a name="参数"><strong>?</strong> 可选参数 </a></li>
                <li><a name="参数"><strong>...</strong> 说面参数范围不确定 </a></li>
                <li><a name="参数"><strong>[]</strong> 数组 </a></li>
                <pre class="prettyprint"><a name="参数"><span class="kwd">function</span><span class="pun">(</span><span class="com">/*String?*/</span><span class="pln"> foo</span><span class="pun">,</span><span class="pln"> </span><span class="com">/*int...*/</span><span class="pln"> bar</span><span class="pun">,</span><span class="pln"> </span><span class="com">/*String[]*/</span><span class="pln"> baz</span><span class="pun">)...</span></a></pre>
            </ul>
            <li><a name="参数">全局参数描述 </a></li>
            <blockquote><a name="参数">如果你想增加一个描述，你可以将它们移至初始化块。 </a></blockquote></ol>
            <blockquote><a name="参数">基本信息格式为：<tt> *关键字* 描述字段 </tt>（<tt> *key* Descriptive sentence</tt>） </a></blockquote>
            <blockquote><a name="参数">参数和变量的格式为：<tt> *关键字* ~*类型*~ 描述字段 </tt>（<tt> *key* ~*type*~ Descriptive sentence</tt>） </a></blockquote>
            <blockquote><a name="参数">注：<tt> *关键字* 和 ~*类型*~ </tt>可以使用任何字母和数字表述。 </a>
            <pre class="prettyprint"><a name="参数"><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo</span><span class="pun">,</span><span class="pln"> bar</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// foo: String</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;used for being the first parameter</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// bar: int</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;used for being the second parameter</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            </blockquote>
            <h3><a name="变量">变量</a></h3>
            <p><a name="变量">由于实例变量、原型变量和外部变量的声明是一致的，所以有很多的方法声明、修改变量。具体的如何定义和定位应在变量最先出现的位置指明变量的名称、类型、作用域等信息。 </a></p>
            <pre class="prettyprint"><a name="变量"><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// myString: String</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// times: int</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;How many times to print myString</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// separator: String</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;What to print out in between myString*</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">myString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"placeholder text"</span><span class="pun">;</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">times </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span><span class="pln"><br />
            <br />
            foo</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">setString </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">myString</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">myString </span><span class="pun">=</span><span class="pln"> myString</span><span class="pun">;</span><span class="pln"><br />
            </span><span class="pun">}</span><span class="pln"><br />
            <br />
            foo</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">toString </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">times</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; dojo</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">myString</span><span class="pun">);</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; dojo</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">separator</span><span class="pun">);</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">}</span><span class="pln"><br />
            </span><span class="pun">}</span><span class="pln"><br />
            foo</span><span class="pun">.</span><span class="pln">separator </span><span class="pun">=</span><span class="pln"> </span><span class="str">"====="</span><span class="pun">;</span></a></pre>
            <h4><a name="对象中的变量注释">对象中的变量注释</a></h4>
            <p><a name="对象中的变量注释">应使用和对象值和方法一致的标注方式，比如在他们声明的时候： </a></p>
            <pre class="prettyprint"><a name="对象中的变量注释"><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// key: String</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A simple value</span><span class="pln"><br />
            &nbsp; &nbsp; key</span><span class="pun">:</span><span class="pln"> </span><span class="str">"value"</span><span class="pun">,</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// key2: String</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="com">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Another simple value</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            <h3><a name="返回值">返回值</a></h3>
            <p><a name="返回值">因为函数可以同时返回多个不同（类型）的值，所以应每个返回值之后加入返回类型的注释。注释在行内注释即可，如果所有的返回值为同一类型，则指明返回的类型；如为多个不同的返回值，则标注返回类型为"mixed"。 </a></p>
            <pre class="prettyprint"><a name="返回值"><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">arguments</span><span class="pun">.</span><span class="pln">length</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"You passed argument(s)"</span><span class="pun">;</span><span class="pln"> </span><span class="com">// String</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Boolean</span><span class="pln"><br />
            &nbsp; &nbsp; </span><span class="pun">}</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre>
            <h3><a name="伪代码（有待讨论）">伪代码（有待讨论）</a></h3>
            <p><a name="伪代码（有待讨论）">有时候您需要在函数或者类中添加对于此函数和类的功能性流程描述。如果您打算这样做，您可以使用 <tt>/*======== </tt>（= 字符最好出现 5 次或者更多），这样做的好处就是可以不用将这些东西加入代码（译注：原作者的意思可能为代码管理系统）。 </a></p>
            <p><a name="伪代码（有待讨论）">这样看起来在 <tt>/*===== </tt>和 <tt>=====*/ </tt>会有非常长的一段注释，等待功能调整完毕以后就可以考虑是否删除。 </a></p>
            <pre class="prettyprint"><a name="伪代码（有待讨论）"><span class="com">/*=====<br />
            module.pseudo.kwArgs = {<br />
            &nbsp; &nbsp; &nbsp; &nbsp; // url: String<br />
            &nbsp; &nbsp; // &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;The location of the file<br />
            &nbsp; &nbsp; url: "",<br />
            &nbsp; &nbsp; // mimeType: String<br />
            &nbsp; &nbsp; // &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;text/html, text/xml, etc<br />
            &nbsp; &nbsp; mimeType: ""<br />
            }<br />
            =====*/</span><span class="pln"><br />
            <br />
            </span><span class="kwd">function</span><span class="pun">(</span><span class="com">/*module.pseudo.kwArgs*/</span><span class="pln"> kwArgs</span><span class="pun">){</span><span class="pln"><br />
            &nbsp; &nbsp; dojo</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="pln">kwArgs</span><span class="pun">.</span><span class="pln">url</span><span class="pun">);</span><span class="pln"><br />
            &nbsp; &nbsp; &nbsp; &nbsp; dojo</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="pln">kwArgs</span><span class="pun">.</span><span class="pln">mimeType</span><span class="pun">);</span><span class="pln"><br />
            </span><span class="pun">}</span></a></pre><img src ="http://www.blogjava.net/hulizhong/aggbug/299343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-10-22 13:40 <a href="http://www.blogjava.net/hulizhong/archive/2009/10/22/299343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 回忆我们经典的开发工具</title><link>http://www.blogjava.net/hulizhong/archive/2009/10/20/299010.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Tue, 20 Oct 2009 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/10/20/299010.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/299010.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/10/20/299010.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/299010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/299010.html</trackback:ping><description><![CDATA[转 http://blog.csdn.net/gaoweipeng/archive/2009/10/18/4695780.aspx<br />
平时的开发如果我们能有些得心应手的开发工具，就好比是如虎添翼。会大大的提高我们的开发效率。Visual Studio 自不必说，通过此文，和大家回忆下除此之外的经典的开发工具，同时希望能把这些经典的工具介绍给新手，相信对平日的开发会有很大的帮助。<br />
<br />
<img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/193608/o_comment.gif" border="0" height="24" width="32" /><strong style="font-size: 12pt;">Internet Explorer Developer Toolbar</strong><br style="font-size: 12pt;" />
<span style="color: red;">简介</span>：微软发布了Internet Explorer Developer Toolbar最新版.该产品让开发人员能够深入探索和理解Web页面,帮助开发者更好地创建Web应用.安装后可以在IE中快速分析网页的软件.该工具条可集成在IE窗口,或以浮动窗口形式存在.<br />
<img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/ittoolbar.gif" height="274" width="1273" /><br />
IE Developer Toolbar特性如下:<br />
<p>浏览和修改Web页的文档对象模型(DOM).通过多种技术方式定位、选定Web页上的特定元素.禁止或激活IE设置.查看HTML对象的类名、
ID,以及类似链接路径、tab顺序、快捷键等细节.描绘表格、单元格、图片或选定标签的轮廓.显示图片象素、大小、路径、替代文字等.即时重定义浏览器
窗口大小到800x600或自定义大小.清空浏览器缓存和cookie,被清除项可从所有对象或给定域中选择.直接访问关联W3C规范参考、IE开发组
blog或其他来源.－显示设计时标尺,帮助对齐对象. ....&nbsp;<br />
</p>
<p><span style="color: red; font-family: 宋体;">下载地址及相关资料：</span><a href="http://www.skycn.com/soft/24101.html" target="_blank"><br />
http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;DisplayLang=en#Overview</a></p>
<p><br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/193608/o_comment.gif" border="0" height="24" width="32" /><strong style="font-size: 12pt;">HttpWatch</strong><br style="font-size: 12pt;" />
<span style="color: red;">简介</span>：强大的<u>网页数据分析工具</u>。集成在Internet Explorer工具栏。包括网页摘要。Cookies管理。缓存管理。消息头发送/接受。字符查询。POST 数据和目录管理功能。报告输出。</p>
<p>安装完HttpWatch后，就会在浏览器中找到他：<br />
<img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/httpwatch2.gif" border="0" height="178" width="404" /><br />
主界面：<br />
<img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/httpwatch.gif" border="0" height="326" width="927" />&nbsp;<br />
<span style="color: red;">下载地址：</span><a href="http://www.crsky.com/soft/3455.html" target="_blank">http://www.crsky.com/soft/3455.html</a></p>
<p><span style="color: #ff0000;">使</span><span style="color: #ff0000;">用介绍：</span><a href="http://www.cnblogs.com/mayingbao/archive/2007/11/30/978530.html" target="_blank">http://www.cnblogs.com/mayingbao/archive/2007/11/30/978530.html</a> </p>
<p><br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/193608/o_comment.gif" border="0" height="24" width="32" /><strong style="font-size: 12pt;">Fiddler2</strong></p>
<p><span style="color: red;">简介</span>：Fiddler2是一个<u>网络调试代理</u>，用来监测本地计算
机和Internet之间所有的HTTP通讯。可以监测所有的HTTP通讯，设置断点，并且可以修改到进入到本地计算机的数据和从本地计算机出去的数据
（就是可以伪造数据）。Fiddler包含一个JScript .NET 事件脚本子系统（event-based scripting
subsystem），可以使用任何一种.Net语言扩展。该软件是免费的，支持多种浏览器，包括Internet Explorer，Mozilla
Firefox，Opera和其它一些浏览器。</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/fiddle2.gif" height="381" width="790" /><br />
</p>
<p>从Fiddler官方网站上可以看见原版的英文介绍：<a title="http://www.fiddler2.com/fiddler2/" href="http://www.fiddler2.com/fiddler2/" target="_blank">http://www.fiddler2.com/fiddler2/</a><br />
<span style="color: red;">下载地址：</span><a title="http://www.fiddler2.com/fiddler2/" href="http://www.fiddler2.com/fiddler2/" target="_blank">http://www.fiddler2.com/fiddler2/</a></p>
<p><span style="color: red;">使用介绍：</span><a href="http://blog.csdn.net/lihongzhai/archive/2009/09/14/4551035.aspx" target="_blank">http://blog.csdn.net/lihongzhai/archive/2009/09/14/4551035.aspx</a> </p>
<p><br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/193608/o_comment.gif" border="0" height="24" width="32" /><strong style="font-size: 12pt;">NUnit&nbsp;</strong></p>
<p>NUnit是一个<u>单元测试框架</u>，专门针对于。NET来写的.其实在前面有JUnit(Java)，CPPUnit(C++)，他们都是xUnit的一员。最初它是从JUnit而来。现在的版本是2.2.接下来我所用的都是基于这个版本。</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/NUnit.1.jpg" height="315" width="554" /></p>
<p><span style="color: red;">下载地址：</span><a href="http://www.nunit.org/index.php" target="_blank">http://www.nunit.org/index.php</a></p>
<p><span style="color: red;">使用介绍：</span><a href="http://www.uml.org.cn/net/200702273.asp" target="_blank">http://www.uml.org.cn/net/200702273.asp</a> </p>
<p><br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/193608/o_comment.gif" border="0" height="24" width="32" /><strong><span style="font-size: 12pt;">PowerDesigner</span></strong><br />
</p>
<p><span style="color: red;">简介：</span>PowerDesigner是Sybase公司的CASE工具集，使用它可以方便地对管理信息系统进行分析设计，它几乎包括了<u>数据库模型设计</u>的全过程。<br />
利用PowerDesigner可以制作数据流程图、概念数据模型、物理数据模型，可以生成多种客户端开发工具的应用程序，还可为数据仓库制作结构模型，也能对团队设计模型进行控制。<br />
</p>
<p>主要功能：DataArchitect：这是一个强大的数据库设计工具，使用DataArchitect
可利用实体-关系图为一个信息系统。创建"概念数据模型"－CDM（Conceptual Data Model）。并且可根据CDM
产生基于某一特定数据库管理系统（例如：Sybase System 11）的"物理数据模型"-PDM(Physical Data
Model)。还可优化PDM，产生为特定DBMS 创建数据库的SQL 语句并可以文件形式存储以便在其他时刻运行这些SQL
语句创建数据库。另外，DataArchitect还可根据已存在的数据库反向生成<br />
PDM，CDM 及创建数据库的SQL脚本。<br />
ProcessAnalyst：这部分用于创建功能模型和数据流图，创建"处理层次关系"。<br />
AppModeler：为客户/服务器应用程序创建应用模型。<br />
ODBC Administrator：此部分用来管理系统的各种数据源。<br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/PD_03_440.jpg" height="539" width="752" /><br />
</p>
<p><span style="color: red;">下载地址：</span><a href="http://www.baidu.com/s?tn=sitehao123&amp;bs=PowerDesigner&amp;f=3&amp;wd=powerdesigner%CF%C2%D4%D8&amp;oq=powerdesigner&amp;rsp=0" target="_blank">http://www.baidu.com/s?tn=sitehao123&amp;bs=PowerDesigner&amp;f=3&amp;wd=powerdesigner%CF%C2%D4%D8&amp;oq=powerdesigner&amp;rsp=0</a> ：)<br />
</p>
<p><span style="color: red;">使用介绍： </span><a href="http://www.cnblogs.com/yxonline/archive/2007/04.html" target="_blank">http://www.cnblogs.com/yxonline/archive/2007/04.html</a> <br />
</p>
<p><br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/193608/o_comment.gif" border="0" height="24" width="32" />&nbsp;<strong style="font-size: 12pt;">Reflector</strong></p>
<p><span style="color: red;">简介：</span>Visual Studio内置的ILDASM成为最初<u>挖掘程序集的上佳工具</u>。
但自从Reflector出现后，ILDASM相形见拙。因为，Reflector能提供更多的程序集信息。Reflector可以将.NET程序集中的
中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual
Basic以外，Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。<img alt="" src="http://www.cnblogs.com/gaoweipeng/admin/file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/moz-screenshot.png" /></p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/reflector.JPG" height="465" width="778" /><br />
</p>
<p><span style="color: red;">下载地址</span><span style="color: red;">： </span><a href="http://files.cnblogs.com/gaoweipeng/Reflector.rar" target="_blank">/Files/gaoweipeng/Reflector.rar</a></p>
<p><span style="color: red;">使用介绍及其他相关下载：</span><a href="http://www.cnblogs.com/zzy2740/archive/2005/09/20/240216.html" target="_blank">http://www.cnblogs.com/zzy2740/archive/2005/09/20/240216.html</a></p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/193608/o_comment.gif" border="0" height="24" width="32" /><strong style="font-size: 12pt;">1st JavaScript Editor</strong></p>
<p><span style="color: red;">简介：</span> 1st JavaScript Editor 是一款强大的<u>JavaScript开发、校验和调试工具</u>，
它简单易用，不论你是初学者或者是专业的开发人士，都可以轻松上手！同时它又是完美的Ajax (Asynchronous JavaScript
and XML),CSS, HTML, DOM DHTML开发工具！它提供了简单而且实用的功能：丰富的代码编辑功能(JavaScript,
HTML, CSS, VBScript, PHP ,ASP(Net))，语法高亮，内置预览功能，提供了完整的HTML 标记, HTML 属性,
HTML 事件, JavaScript 事件和JavaScript 函数等完整的代码库，同时有着贴心的代码自动补全功能。<br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/jsEdit.JPG" height="470" width="698" /><br />
</p>
<p>官网及下载地址：<span style="font-size: 10.5pt; font-family: 'Times New Roman';"><a href="http://yaldex.com/" target="_blank">http://yaldex.com/</a></span><br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/193608/o_comment.gif" border="0" height="24" width="32" /><strong style="font-size: 12pt;">Regulator</strong></p>
<p><span style="color: red;">简介</span>：使用Reglator可以方便的验证<u>正则表达式的执行结果</u>，带有智能感知功能。帮助文档是一个很好的学习正则的入门教程，也可以当作参考手册。基本上就全了，同时进行学习和实践。还有生成c# or vb.net代码等附加功能。 类似的软件现在很多：RegexBuddy ，RegexTester。等<br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/gaoweipeng/regulator_main_1245339666.png" height="424" width="682" /></p>
<p>&nbsp;<span style="color: red;">下载地址：</span><a title="" href="http://sourceforge.net/projects/regulator/" target="_blank">http://sourceforge.net/projects/regulator/</a></p>
<p>&nbsp;<span style="color: red;">使用介绍：</span><a href="http://www.ctochina.net/topic/ShowArticle/112.html" target="_blank">http://www.ctochina.net/topic/ShowArticle/112.html</a></p>
<p>&nbsp;小结：上面的开发工具都是我平时喜欢用的，希望通过此文的介绍，对没有使用过的朋友带来帮助。也希望园子中的朋友们<strong>秀一秀自己平时常用的开发工具</strong>，分享些更实用，方便的开发工具！</p>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/299010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-10-20 13:04 <a href="http://www.blogjava.net/hulizhong/archive/2009/10/20/299010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转　也来谈谈”完美”跨域</title><link>http://www.blogjava.net/hulizhong/archive/2009/09/30/296969.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 30 Sep 2009 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/09/30/296969.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/296969.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/09/30/296969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/296969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/296969.html</trackback:ping><description><![CDATA[转　http://ued.alipay.com/?p=707<br />
<br />
<p>关于跨域这个话题，很早就答应过要分享，但是因为懒，一直拖着，直到D2上有人谈起了&#8220;完美跨域&#8221;。&#8220;跨域&#8221;应该已经算不上什么难题了，只是提起&#8220;完美&#8221;这两个字，突然觉得有了新意，那就写点什么吧，至少对自己有个交代嘛！跨域方案有很多，接下来一一枚举，会给出demo，demo的宗旨是尽可能简单的让新手明白，各方案中跨域的原理，实际应用请酌情修改。</p>
<h4>方案一、剪贴板</h4>
<p><strong>原理：</strong>IE本身依附于windows平台的特性为我们提供了一种基于iframe，利用内存来&#8220;绕行&#8221;的方案，在这里我称之为，本地存储原理。</p>
<p><strong>缺点：</strong>不支持非IE浏览器，并且影响到用户对剪贴板的操作，用户体验非常不好，特别是在IE7下，受安全等级影响，会弹出提示框。</p>
<p><strong>演示：</strong>[ <a class="em" href="http://www.ioldfish.cn/wp-content/demo/domain/clipboard/a.html" target="_blank">点此阅览</a> ]</p>
<p>子页面在子域：<em>demo.ioldfish.cn</em>下，在页面中加入如下代码获取页面高度并存入剪贴板。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: green">var</span><span style="color: gray">&nbsp;</span><span style="color: blue">ua</span><span style="color: gray"> = </span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">userAgent</span><span style="color: gray">;</span>
    <li><span style="color: green">if</span><span style="color: gray">&nbsp;</span><span style="color: olive">((</span><span style="color: blue">i</span><span style="color: gray"> = </span><span style="color: blue">ua</span><span style="color: gray">.</span><span style="color: blue">indexOf</span><span style="color: olive">(</span><span style="color: #8b0000">"</span><span style="color: red">MSIE</span><span style="color: #8b0000">"</span><span style="color: olive">))</span><span style="color: gray"> &gt;= </span><span style="color: maroon">0</span><span style="color: olive">)</span><span style="color: gray">&nbsp;</span>
    <li><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">iObjH</span><span style="color: gray"> = </span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">documentElement</span><span style="color: gray">.</span><span style="color: blue">scrollHeight</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: blue">clipboardData</span><span style="color: gray">.</span><span style="color: blue">setData</span><span style="color: olive">(</span><span style="color: #8b0000">'</span><span style="color: red">text</span><span style="color: #8b0000">'</span><span style="color: gray">,</span><span style="color: teal">String</span><span style="color: olive">(</span><span style="color: blue">iObjH</span><span style="color: olive">))</span><span style="color: gray">;</span>
    <li><span style="color: olive">}</span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>主页面在主域：<em>www.ioldfish.cn</em>下，在页面中加入如下代码，获取剪贴板的值并赋值为子页面所在的iframe的高度。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: blue">onload</span><span style="color: gray"> = </span><span style="color: green">function</span><span style="color: olive">()</span>
    <li><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">iObj</span><span style="color: gray"> =</span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">getElementById</span><span style="color: olive">(</span><span style="color: #8b0000">'</span><span style="color: red">iId</span><span style="color: #8b0000">'</span><span style="color: olive">)</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: blue">iObj</span><span style="color: gray">.</span><span style="color: blue">style</span><span style="color: gray">.</span><span style="color: blue">height</span><span style="color: gray">=</span><span style="color: blue">parseInt</span><span style="color: olive">(</span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: blue">clipboardData</span><span style="color: gray">.</span><span style="color: blue">getData</span><span style="color: olive">(</span><span style="color: #8b0000">'</span><span style="color: red">text</span><span style="color: #8b0000">'</span><span style="color: olive">))</span><span style="color: gray">+</span><span style="color: #8b0000">'</span><span style="color: red">px</span><span style="color: #8b0000">'</span><span style="color: gray">;</span>
    <li><span style="color: olive">}</span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p class="More"></p>
<h4>方案二、document.domain</h4>
<p><strong>原理：</strong>设置了document.domain，欺骗浏览器</p>
<p><strong>缺点：</strong>无法实现不同主域之间的通讯。并且当在一个页面中还包含有其它的iframe时，会产生安全性异常，拒绝访问。</p>
<p><strong>演示：</strong>[ <a class="em" href="http://www.ioldfish.cn/wp-content/demo/domain/docdomain/a.html" target="_blank">点此阅览</a> ]</p>
<p>主页面在主域：<em>www.ioldfish.cn</em>下，子页面在子域：<em>demo.ioldfish.cn</em>下，在两个页面的头部都加入如下代码：</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">domain</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">ioldfish.cn</span><span style="color: #8b0000">"</span><span style="color: gray">;</span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<h4>方案三、通过JS获取hash值实现通讯</h4>
<p><strong>原理：</strong>hash可以实现跨域传值实现跨域通讯。</p>
<p><strong>缺点：</strong>对于父窗口URL参数动态生成的，处理过程比较复杂一些。并且IE之外的浏览器遇到hash的改变会记录历史，影响浏览器的前进后退功能，体验不佳。</p>
<p><strong>演示：</strong>[ <a class="em" href="http://www.ioldfish.cn/wp-content/demo/domain/hash/a2.html">点此阅览</a> ]</p>
<p>子页面在主域：<em>www.lzdaily.com</em>下，在页面中添加如下代码,因为hash是不受跨域限制的，所以可以将本页面的高度顺利的传送给主页面的hash。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">hashH</span><span style="color: gray"> = </span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">documentElement</span><span style="color: gray">.</span><span style="color: blue">scrollHeight</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">urlA</span><span style="color: gray"> = </span><span style="color: #8b0000">"</span><span style="color: red">http://www.ioldfish.cn/wp-content/demo/domain/hash/a2.html</span><span style="color: #8b0000">"</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: blue">parent</span><span style="color: gray">.</span><span style="color: blue">location</span><span style="color: gray">.</span><span style="color: blue">href</span><span style="color: gray">= </span><span style="color: blue">urlA</span><span style="color: gray">+</span><span style="color: #8b0000">"</span><span style="color: red">#</span><span style="color: #8b0000">"</span><span style="color: gray">+</span><span style="color: blue">hashH</span><span style="color: gray">; </span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>主页面在主域：<em>www.ioldfish.cn</em>下，在页面中添加如下代码，首先取得子页面传递过来的hash值，然后将hash值赋到子页面所在的iframe的高度上。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: blue">onload</span><span style="color: gray"> = </span><span style="color: green">function</span><span style="color: olive">()</span>
    <li><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">iObj</span><span style="color: gray"> = </span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">getElementById</span><span style="color: olive">(</span><span style="color: #8b0000">'</span><span style="color: red">iId</span><span style="color: #8b0000">'</span><span style="color: olive">)</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">if</span><span style="color: olive">(</span><span style="color: blue">location</span><span style="color: gray">.</span><span style="color: blue">hash</span><span style="color: olive">)</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: blue">iObj</span><span style="color: gray">.</span><span style="color: blue">style</span><span style="color: gray">.</span><span style="color: blue">height</span><span style="color: gray">=</span><span style="color: blue">location</span><span style="color: gray">.</span><span style="color: blue">hash</span><span style="color: gray">.</span><span style="color: blue">split</span><span style="color: olive">(</span><span style="color: #8b0000">"</span><span style="color: red">#</span><span style="color: #8b0000">"</span><span style="color: olive">)[</span><span style="color: maroon">1</span><span style="color: olive">]</span><span style="color: gray">+</span><span style="color: #8b0000">"</span><span style="color: red">px</span><span style="color: #8b0000">"</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: olive">}</span>
    <li><span style="color: olive">}</span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<h4>方案四、传hash值实现通讯改良版</h4>
<p><strong>原理：</strong>该方案通过&#8220;前端代理&#8221;的方式，实现hash的传值，体验上比之方案三有了很大的提升。</p>
<p><strong>缺点：</strong>对于父窗口URL参数动态生成的，处理过程比较复杂一些。</p>
<p><strong>演示：</strong>[ <a class="em" href="http://www.ioldfish.cn/wp-content/demo/domain/hashbetter/a.html" target="_blank">点此阅览</a> ]</p>
<p>子页面在主域：<em>www.lzdaily.com</em>下，在页面中添加如下代码,首先在页面里添加一个和主页面同域的iframe［也可动态生成］，他的作用就像是个跳板。C页面中不需任何代码，只要确保有个页面就防止404错误就可以了！该方法通过修改iframe的name值同样可以跨域传值，只是比较&#8221;猥琐&#8220;而已。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: olive">&lt;</span><span style="color: green">iframe</span><span style="color: gray"> </span><span style="color: #00008b">id</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">iframeC</span><span style="color: #8b0000">"</span><span style="color: gray"> </span><span style="color: #00008b">name</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">iframeC</span><span style="color: #8b0000">"</span><span style="color: gray"> </span><span style="color: #00008b">src</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">http://www.ioldfish.cn/wp-content/demo/domain/hashbetter/c.html</span><span style="color: #8b0000">"</span><span style="color: gray"> </span><span style="color: #00008b">frameborder</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">0</span><span style="color: #8b0000">"</span><span style="color: gray"> </span><span style="color: #00008b">height</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">0</span><span style="color: #8b0000">"</span><span style="color: olive">&gt;&lt;/</span><span style="color: green">iframe</span><span style="color: olive">&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>然后在页面中加上如下代码，利用页面C的URL接收hash值，并负责把hash值传给同域下的主页面。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: blue">hashH</span><span style="color: gray"> = </span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">documentElement</span><span style="color: gray">.</span><span style="color: blue">scrollHeight</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: blue">urlC</span><span style="color: gray"> = </span><span style="color: #8b0000">"</span><span style="color: red">http://www.ioldfish.cn/wp-content/demo/domain/hashbetter/c.html</span><span style="color: #8b0000">"</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">getElementById</span><span style="color: olive">(</span><span style="color: #8b0000">"</span><span style="color: red">iframeC</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray">.</span><span style="color: blue">src</span><span style="color: gray">=</span><span style="color: blue">urlC</span><span style="color: gray">+</span><span style="color: #8b0000">"</span><span style="color: red">#</span><span style="color: #8b0000">"</span><span style="color: gray">+</span><span style="color: blue">hashH</span><span style="color: gray">; </span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>主页面在主域：<em>www.ioldfish.cn</em>下，在页面中添加如下代码，获取从C页面中传递过来的hash值。这里应用到一个技巧，就是直接从A页面用<em>frames["iId"].frames["iframeC"].location.hash</em>,可以直接访问并获取C页面的hash值。这样一来，通过代理页面传递hash值，比起方案三，大大提高了用户体验。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: blue">onload</span><span style="color: gray"> = </span><span style="color: green">function</span><span style="color: olive">()</span>
    <li><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">iObj</span><span style="color: gray"> = </span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">getElementById</span><span style="color: olive">(</span><span style="color: #8b0000">'</span><span style="color: red">iId</span><span style="color: #8b0000">'</span><span style="color: olive">)</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: blue">iObjH</span><span style="color: gray"> = </span><span style="color: blue">frames</span><span style="color: olive">[</span><span style="color: #8b0000">"</span><span style="color: red">iId</span><span style="color: #8b0000">"</span><span style="color: olive">]</span><span style="color: gray">.</span><span style="color: blue">frames</span><span style="color: olive">[</span><span style="color: #8b0000">"</span><span style="color: red">iframeC</span><span style="color: #8b0000">"</span><span style="color: olive">]</span><span style="color: gray">.</span><span style="color: blue">location</span><span style="color: gray">.</span><span style="color: blue">hash</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: blue">iObj</span><span style="color: gray">.</span><span style="color: blue">style</span><span style="color: gray">.</span><span style="color: blue">height</span><span style="color: gray"> = </span><span style="color: blue">iObjH</span><span style="color: gray">.</span><span style="color: blue">split</span><span style="color: olive">(</span><span style="color: #8b0000">"</span><span style="color: red">#</span><span style="color: #8b0000">"</span><span style="color: olive">)[</span><span style="color: maroon">1</span><span style="color: olive">]</span><span style="color: gray">+</span><span style="color: #8b0000">"</span><span style="color: red">px</span><span style="color: #8b0000">"</span><span style="color: gray">;</span>
    <li><span style="color: olive">}</span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<h4>方案五、JSONP</h4>
<p><strong>原理：</strong>有点脚本注入的味道</p>
<p><strong>缺点：</strong>服务器端程序运行比脚本早，跨域交互时无法捕获前端页面元素的相关数据，比如自适应高度。</p>
<p><strong>演示：</strong>[ <a class="em" href="http://www.ioldfish.cn/wp-content/demo/domain/jsonp/a.html" target="_blank">点此阅览</a> ]</p>
<p>主页面在主域：<em>www.ioldfish.cn</em>下，在页面中添加如下代码，动态创建一个script，然后指定到子域的动态文件，在动态文件后面可以添加参数，在这里我加了一个回调函数，当请求返回后，会运行这个回调函数。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: green">function</span><span style="color: gray">&nbsp;</span><span style="color: blue">loadContent</span><span style="color: olive">()</span>
    <li><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">scriptDom</span><span style="color: gray">=</span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">createElement</span><span style="color: olive">(</span><span style="color: #8b0000">'</span><span style="color: red">script</span><span style="color: #8b0000">'</span><span style="color: olive">)</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">url</span><span style="color: gray"> = </span><span style="color: #8b0000">"</span><span style="color: red">http://www.lzdaily.com/domain/jsonp/Test.aspx?f=setDivContent'</span><span style="color: #8b0000">"</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: blue">scriptDom</span><span style="color: gray">.</span><span style="color: blue">src</span><span style="color: gray">= </span><span style="color: blue">url</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">body</span><span style="color: gray">.</span><span style="color: blue">appendChild</span><span style="color: olive">(</span><span style="color: blue">scriptDom</span><span style="color: olive">)</span><span style="color: gray">;</span>
    <li><span style="color: olive">}</span><span style="color: gray">&nbsp;</span>
    <li><span style="color: green">function</span><span style="color: gray">&nbsp;</span><span style="color: blue">setDivContent</span><span style="color: olive">(</span><span style="color: blue">love</span><span style="color: olive">)</span>
    <li><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">fishDiv</span><span style="color: gray"> = </span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">getElementById</span><span style="color: olive">(</span><span style="color: #8b0000">"</span><span style="color: red">oldFish</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: blue">fishDiv</span><span style="color: gray">.</span><span style="color: blue">innerHTML</span><span style="color: gray"> = </span><span style="color: blue">love</span><span style="color: gray">; </span>
    <li><span style="color: olive">}</span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>子页面在主域：<em>www.lzdaily.com</em>下，在页面中添加如下代码，首先先取得主页面传过来的回调函数名，然后生成一段javascript代码，以回调函数带参数的形式返回主页面，这样就完成了跨域之间的通讯。由于服务器端程序执行总是优先于javascript代码，所以基本上没办法获取到子页面中DOM的相关数据，所以小白同学，我可以很负责人的告诉你，想通过这种方法实现跨域自适应高度是不可能的！</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">language</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">C#</span><span style="color: #8b0000">"</span><span style="color: gray"> </span><span style="color: blue">runat</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">server</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: green">void</span><span style="color: gray">&nbsp;</span><span style="color: blue">Page_Load</span><span style="color: olive">(</span><span style="color: blue">object</span><span style="color: gray"> </span><span style="color: blue">sender</span><span style="color: gray">, </span><span style="color: blue">EventArgs</span><span style="color: gray"> </span><span style="color: blue">e</span><span style="color: olive">)</span>
    <li><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: blue">string</span><span style="color: gray">&nbsp;</span><span style="color: blue">f</span><span style="color: gray"> = </span><span style="color: blue">Request</span><span style="color: gray">.</span><span style="color: blue">QueryString</span><span style="color: olive">[</span><span style="color: #8b0000">"</span><span style="color: red">f</span><span style="color: #8b0000">"</span><span style="color: olive">]</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: blue">Response</span><span style="color: gray">.</span><span style="color: blue">Clear</span><span style="color: olive">()</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: blue">Response</span><span style="color: gray">.</span><span style="color: blue">ContentType</span><span style="color: gray"> = </span><span style="color: #8b0000">"</span><span style="color: red">application/x-javascript</span><span style="color: #8b0000">"</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: blue">Response</span><span style="color: gray">.</span><span style="color: blue">Write</span><span style="color: olive">(</span><span style="color: teal">String</span><span style="color: gray">.</span><span style="color: blue">Format</span><span style="color: olive">(</span><span style="color: gray">@</span><span style="color: #8b0000">"</span><span style="color: red">{0}({1});</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: blue">f</span><span style="color: gray">,</span><span style="color: maroon">1122</span><span style="color: olive">))</span><span style="color: gray">;</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: blue">Response</span><span style="color: gray">.</span><span style="color: blue">End</span><span style="color: olive">()</span><span style="color: gray">;</span>
    <li><span style="color: olive">}</span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<h4>方案六、window.name</h4>
<p><strong>原理：</strong>window.name本身并不能实现跨域，只是中间做了代理。</p>
<p><strong>缺点：</strong>获取异域的前端页面元素值有一定局限性，比如取自适应高度的值。但是此方法在前端页面元素的数据交互上明显比JSONP强。</p>
<p><strong>演示：</strong>[ <a class="em" href="http://hikejun.com/demo/windowname/demo_windowname.html" target="_blank">点此阅览</a> ]</p>
<p>这个方案，YAHOO的同事已经给出了详细的demo，我就不重复了，演示demo出自YAHOO<em>克军</em>之手。详细的说明可以参看&#8220;<a href="http://www.planabc.net/" target="_blank">怿飞的BLOG&#8221;</a>，个人觉得方案四比window.name适用面更广一些。</p>
<h4>方案七、window.navigator</h4>
<p><strong>原理：</strong>window.navigator这个对象是在所有的Iframe中均可以访问的对象。应该是IE的一个漏洞！</p>
<p><strong>缺点：</strong>不支持IE外的浏览器下的跨域。严格的dtd申明后，该方法失效！</p>
<p><strong>演示：</strong>[ <a class="em" href="http://www.ioldfish.cn/wp-content/demo/domain/navigator/a.html" target="_blank">点此阅览</a> ]</p>
<p>主页面在主域：<em>www.ioldfish.cn</em>下，首先先申明一个Json用来保存所有页面的高度<em>window.navigator.PagesHeight={&#8221;":0};</em>，然后根据name的属性找到页面的数据<em>window.navigator.getData</em>，最后将页面的数据注册到<em>window.navigator.PagesHeight</em>中。这里还定义了一个函数<em>resetIframeData</em>，在页面加载的时候调用它，完成跨域的数据交互。注释中详细说明了参数的作用。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">PagesHeight</span><span style="color: gray">=</span><span style="color: olive">{</span><span style="color: #8b0000">""</span><span style="color: gray">:</span><span style="color: maroon">0</span><span style="color: olive">}</span><span style="color: gray">;&nbsp; &nbsp; </span>
    <li><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">getData</span><span style="color: gray">=</span><span style="color: green">function</span><span style="color: olive">(</span><span style="color: blue">pageName</span><span style="color: olive">)</span><span style="color: gray">&nbsp;</span><span style="color: olive">{</span><span style="color: gray">&nbsp; &nbsp; &nbsp; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">return</span><span style="color: gray"> </span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">PagesHeight</span><span style="color: olive">[</span><span style="color: blue">pageName</span><span style="color: olive">]</span><span style="color: gray">;&nbsp;&nbsp; </span>
    <li><span style="color: olive">}</span><span style="color: gray">;&nbsp; &nbsp; </span>
    <li><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">putData</span><span style="color: gray">=</span><span style="color: green">function</span><span style="color: olive">(</span><span style="color: blue">pageName</span><span style="color: gray">,</span><span style="color: blue">pageHeight</span><span style="color: olive">)</span><span style="color: gray">&nbsp;</span>
    <li><span style="color: olive">{</span><span style="color: gray">&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">PagesHeight</span><span style="color: olive">[</span><span style="color: blue">pageName</span><span style="color: olive">]</span><span style="color: gray">=</span><span style="color: blue">pageHeight</span><span style="color: gray">;&nbsp;&nbsp; </span>
    <li><span style="color: olive">}</span><span style="color: gray">;</span></li>
</ol>
</div>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: #ffa500">/*</span>
    <li><span style="color: #ffa500">*iframeId:页面中iframe的标识id</span>
    <li><span style="color: #ffa500">*key:子页面自定义的json标识,这里就是子页面定义的"PortalData".</span>
    <li><span style="color: #ffa500">*defaultData:无法取到值时候调用</span>
    <li><span style="color: #ffa500">*/</span>
    <li><span style="color: green">function</span><span style="color: gray">&nbsp;</span><span style="color: blue">resetIframeData</span><span style="color: olive">(</span><span style="color: blue">iframeId</span><span style="color: gray">,</span><span style="color: blue">key</span><span style="color: gray">,</span><span style="color: blue">defualtData</span><span style="color: olive">)</span>
    <li><span style="color: olive">{</span><span style="color: gray">&nbsp; &nbsp; &nbsp; &nbsp; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">obj</span><span style="color: gray">=</span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">getElementById</span><span style="color: olive">(</span><span style="color: blue">iframeId</span><span style="color: olive">)</span><span style="color: gray">;&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">if</span><span style="color: olive">(</span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">getData</span><span style="color: olive">)</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: olive">{</span><span style="color: gray">&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp; </span><span style="color: green">var</span><span style="color: gray">&nbsp;</span><span style="color: blue">pageHeight</span><span style="color: gray"> = </span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">getData</span><span style="color: olive">(</span><span style="color: blue">key</span><span style="color: olive">)</span><span style="color: gray">;&nbsp; </span>
    <li><span style="color: gray">&nbsp; </span><span style="color: green">if</span><span style="color: olive">(</span><span style="color: blue">pageHeight</span><span style="color: gray"> &amp;&amp; </span><span style="color: teal">String</span><span style="color: olive">(</span><span style="color: blue">pageHeight</span><span style="color: olive">)</span><span style="color: gray">.</span><span style="color: blue">match</span><span style="color: olive">(</span><span style="color: #8b0000">/</span><span style="color: red">\d+</span><span style="color: #8b0000">/</span><span style="color: olive">))</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: olive">{</span><span style="color: gray">&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: blue">obj</span><span style="color: gray">.</span><span style="color: blue">style</span><span style="color: gray">.</span><span style="color: blue">height</span><span style="color: gray">=</span><span style="color: blue">pageHeight</span><span style="color: gray">+</span><span style="color: #8b0000">'</span><span style="color: red">px</span><span style="color: #8b0000">'</span><span style="color: gray">;&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp; </span><span style="color: olive">}</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: green">else</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: olive">{</span><span style="color: gray">&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp;&nbsp; </span><span style="color: blue">obj</span><span style="color: gray">.</span><span style="color: blue">style</span><span style="color: gray">.</span><span style="color: blue">height</span><span style="color: gray">=</span><span style="color: blue">defualtData</span><span style="color: gray"> + </span><span style="color: #8b0000">'</span><span style="color: red">px</span><span style="color: #8b0000">'</span><span style="color: gray">;&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp; </span><span style="color: olive">}</span><span style="color: gray">&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: olive">}</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">else</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: olive">{</span><span style="color: gray">&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp; </span><span style="color: blue">obj</span><span style="color: gray">.</span><span style="color: blue">style</span><span style="color: gray">.</span><span style="color: blue">height</span><span style="color: gray">=</span><span style="color: blue">defualtData</span><span style="color: gray"> + </span><span style="color: #8b0000">'</span><span style="color: red">px</span><span style="color: #8b0000">'</span><span style="color: gray">;&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: olive">}</span><span style="color: gray">&nbsp; &nbsp; &nbsp; </span>
    <li><span style="color: olive">}</span><span style="color: gray">&nbsp;</span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>子页面在主域：<em>www.lzdaily.com</em>下，获取到页面高度后，将高度存到主页定义的Json中，Json标识为&#8221;PortalData&#8221;，这里可以自定义。</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline"><span style="color: gray">&lt;</span><span style="color: blue">script</span><span style="color: gray"> </span><span style="color: blue">type</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">text/javascript</span><span style="color: #8b0000">"</span><span style="color: gray">&gt;</span>
    <li><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: blue">onload</span><span style="color: gray"> = </span><span style="color: green">function</span><span style="color: gray">&nbsp;</span><span style="color: blue">getPageData</span><span style="color: olive">()</span>
    <li><span style="color: olive">{</span><span style="color: gray">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">var</span><span style="color: gray"> </span><span style="color: blue">pageHeight</span><span style="color: gray"> = </span><span style="color: teal">document</span><span style="color: gray">.</span><span style="color: blue">body</span><span style="color: gray">.</span><span style="color: blue">scrollHeight</span><span style="color: gray">;&nbsp;&nbsp; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: green">if</span><span style="color: olive">(</span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">putData</span><span style="color: olive">)</span>
    <li><span style="color: gray">&nbsp;</span><span style="color: olive">{</span>
    <li><span style="color: gray">&nbsp; </span><span style="color: teal">window</span><span style="color: gray">.</span><span style="color: teal">navigator</span><span style="color: gray">.</span><span style="color: blue">putData</span><span style="color: olive">(</span><span style="color: #8b0000">"</span><span style="color: red">PortalData</span><span style="color: #8b0000">"</span><span style="color: gray">,</span><span style="color: blue">pageHeight</span><span style="color: olive">)</span><span style="color: gray">; </span>
    <li><span style="color: gray">&nbsp;</span><span style="color: olive">}</span>
    <li><span style="color: olive">}</span><span style="color: gray">&nbsp; </span>
    <li><span style="color: gray">&lt;</span><span style="color: #8b0000">/</span><span style="color: red">script&gt;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>其实通过css也可以实现跨域，数据获取的实质其实就是动态载入一段CSS，然后解析其中的字段提取数据，这个方法比较&#8220;猥琐&#8221;，再这里就不多介绍了，当然flash也可以实现跨域，只是还没去实践，实践完了再补充。啥时候能补完呢？恩&#8230;&#8230;</p>
<p>以上这么多方案，有可以&#8220;完美跨域&#8221;的吗？单一的看，我想没有吧，都有缺陷，但是只要不同情况下使用合适的方法，我想这才是最完美的！原来绕了一圈，我只是再说废话，哎！不论怎么样，还是希望这些废话对还在苦苦追求&#8220;完美&#8221;的同学们有所启发！</p><img src ="http://www.blogjava.net/hulizhong/aggbug/296969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-09-30 09:05 <a href="http://www.blogjava.net/hulizhong/archive/2009/09/30/296969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>clientHeight、offsetHeight和scrollHeight</title><link>http://www.blogjava.net/hulizhong/archive/2009/07/21/287689.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Tue, 21 Jul 2009 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/07/21/287689.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/287689.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/07/21/287689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/287689.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/287689.html</trackback:ping><description><![CDATA[转 http://www.cftea.com/c/751.asp<br />
<br />
<p>我们这里说说四种浏览器对 <span class="caution">document.body</span> 的&nbsp;clientHeight、offsetHeight 和 scrollHeight 的解释，这里说的是 document.body，如果是 HTML 控件，则又有不同，<a href="http://www.cftea.com/c/2006/12/PCTKER6T0V62S854.asp" target="_blank">点击这里</a>查看。</p>
<p>这四种浏览器分别为IE（Internet Explorer）、NS（Netscape）、Opera、FF（FireFox）。</p>
<p><span class="caution">文尾的重要说明比较重要，请注意。</span></p>
<p><strong>clientHeight<br />
</strong>大家对 clientHeight 都没有什么异议，都认为是内容可视区域的高度，也就是说页面浏览器中可以看到内容的这个区域的高度，一般是最后一个工具条以下到状态栏以上的这个区域，与页面内容无关。</p>
<p><strong>offsetHeight<br />
</strong>IE、Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框。<br />
NS、FF 认为 offsetHeight 是网页内容实际高度，可以小于 clientHeight。</p>
<p><strong>scrollHeight</strong><br />
IE、Opera 认为 scrollHeight 是网页内容实际高度，可以小于 clientHeight。<br />
NS、FF 认为 scrollHeight 是网页内容高度，不过最小值是 clientHeight。</p>
<p><strong>简单地说</strong><br />
clientHeight 就是透过浏览器看内容的这个区域高度。<br />
NS、FF 认为
offsetHeight 和 scrollHeight 都是网页内容高度，只不过当网页内容高度小于等于 clientHeight
时，scrollHeight 的值是 clientHeight，而 offsetHeight 可以小于 clientHeight。<br />
IE、Opera 认为 offsetHeight 是可视区域&nbsp;clientHeight 滚动条加边框。scrollHeight 则是网页内容实际高度。</p>
<p><strong>同理</strong><br />
clientWidth、offsetWidth 和 scrollWidth 的解释与上面相同，只是把高度换成宽度即可。</p>
<p><span class="chapterTitle">重要说明</span></p>
<p>以上是在没有指定 DOCTYPE 的情况下，如果指定了 DOCTYPE，比如：DTD XHTML 1.0 Transitional，则意义又会不同，在这种情况下这三个值都是同一个值，都表示内容的<strong>实际</strong>高度。新版本的浏览器大多支持根据页面指定的 DOCTYPE 来启用不同的解释器。下载或浏览<a href="http://www.cftea.com/c/751/PX8O1XEX53RM4DIW.htm" target="_blank">测试文件</a>。
如果要在指定的 DOCTYPE 下按上述意义来应用，怎么办呢？答案是：将 document.body 和
document.documentElement 一起应用，比如：document.documentElement.scrollLeft ||
document.body.scrollLeft（一般将 document.documentElement 写在前面），类似应用请参见：<a href="http://www.cftea.com/c/2008/06/U1FSRIC247DWTK2M.asp" target="_blank">http://www.cftea.com/c/2008/06/U1FSRIC247DWTK2M.asp</a>。</p>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/287689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-07-21 17:44 <a href="http://www.blogjava.net/hulizhong/archive/2009/07/21/287689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 JavaScript中的传值与传引用</title><link>http://www.blogjava.net/hulizhong/archive/2009/07/15/286799.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 15 Jul 2009 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/07/15/286799.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/286799.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/07/15/286799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/286799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/286799.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">转 http://www.blogjava.net/magicdoom/archive/2006/02/27/32555.html</span><strong><span lang="EN-US"><br />
</span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">1.</span></strong><strong><span style="font-family: 宋体;">传值</span><span lang="EN-US">(by value)<o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-family: 宋体;">变量的值被复制出一份</span><span lang="EN-US">,</span><span style="font-family: 宋体;">与原来的值将不相干</span><span lang="EN-US">,</span><span style="font-family: 宋体;">也就是说即使新的值被修改</span><span lang="EN-US">,</span><span style="font-family: 宋体;">原来的值也不会改变</span><span lang="EN-US">,</span><span style="font-family: 宋体;">在</span><span lang="EN-US">JavaScript</span><span style="font-family: 宋体;">中基本类型都是传值的</span><span lang="EN-US">.</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">function</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> testPassValue()</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">{</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">var</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> m=1;</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">var</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> n=2;</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">将</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">m,n</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">的值复制一份</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">传递到</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">passValue</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span>passValue(m,n);</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #0064c8; font-family: 'Courier New';" lang="EN-US">alert</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">(m);<span>&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">将是原有的值</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">}</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">function</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> passValue(a,b)</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">{</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span>a = a+b; </span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">改变</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">a</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">的值</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">这里</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">a</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">只是原有值的一份</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">copy</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><span style="font-size: 10pt; color: #0064c8; font-family: 'Courier New';" lang="EN-US">alert</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">(a);<span>&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<pre><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">}</span></pre>
<pre><font face="宋体">输出结果<span lang="EN-US">:</span></font></pre>
<pre><span lang="EN-US"><font face="宋体">3</font></span></pre>
<pre><span lang="EN-US"><font face="宋体">1</font></span><span lang="EN-US"><o:p>&nbsp;</o:p></span></pre>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span lang="EN-US">2.</span></strong><strong><span style="font-family: 宋体;">传引用</span><span lang="EN-US">(by reference).<o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-family: 宋体;">引用本身复制一份传给</span><span lang="EN-US">function,</span><span style="font-family: 宋体;">引用指向的对象并没有被复制传递</span><span lang="EN-US">(java</span><span style="font-family: 宋体;">中也是如此</span><span lang="EN-US">),</span><span style="font-family: 宋体;">在</span><span lang="EN-US">function</span><span style="font-family: 宋体;">中</span><span lang="EN-US">,</span><span style="font-family: 宋体;">如果改变了对象的属性的值</span><span lang="EN-US">,</span><span style="font-family: 宋体;">由于和原来的引用指向的是同一个对象</span><span lang="EN-US">,</span><span style="font-family: 宋体;">因此在通过原来的引用访问到的将是修改过的值</span><span lang="EN-US">;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-family: 宋体;">但是如果只是在</span><span lang="EN-US">function</span><span style="font-family: 宋体;">中将引用指向一个新的对象</span><span lang="EN-US">,</span><span style="font-family: 宋体;">将不会改变原对象的值</span><span lang="EN-US">,</span><span style="font-family: 宋体;">改变的只是复制的这一份引用</span><span lang="EN-US">.</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US">(我的理解是:<span style="color: red;">当对象作为</span></span><span lang="EN-US"><span style="color: red;">参数</span></span><span lang="EN-US"><span style="color: red;">传给函数的时候，传递的是对象的拷贝</span>!)<br />
</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">function</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> testPassValue()</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">{</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">var</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> date = </span><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> </span><span style="font-size: 10pt; color: #0064c8; font-family: 'Courier New';" lang="EN-US">Date</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">(2006,02,27);</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><span style="font-size: 10pt; color: #0064c8; font-family: 'Courier New';" lang="EN-US">alert</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">(date.getDate());<span>&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">输出为</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US"> 27</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 5pt; text-indent: -5pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">将</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">date</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">引用本身复制一份</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">传递到</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">passReference,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">注意</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">date</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">所指向的对象并没有被复</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">制</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span>passReference(date);</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><span style="font-size: 10pt; color: #0064c8; font-family: 'Courier New';" lang="EN-US">alert</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">(date.getDate());<span>&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">输出为</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">12</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">同上</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span>changeReference(date);</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp; </span></span><span style="font-size: 10pt; color: #0064c8; font-family: 'Courier New';" lang="EN-US">alert</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">(date.getDate());<span>&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">输出还为</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">12 </span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">}</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">function</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> passReference(da)</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">&nbsp;//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">由于</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">da</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">和原引用指向的是同一个对象</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">在</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">function</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">外</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">通过原有的引用访问到的将是对象的</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">日期属性值</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">将是修改之后的值</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">.</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span>da.setDate(12);<span>&nbsp; </span><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">}</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">function</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> changeReference(da)</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">{</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">此时</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">da</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">引用实际上是原引用的一份</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">copy,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">将引用本身重新赋值</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">将不会影响原引用</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 5pt; text-indent: -5pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span>da= </span><strong><span style="font-size: 10pt; color: #0000c8; font-family: 'Courier New';" lang="EN-US">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"> </span><span style="font-size: 10pt; color: #0064c8; font-family: 'Courier New';" lang="EN-US">Date</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">(2007,05,11);<span>&nbsp; </span><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 5.05pt; text-indent: 5pt; text-align: left;" align="left"><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">//</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">将</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">da</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">引用指向一个新的对象</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">,</span><span style="font-size: 10pt; color: olive; font-family: 宋体;">此时原引用指向的还是原来的对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #0064c8; font-family: 'Courier New';" lang="EN-US">alert</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">(da.getDate());<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">// </span><span style="font-size: 10pt; color: olive; font-family: 宋体;">输出为</span><span style="font-size: 10pt; color: olive; font-family: 'Courier New';" lang="EN-US">11</span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 'Courier New';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">}</span></p><img src ="http://www.blogjava.net/hulizhong/aggbug/286799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-07-15 11:06 <a href="http://www.blogjava.net/hulizhong/archive/2009/07/15/286799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS:attachEvent和addEventListener 使用方法</title><link>http://www.blogjava.net/hulizhong/archive/2009/07/06/285686.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Mon, 06 Jul 2009 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/07/06/285686.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/285686.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/07/06/285686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/285686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/285686.html</trackback:ping><description><![CDATA[zhuan&nbsp; http://blog.csdn.net/tzsmin/archive/2009/01/15/3784683.aspx<br />
<br />
<div id="textboxContent" class="textbox-content">attachEvent方法，为某一事件附加其它的处理事件。（不支持Mozilla系列）<br />
<br />
addEventListener方法 用于 Mozilla系列<br />
<br />
举例:
<div class="code">
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">btn</span><span style="color: #000000;">"</span><span style="color: #000000;">).onclick&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;method1;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">btn</span><span style="color: #000000;">"</span><span style="color: #000000;">).onclick&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;method2;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">btn</span><span style="color: #000000;">"</span><span style="color: #000000;">).onclick&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;method3;</span></div>
</div>
</div>
如果这样写,那么将会只有medhot3被执行<br />
<br />
写成这样：<br />
<div class="code">
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;btn1Obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">btn1</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008000;">//</span><span style="color: #008000;">object.attachEvent(event,function);</span><span style="color: #008000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #000000;">btn1Obj.attachEvent(</span><span style="color: #000000;">"</span><span style="color: #000000;">onclick</span><span style="color: #000000;">"</span><span style="color: #000000;">,method1);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />btn1Obj.attachEvent(</span><span style="color: #000000;">"</span><span style="color: #000000;">onclick</span><span style="color: #000000;">"</span><span style="color: #000000;">,method2);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />btn1Obj.attachEvent(</span><span style="color: #000000;">"</span><span style="color: #000000;">onclick</span><span style="color: #000000;">"</span><span style="color: #000000;">,method3);</span></div>
</div>
</div>
执行顺序为method3-&gt;method2-&gt;method1<br />
<br />
如果是Mozilla系列，并不支持该方法，需要用到addEventListener
<div class="code">
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;btn1Obj&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">btn1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008000;">//</span><span style="color: #008000;">element.addEventListener(type,listener,useCapture);</span><span style="color: #008000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #000000;">btn1Obj.addEventListener(</span><span style="color: #000000;">"</span><span style="color: #000000;">click</span><span style="color: #000000;">"</span><span style="color: #000000;">,method1,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />btn1Obj.addEventListener(</span><span style="color: #000000;">"</span><span style="color: #000000;">click</span><span style="color: #000000;">"</span><span style="color: #000000;">,method2,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />btn1Obj.addEventListener(</span><span style="color: #000000;">"</span><span style="color: #000000;">click</span><span style="color: #000000;">"</span><span style="color: #000000;">,method3,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);</span></div>
</div>
</div>
执行顺序为method1-&gt;method2-&gt;method3<br />
<br />
使用实例：<br />
<br />
<div class="code">
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">1</span><span style="color: #000000;">。&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;el&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;EDITFORM_DOCUMENT.body;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008000;">//</span><span style="color: #008000;">先取得对象，EDITFORM_DOCUMENT实为一个iframe</span><span style="color: #008000;"><br />
<img id="_98_155_Open_Image" onclick="this.style.display='none'; document.getElementById('_98_155_Open_Text').style.display='none'; document.getElementById('_98_155_Closed_Image').style.display='inline'; document.getElementById('_98_155_Closed_Text').style.display='inline';" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="_98_155_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('_98_155_Closed_Text').style.display='none'; document.getElementById('_98_155_Open_Image').style.display='inline'; document.getElementById('_98_155_Open_Text').style.display='inline';" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(el.addEventListener)</span><span id="_98_155_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;">...</span><span id="_98_155_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;el.addEventListener(</span><span style="color: #000000;">'</span><span style="color: #000000;">click</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;KindDisableMenu,&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<img id="_181_228_Open_Image" onclick="this.style.display='none'; document.getElementById('_181_228_Open_Text').style.display='none'; document.getElementById('_181_228_Closed_Image').style.display='inline'; document.getElementById('_181_228_Closed_Text').style.display='inline';" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="_181_228_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('_181_228_Closed_Text').style.display='none'; document.getElementById('_181_228_Open_Image').style.display='inline'; document.getElementById('_181_228_Open_Text').style.display='inline';" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" alt="" align="top" />}</span></span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(el.attachEvent)</span><span id="_181_228_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;">...</span><span id="_181_228_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;el.attachEvent(</span><span style="color: #000000;">'</span><span style="color: #000000;">onclick</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;KindDisableMenu);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #000000;">2</span><span style="color: #000000;">。&nbsp;<br />
<img id="_263_312_Open_Image" onclick="this.style.display='none'; document.getElementById('_263_312_Open_Text').style.display='none'; document.getElementById('_263_312_Closed_Image').style.display='inline'; document.getElementById('_263_312_Closed_Text').style.display='inline';" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="_263_312_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('_263_312_Closed_Text').style.display='none'; document.getElementById('_263_312_Open_Image').style.display='inline'; document.getElementById('_263_312_Open_Text').style.display='inline';" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(window.addEventListener)&nbsp;</span><span id="_263_312_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;">...</span><span id="_263_312_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;window.addEventListener(</span><span style="color: #000000;">'</span><span style="color: #000000;">load</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;_uCO,&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<img id="_343_382_Open_Image" onclick="this.style.display='none'; document.getElementById('_343_382_Open_Text').style.display='none'; document.getElementById('_343_382_Closed_Image').style.display='inline'; document.getElementById('_343_382_Closed_Text').style.display='inline';" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="_343_382_Closed_Image" style="display: none;" onclick="this.style.display='none'; document.getElementById('_343_382_Closed_Text').style.display='none'; document.getElementById('_343_382_Open_Image').style.display='inline'; document.getElementById('_343_382_Open_Text').style.display='inline';" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" alt="" align="top" />}</span></span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(window.attachEvent)&nbsp;</span><span id="_343_382_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;">...</span><span id="_343_382_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;window.attachEvent(</span><span style="color: #000000;">'</span><span style="color: #000000;">onload</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;_uCO);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
</div>
</div>
</div>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/285686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-07-06 14:28 <a href="http://www.blogjava.net/hulizhong/archive/2009/07/06/285686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于正则表达式的贪婪与非贪婪模式</title><link>http://www.blogjava.net/hulizhong/archive/2009/07/06/285630.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Mon, 06 Jul 2009 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/07/06/285630.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/285630.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/07/06/285630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/285630.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/285630.html</trackback:ping><description><![CDATA[转 http://blog.csdn.net/kongbu0622/archive/2009/02/04/3862089.aspx<br />
<br />
<p style="text-indent: 2em;">以前看正则表达式，但没有注意到正则表达式的贪婪与非贪婪模式，今天在经典上看到了这么段代码：</p>
<p style="text-indent: 2em;">&lt;script&gt;</p>
<p style="text-indent: 2em;">try{</p>
<p style="text-indent: 2em;">str="&lt;p&gt;abcdefg&lt;/p&gt;&lt;p&gt;abcdefghijkl&lt;/p&gt;";</p>
<p style="text-indent: 2em;">re1=str.match(/&lt;p&gt;[\W\w]+?&lt;\/p&gt;/ig);</p>
<p style="text-indent: 2em;">alert("非贪婪模式:\r\n\r\n１："+re1[0]+"\r\n２："+re1[1]);</p>
<p style="text-indent: 2em;">re1=str.match(/&lt;p&gt;[\W\w]+&lt;\/p&gt;/ig);</p>
<p style="text-indent: 2em;">alert("贪婪模式:\r\n\r\n"+re1);</p>
<p style="text-indent: 2em;">re1=str.match(/&lt;p&gt;(.+?)&lt;\/p&gt;/i);</p>
<p style="text-indent: 2em;">alert("非贪婪模式，且不要标记:\r\n\r\n１："+re1[1]);</p>
<p style="text-indent: 2em;">re1=str.match(/&lt;p&gt;(.+)&lt;\/p&gt;/i);</p>
<p style="text-indent: 2em;">alert("贪婪模式，且不要标记:\r\n\r\n"+re1[1]);</p>
<p style="text-indent: 2em;">}catch(e){alert(e.description)}</p>
<p style="text-indent: 2em;">&lt;/script&gt;</p>
<p style="text-indent: 2em;">&nbsp;</p>
<p style="text-indent: 2em;">&nbsp;匹配次数中的贪婪与非贪婪</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;
在使用修饰匹配次数的特殊符号时，有几种表示方法可以使同一个表达式能够匹配不同的次数，比如："{m,n}", "{m,}", "?", "*",
"+"，具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中，总是尽可能多的匹配。比如，针对文本
"dxxxdxxxd"，举例如下： </p>
<table bgcolor="#f8f8f8" border="1" cellpadding="3" cellspacing="0">
    <tbody>
        <tr bgcolor="#f0f0f0">
            <td width="93">
            <p style="text-indent: 2em;">表达式</p>
            </td>
            <td>
            <p style="text-indent: 2em;">匹配结果</p>
            </td>
        </tr>
        <tr>
            <td>
            <p style="text-indent: 2em;"><a href="http://www.regexlab.com/zh/workshop.asp?pat=%28d%29%28%5Cw%2B%29&amp;txt=dxxxdxxxd"><span style="color: #3c8266;">(d)(\w+)</span></a></p>
            </td>
            <td>
            <p style="text-indent: 2em;">"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"</p>
            </td>
        </tr>
        <tr>
            <td>
            <p style="text-indent: 2em;"><a href="http://www.regexlab.com/zh/workshop.asp?pat=%28d%29%28%5Cw%2B%29%28d%29&amp;txt=dxxxdxxxd"><span style="color: #3c8266;">(d)(\w+)(d)</span></a></p>
            </td>
            <td>
            <p style="text-indent: 2em;">"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d"，但是为了使整个表达式匹配成功，"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"</p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp; 由此可见，"\w+"
在匹配的时候，总是尽可能多的匹配符合它规则的字符。虽然第二个举例中，它没有匹配最后一个 "d"，但那也是为了让整个表达式能够匹配成功。同理，带
"*" 和 "{m,n}" 的表达式都是尽可能地多匹配，带 "?" 的表达式在可匹配可不匹配的时候，也是尽可能的 "要匹配"。这
种匹配原则就叫作 "贪婪" 模式 。</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp; 非贪婪模式：</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp; 在修饰匹配次数的特殊符号后再加上一个 "?"
号，则可以使匹配次数不定的表达式尽可能少的匹配，使可匹配可不匹配的表达式，尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式，也叫作
"勉强"
模式。如果少匹配就会导致整个表达式匹配失败的时候，与贪婪模式类似，非贪婪模式会最小限度的再匹配一些，以使整个表达式匹配成功。举例如下，针对文本
"dxxxdxxxd" 举例： </p>
<table bgcolor="#f8f8f8" border="1" cellpadding="3" cellspacing="0">
    <tbody>
        <tr bgcolor="#f0f0f0">
            <td width="93">
            <p style="text-indent: 2em;">表达式</p>
            </td>
            <td>
            <p style="text-indent: 2em;">匹配结果</p>
            </td>
        </tr>
        <tr>
            <td>
            <p style="text-indent: 2em;"><a href="http://www.regexlab.com/zh/workshop.asp?pat=%28d%29%28%5Cw%2B%3F%29&amp;txt=dxxxdxxxd"><span style="color: #3c8266;">(d)(\w+?)</span></a></p>
            </td>
            <td>
            <p style="text-indent: 2em;">"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符，结果是："\w+?" 只匹配了一个 "x"</p>
            </td>
        </tr>
        <tr>
            <td>
            <p style="text-indent: 2em;"><a href="http://www.regexlab.com/zh/workshop.asp?pat=%28d%29%28%5Cw%2B%3F%29%28d%29&amp;txt=dxxxdxxxd"><span style="color: #3c8266;">(d)(\w+?)(d)</span></a></p>
            </td>
            <td>
            <p style="text-indent: 2em;">为了让整个表达式匹配成功，"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配，从而使整个表达式匹配成功。因此，结果是："\w+?" 匹配 "xxx"</p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp; 更多的情况，举例如下：</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E"><span style="color: #3c8266;">举
例1：表达式 "&lt;td&gt;(.*)&lt;/td&gt;" 与字符串
"&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;" 匹配时</span></a>，匹配的结果是：成功；匹配到
的内容是 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;" 整个字符串， 表达式中的 "&lt;/td&gt;"
将与字符串中最后一个 "&lt;/td&gt;" 匹配。 </p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp; <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%3F%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E"><span style="color: #3c8266;">举例2：相比之下，表达式 "&lt;td&gt;(.*?)&lt;/td&gt;" 匹配举例1中同样的字符串时</span></a>，将只得到 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt;"， 再次匹配下一个时，可以得到第二个 "&lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;"。</p>
<p style="text-indent: 2em;">&nbsp;function isTrueName(s)&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var patrn=/^[a-zA-Z]{1,30}$/;&nbsp; <br />
&nbsp;if (!patrn.exec(s)) return false&nbsp; <br />
&nbsp;return true&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;}}&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;//校验密码：只能输入6-20个字母、数字、下划线&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function isPasswd(s)&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var patrn=/^(\w){6,20}$/;&nbsp; <br />
&nbsp;if (!patrn.exec(s)) return false&nbsp; <br />
&nbsp;return true&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;//校验普通电话、传真号码：可以&#8220;+&#8221;开头，除数字外，可含有&#8220;-&#8221;&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function isTel(s)&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/;&nbsp; <br />
&nbsp;var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;&nbsp; <br />
&nbsp;if (!patrn.exec(s)) return false&nbsp; <br />
&nbsp;return true&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;//校验手机号码：必须以数字开头，除数字外，可含有&#8220;-&#8221;&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function isMobil(s)&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;&nbsp; <br />
&nbsp;if (!patrn.exec(s)) return false&nbsp; <br />
&nbsp;return true&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;//校验邮政编码&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function isPostalCode(s)&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;//var patrn=/^[a-zA-Z0-9]{3,12}$/;&nbsp; <br />
&nbsp;var patrn=/^[a-zA-Z0-9 ]{3,12}$/;&nbsp; <br />
&nbsp;if (!patrn.exec(s)) return false&nbsp; <br />
&nbsp;return true&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;//校验搜索关键字&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function isSearch(s)&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var patrn=/^[^`~!@$%^&amp;*()+=|\\\][\]\{\}:;'\,.&lt;&gt;/?]{1}[^`~!@$%^&amp;()+=|\\\]&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [\]\{\}:;'\,.&lt;&gt;?]{0,19}$/;&nbsp; <br />
&nbsp;if (!patrn.exec(s)) return false&nbsp; <br />
&nbsp;return true&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;function isIP(s) //by zergling&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var patrn=/^[0-9.]{1,20}$/;&nbsp; <br />
&nbsp;if (!patrn.exec(s)) return false&nbsp; <br />
&nbsp;return true&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;正则表达式&lt;/span&gt;&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;"^\\d+$"　　//非负整数（正整数 + 0）&nbsp; <br />
&nbsp;"^[0-9]*[1-9][0-9]*$"　　//正整数&nbsp;&nbsp; <br />
&nbsp;"^((-\\d+)|(0+))$"　　//非正整数（负整数 + 0）&nbsp;&nbsp; <br />
&nbsp;"^-[0-9]*[1-9][0-9]*$"　　//负整数&nbsp;&nbsp; <br />
&nbsp;"^-?\\d+$"　　　　//整数&nbsp;&nbsp; <br />
&nbsp;"^\\d+(\\.\\d+)?$"　　//非负浮点数（正浮点数 + 0）&nbsp;&nbsp; <br />
&nbsp;"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"　&nbsp; <br />
&nbsp;//正浮点数&nbsp;&nbsp; <br />
&nbsp;"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"　　//非正浮点数（负浮点数 + 0）&nbsp;&nbsp; <br />
&nbsp;"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"　&nbsp; <br />
&nbsp;//负浮点数&nbsp;&nbsp; <br />
&nbsp;"^(-?\\d+)(\\.\\d+)?$"　　//浮点数&nbsp;&nbsp; <br />
&nbsp;"^[A-Za-z]+$"　　//由26个英文字母组成的字符串&nbsp;&nbsp; <br />
&nbsp;"^[A-Z]+$"　　//由26个英文字母的大写组成的字符串&nbsp;&nbsp; <br />
&nbsp;"^[a-z]+$"　　//由26个英文字母的小写组成的字符串&nbsp;&nbsp; <br />
&nbsp;"^[A-Za-z0-9]+$"　　//由数字和26个英文字母组成的字符串&nbsp;&nbsp; <br />
&nbsp;"^\\w+$"　　//由数字、26个英文字母或者下划线组成的字符串&nbsp;&nbsp; <br />
&nbsp;"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"　　　　//email地址&nbsp;&nbsp; <br />
&nbsp;"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"　　//url&nbsp; <br />
&nbsp;"^[A-Za-z0-9_]*$"&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;正则表达式使用详解&lt;/span&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;简介&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;简单的说，正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下：&nbsp; <br />
&nbsp;测试字符串的某个模式。例如，可以对一个输入字符串进行测试，看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。&nbsp;&nbsp; <br />
&nbsp;替换文本。可以在文档中使用一个正则表达式来标识特定文字，然后可以全部将其删除，或者替换为别的文字。&nbsp;&nbsp; <br />
&nbsp;根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;基本语法&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;在对正则表达式的功能和作用有了初步的了解之后，我们就来具体看一下正则表达式的语法格式。&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;正则表达式的形式一般如下：　　&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;/love/ 　　其中位于&#8220;/&#8221;定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入&#8220;/&#8221;定界符之间即可。为了能够使用户更加灵活的定制模式内容，正则表达式提供了专门的&#8220;元字符&#8221;。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符，可以用来规定其前导字符（即位于元字符前面的字符）在目标对象中的出现模式。&nbsp;&nbsp; <br />
&nbsp;较为常用的元字符包括： &#8220;+&#8221;， &#8220;*&#8221;，以及 &#8220;?&#8221;。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&#8220;+&#8221;元字符规定其前导字符必须在目标对象中连续出现一次或多次。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&#8220;*&#8221;元字符规定其前导字符必须在目标对象中出现零次或连续多次。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&#8220;?&#8221;元字符规定其前导对象必须在目标对象中连续出现零次或一次。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;下面，就让我们来看一下正则表达式元字符的具体应用。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;/fo+/　　因为上述正则表达式中包含&#8220;+&#8221;元字符，表示可以与目标对象中的 &#8220;fool&#8221;, &#8220;fo&#8221;, 或者 &#8220;football&#8221;等在字母f后面连续出现一个或多个字母o的字符串相匹配。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;/eg*/　　因为上述正则表达式中包含&#8220;*&#8221;元字符，表示可以与目标对象中的 &#8220;easy&#8221;, &#8220;ego&#8221;, 或者 &#8220;egg&#8221;等在字母e后面连续出现零个或多个字母g的字符串相匹配。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;/Wil?/　　因为上述正则表达式中包含&#8220;？&#8221;元字符，表示可以与目标对象中的 &#8220;Win&#8221;, 或者&#8220;Wilson&#8221;,等在字母i后面连续出现零个或一个字母l的字符串相匹配。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;有时候不知道要匹配多少字符。为了能适应这种不确定性，正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;{n,} n 是一个非负整数。至少匹配 n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;{n,m} m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;除了元字符之外，用户还可以精确指定模式在匹配对象中出现的频率。例如，/jim {2,6}/ 上述正则表达式规定字符m可以在匹配对象中连续出现2-6次，因此，上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。&nbsp;&nbsp; <br />
&nbsp;在对如何使用正则表达式有了初步了解之后，我们来看一下其它几个重要的元字符的使用方式。&nbsp;&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;\s：用于匹配单个空格符，包括tab键和换行符；&nbsp;&nbsp; <br />
&nbsp;\S：用于匹配除单个空格符之外的所有字符；&nbsp;&nbsp; <br />
&nbsp;\d：用于匹配从0到9的数字；&nbsp;&nbsp; <br />
&nbsp;\w：用于匹配字母，数字或下划线字符；&nbsp;&nbsp; <br />
&nbsp;\W：用于匹配所有与\w不匹配的字符；&nbsp;&nbsp; <br />
&nbsp;. ：用于匹配除换行符之外的所有字符。&nbsp;&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;（说明：我们可以把\s和\S以及\w和\W看作互为逆运算）&nbsp;&nbsp; <br />
&nbsp;下面，我们就通过实例看一下如何在正则表达式中使用上述元字符。&nbsp;&nbsp; <br />
&nbsp;/\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。&nbsp;&nbsp; <br />
&nbsp;/\d000/　如果我们手中有一份复杂的财务报表，那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。&nbsp;&nbsp; <br />
&nbsp;除了我们以上所介绍的元字符之外，正则表达式中还具有另外一种较为独特的专用字符，即定位符。定位符用于规定匹配模式在目标对象中的出现位置。 较为常用的定位符包括： &#8220;^&#8221;, &#8220;$&#8221;, &#8220;\b&#8221; 以及 &#8220;\B&#8221;。&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;&#8220;^&#8221;定位符规定匹配模式必须出现在目标字符串的开头&nbsp; <br />
&nbsp;&#8220;$&#8221;定位符规定匹配模式必须出现在目标对象的结尾&nbsp; <br />
&nbsp;&#8220;\b&#8221;定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一&nbsp; <br />
&nbsp;&#8220;\B&#8221;定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内，&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 即匹配对象既不能作为目标字符串的开头，也不能作为目标字符串的结尾。&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp; 同样，我们也可以把&#8220;^&#8221;和&#8220;$&#8221;以及&#8220;\b&#8221;和&#8220;\B&#8221;看作是互为逆运算的两组定位符。举例来说： /^hell/　因为上述正则表达式中包含&#8220;^&#8221;定位符，所以可以与目标对象中以 &#8220;hell&#8221;, &#8220;hello&#8221;或&#8220;hellhound&#8221;开头的字符串相匹配。 /ar$/　因为上述正则表达式中包含 &#8220;$&#8221;定位符，所以可以与目标对象中以 &#8220;car&#8221;, &#8220;bar&#8221;或 &#8220;ar&#8221; 结尾的字符串相匹配。 /\bbom/　因为上述正则表达式模式以 &#8220;\b&#8221;定位符开头，所以可以与目标对象中以 &#8220;bomb&#8221;, 或 &#8220;bom&#8221;开头的字符串相匹配。/man\b/　因为上述正则表达式模式以&#8220;\b&#8221;定位符结尾，所以可以与目标对象中以 &#8220;human&#8221;, &#8220;woman&#8221;或 &#8220;man&#8221;结尾的字符串相匹配。&nbsp;&nbsp; <br />
&nbsp;为了能够方便用户更加灵活的设定匹配模式，正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如：&nbsp;&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;/[A-Z]/　　上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。&nbsp; <br />
&nbsp;/[a-z]/　　上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。&nbsp;&nbsp; <br />
&nbsp;/[0-9]/ 　上述正则表达式将会与从0到9范围内任何一个数字相匹配。&nbsp;&nbsp; <br />
&nbsp;/([a-z][A-Z][0-9])+/　上述正则表达式将会与任何由字母和数字组成的字符串，如 &#8220;aB0&#8221; 等相匹配。&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp; 这里需要提醒用户注意的一点就是可以在正则表达式中使用 &#8220;()&#8221; 把字符串组合在一起。&#8220;()&#8221;符号包含的内容必须同时出现在目标对象中。因此，上述正则表达式将无法与诸如 &#8220;abc&#8221;等的字符串匹配，因为&#8220;abc&#8221;中的最后一个字符为字母而非数字。&nbsp;&nbsp; <br />
&nbsp;如果我们希望在正则表达式中实现类似编程逻辑中的&#8220;或&#8221;运算，在多个不同的模式中任选一个进行匹配的话，可以使用管道符 &#8220;|&#8221;。例如：/to|too|2/　上述正则表达式将会与目标对象中的 &#8220;to&#8221;, &#8220;too&#8221;, 或 &#8220;2&#8221; 相匹配。&nbsp; <br />
&nbsp; 正则表达式中还有一个较为常用的运算符，即否定符 &#8220;[^]&#8221;。与我们前文所介绍的定位符 &#8220;^&#8221; 不同，否定符 &#8220;[^]&#8221;规定目标对象中不能存在模式中所规定的字符串。例如：/[^A-C]/　上述字符串将会与目标对象中除A，B，和C之外的任何字符相匹配。一般来说，当&#8220;^&#8221;出现在 &#8220;[]&#8221;内时就被视做否定运算符；而当&#8220;^&#8221;位于&#8220;[]&#8221;之外，或没有&#8220;[]&#8221;时，则应当被视做定位符。&nbsp; <br />
&nbsp;最后，当用户需要在正则表达式的模式中加入元字符，并查找其匹配对象时，可以使用转义符&#8220;\&#8221;。例如：/Th\*/ 　上述正则表达式将会与目标对象中的&#8220;Th*&#8221;而非&#8220;The&#8221;等相匹配。&nbsp; <br />
&nbsp;在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先级顺序来求值。优先级如下：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;1．\ 转义符&nbsp; <br />
&nbsp;2．(), (?:), (?=), [] 圆括号和方括号&nbsp; <br />
&nbsp;3．*, +, ?, {n}, {n,}, {n,m} 限定符&nbsp; <br />
&nbsp;4．^, $, \anymetacharacter 位置和顺序&nbsp; <br />
&nbsp;5．|&#8220;或&#8221;操作&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;使用实例&lt;/span&gt;&nbsp;&nbsp; <br />
&nbsp;在JavaScript 1.2中带有一个功能强大的RegExp()对象，可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式，并相应的返回true或false。&nbsp; <br />
&nbsp;我们可以使用JavaScript编写以下脚本，验证用户输入的邮件地址的有效性。&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;&lt;html&gt;&nbsp;&nbsp; <br />
&nbsp;&lt;head&gt;&nbsp;&nbsp; <br />
&nbsp;　 &lt;script language="Javascript1.2"&gt;&nbsp;&nbsp; <br />
&nbsp;　　　　 &lt;!-- start hiding&nbsp;&nbsp; <br />
&nbsp;　　　　 function verifyAddress(obj)&nbsp;&nbsp; <br />
&nbsp;　　　　　{&nbsp;&nbsp; <br />
&nbsp;　　　　　　var email = obj.email.value;&nbsp;&nbsp; <br />
&nbsp;　　　　　　var pattern =&nbsp;&nbsp; <br />
&nbsp;/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;&nbsp;&nbsp; <br />
&nbsp;　　　　　　flag = pattern.test(email);&nbsp;&nbsp; <br />
&nbsp;　　　　　　if(flag)&nbsp;&nbsp; <br />
&nbsp;　　　　　　{&nbsp;&nbsp; <br />
&nbsp;　　　　　　　alert(&#8220;Your email address is correct!&#8221;);&nbsp;&nbsp; <br />
&nbsp;　　　　　　　return true;&nbsp;&nbsp; <br />
&nbsp;　　　　　　}&nbsp;&nbsp; <br />
&nbsp;　　　　　　else&nbsp;&nbsp; <br />
&nbsp;　　　　　　　{&nbsp;&nbsp; <br />
&nbsp;　　　　　　　　alert(&#8220;Please try again!&#8221;);&nbsp;&nbsp; <br />
&nbsp;　　　　　　　　return false;&nbsp;&nbsp; <br />
&nbsp;　　　　　　　 }&nbsp;&nbsp; <br />
&nbsp;　　　　　 }&nbsp;&nbsp; <br />
&nbsp;　　　　 // stop hiding --&gt;&nbsp;&nbsp; <br />
&nbsp;　　　 &lt;/script&gt;&nbsp;&nbsp; <br />
&nbsp;　　&lt;/head&gt;&nbsp;&nbsp; <br />
&nbsp;　 &lt;body&gt;&nbsp;&nbsp; <br />
&nbsp;　　 &lt;form onSubmit="return verifyAddress(this);"&gt;&nbsp;&nbsp; <br />
&nbsp;　　　 &lt;input name="email" type="text"&gt;&nbsp;&nbsp; <br />
&nbsp;　　　 &lt;input type="submit"&gt;&nbsp;&nbsp; <br />
&nbsp;　　　 &lt;/form&gt;&nbsp;&nbsp; <br />
&nbsp;　　&lt;/body&gt;&nbsp;&nbsp; <br />
&nbsp;&lt;/html&gt;&nbsp;&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;正则表达式对象&lt;/span&gt;&nbsp; <br />
&nbsp;本对象包含正则表达式模式以及表明如何应用模式的标志。&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;语法 1 re = /pattern/[flags]&nbsp; <br />
&nbsp;语法 2 re = new RegExp("pattern",["flags"])&nbsp;&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;参数&nbsp; <br />
&nbsp;re&nbsp; <br />
&nbsp;必选项。将要赋值为正则表达式模式的变量名。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;Pattern&nbsp; <br />
&nbsp;必选项。要使用的正则表达式模式。如果使用语法 1，用 "/" 字符分隔模式。如果用语法 2，用引号将模式引起来。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;Flags&nbsp;&nbsp; <br />
&nbsp;可选项。如果使用语法 2 要用引号将 flag 引起来。标志可以组合使用，可用的有：&nbsp;&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;g （全文查找出现的所有 pattern）&nbsp;&nbsp; <br />
&nbsp;i （忽略大小写）&nbsp;&nbsp; <br />
&nbsp;m （多行查找）&nbsp;&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;示例&lt;/span&gt;&nbsp; <br />
&nbsp;下面的示例创建一个包含正则表达式模式及相关标志的对象(re)，向您演示正则表达式对象的用法。在本例中，作为结果的正则表达式对象又用于 match 方法中：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function MatchDemo()&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var r, re; // 声明变量。&nbsp; <br />
&nbsp;var s = "The rain in Spain falls mainly in the plain";&nbsp; <br />
&nbsp;re = new RegExp("ain","g"); // 创建正则表达式对象。&nbsp; <br />
&nbsp;r = s.match(re); // 在字符串 s 中查找匹配。&nbsp; <br />
&nbsp;return(r);&nbsp;&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;返回值： ain,ain,ain,ain\\&nbsp; <br />
&nbsp;属性 lastIndex 属性 | source 属性\\&nbsp; <br />
&nbsp;方法 compile 方法 | exec 方法 | test 方法\\&nbsp; <br />
&nbsp;要求 版本 3\\&nbsp; <br />
&nbsp;请参阅 RegExp 对象 | 正则表达式语法 | String 对象\\&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;exec 方法&lt;/span&gt;&nbsp; <br />
&nbsp;用正则表达式模式在字符串中运行查找，并返回包含该查找结果的一个数组。&nbsp; <br />
&nbsp;rgExp.exec(str)&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;参数&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;rgExp&nbsp;&nbsp; <br />
&nbsp;必选项。包含正则表达式模式和可用标志的正则表达式对象。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;str&nbsp;&nbsp; <br />
&nbsp;必选项。要在其中执行查找的 String 对象或字符串文字。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;说明\\&nbsp; <br />
&nbsp;如果 exec 方法没有找到匹配，则它返回 null。如果它找到匹配，则 exec 方法返回一个数组，并且更新全局 RegExp 对象的属性，以反映匹配结果。数组的0元素包含了完整的匹配，而第1到n元素中包含的是匹配中出现的任意一个子匹配。这相当于没有设置全局标志 (g) 的 match 方法。&nbsp; <br />
&nbsp;如果为正则表达式设置了全局标志，exec 从以 lastIndex 的值指示的位置开始查找。如果没有设置全局标志，exec 忽略 lastIndex 的值，从字符串的起始位置开始搜索。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;exec 方法返回的数组有三个属性，分别是 input、index 和 lastIndex。Input 属性包含了整个被查找的字符串。Index 属性中包含了整个被查找字符串中被匹配的子字符串的位置。LastIndex 属性中包含了匹配中最后一个字符的下一个位置。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;示例\\&nbsp; <br />
&nbsp;下面的例子举例说明了 exec 方法的用法：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function RegExpTest()&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())&nbsp; <br />
&nbsp;if (ver &gt;= 5.5){ // 测试 JScript 的版本。&nbsp; <br />
&nbsp;var src = "The rain in Spain falls mainly in the plain.";&nbsp; <br />
&nbsp;var re = /\w+/g; // 创建正则表达式模式。&nbsp; <br />
&nbsp;var arr;&nbsp; <br />
&nbsp;while ((arr = re.exec(src)) != null)&nbsp; <br />
&nbsp;document.write(arr.index + "-" + arr.lastIndex + arr + "\t");&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;else{&nbsp; <br />
&nbsp;alert("请使用 JScript 的更新版本");&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;返回值：0-3The 4-8rain 9-11in 12-17Spain 18-23falls 24-30mainly 31-33in 34-37the 38-43plain&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;test 方法\\&nbsp; <br />
&nbsp;返回一个 Boolean 值，它指出在被查找的字符串中是否存在模式。&nbsp; <br />
&nbsp;rgexp.test(str)&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;参数\\&nbsp; <br />
&nbsp;rgexp&nbsp; <br />
&nbsp;必选项。包含正则表达式模式或可用标志的正则表达式对象。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;str&nbsp;&nbsp; <br />
&nbsp;必选项。要在其上测试查找的字符串。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;说明&nbsp; <br />
&nbsp;test 方法检查在字符串中是否存在一个模式，如果存在则返回 true，否则就返回 false。&nbsp; <br />
&nbsp;全局 RegExp 对象的属性不由 test 方法来修改。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;示例&nbsp; <br />
&nbsp;下面的例子举例说明了 test 方法的用法：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function TestDemo(re, s)&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var s1; // 声明变量。&nbsp; <br />
&nbsp;// 检查字符串是否存在正则表达式。&nbsp; <br />
&nbsp;if (re.test(s)) // 测试是否存在。&nbsp; <br />
&nbsp;s1 = " contains "; // s 包含模式。&nbsp; <br />
&nbsp;else&nbsp; <br />
&nbsp;s1 = " does not contain "; // s 不包含模式。&nbsp; <br />
&nbsp;return("'" + s + "'" + s1 + "'"+ re.source + "'"); // 返回字符串。&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;函数调用：document.write (TestDemo(/ain+/ ,"The rain in Spain falls mainly in the plain."));&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;返回值：'The rain in Spain falls mainly in the plain.' contains 'ain+'&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;match 方法&lt;/span&gt;&nbsp; <br />
&nbsp;使用正则表达式模式对字符串执行查找，并将包含查找的结果作为数组返回。\\&nbsp; <br />
&nbsp;stringObj.match(rgExp)&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;参数\\&nbsp; <br />
&nbsp;stringObj&nbsp;&nbsp; <br />
&nbsp;必选项。对其进行查找的 String 对象或字符串文字。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;rgExp&nbsp;&nbsp; <br />
&nbsp;必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;说明\\&nbsp; <br />
&nbsp;如果 match 方法没有找到匹配，返回 null。如果找到匹配返回一个数组并且更新全局 RegExp 对象的属性以反映匹配结果。&nbsp; <br />
&nbsp;match 方法返回的数组有三个属性：input、index 和 lastIndex。Input 属性包含整个的被查找字符串。Index 属性包含了在整个被查找字符串中匹配的子字符串的位置。LastIndex 属性包含了最后一次匹配中最后一个字符的下一个位置。&nbsp; <br />
&nbsp;如果没有设置全局标志 (g)，数组的 0 元素包含整个匹配，而第 1 到 n 元素包含了匹配中曾出现过的任一个子匹配。这相当于没有设置全局标志的 exec 方法。如果设置了全局标志，元素 0 到 n 中包含所有匹配。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;示例\\&nbsp; <br />
&nbsp;下面的示例演示了match 方法的用法：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function MatchDemo()&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var r, re; // 声明变量。&nbsp; <br />
&nbsp;var s = "The rain in Spain falls mainly in the plain";&nbsp; <br />
&nbsp;re = /ain/i; // 创建正则表达式模式。&nbsp; <br />
&nbsp;r = s.match(re); // 尝试匹配搜索字符串。&nbsp; <br />
&nbsp;return(r); // 返回第一次出现 "ain" 的地方。&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;返回值：ain&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;本示例说明带 g 标志设置的 match 方法的用法。&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function MatchDemo()&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var r, re; // 声明变量。&nbsp; <br />
&nbsp;var s = "The rain in Spain falls mainly in the plain";&nbsp; <br />
&nbsp;re = /ain/ig; // 创建正则表达式模式。&nbsp; <br />
&nbsp;r = s.match(re); // 尝试去匹配搜索字符串。&nbsp; <br />
&nbsp;return(r); // 返回的数组包含了所有 "ain"&nbsp;&nbsp; <br />
&nbsp;// 出现的四个匹配。&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;返回值：ain,ain,ain,ain&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;上面几行代码演示了字符串文字的 match 方法的用法。&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;var r, re = "Spain";&nbsp; <br />
&nbsp;r = "The rain in Spain".replace(re, "Canada");&nbsp; <br />
&nbsp;return r;&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;返回值：The rain in Canada&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;search 方法&lt;/span&gt;&nbsp; <br />
&nbsp;返回与正则表达式查找内容匹配的第一个子字符串的位置。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;stringObj.search(rgExp)&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;参数\\&nbsp; <br />
&nbsp;stringObj&nbsp;&nbsp; <br />
&nbsp;必选项。要在其上进行查找的 String 对象或字符串文字。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;rgExp&nbsp;&nbsp; <br />
&nbsp;必选项。包含正则表达式模式和可用标志的正则表达式对象。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;说明&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;search 方法指明是否存在相应的匹配。如果找到一个匹配，search 方法将返回一个整数值，指明这个匹配距离字符串开始的偏移位置。如果没有找到匹配，则返回 -1。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;示例\\&nbsp; <br />
&nbsp;下面的示例演示了 search 方法的用法。&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;function SearchDemo()&nbsp; <br />
&nbsp;{&nbsp; <br />
&nbsp;var r, re; // 声明变量。&nbsp; <br />
&nbsp;var s = "The rain in Spain falls mainly in the plain.";&nbsp; <br />
&nbsp;re = /falls/i; // 创建正则表达式模式。&nbsp; <br />
&nbsp;r = s.search(re); // 查找字符串。&nbsp; <br />
&nbsp;return(r); // 返回 Boolean 结果。&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;返回值：18&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;正则表达式语法&lt;/span&gt;&nbsp; <br />
&nbsp;一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;这里有一些可能会遇到的正则表达式示例：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;JScript VBScript 匹配&nbsp;&nbsp; <br />
&nbsp;/^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。&nbsp;&nbsp; <br />
&nbsp;/\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。&nbsp;&nbsp; <br />
&nbsp;/&lt;(.*)&gt;.*&lt;\/\1&gt;/ "&lt;(.*)&gt;.*&lt;\/\1&gt;" 匹配一个 HTML 标记。&nbsp;&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;下表是元字符及其在正则表达式上下文中的行为的一个完整列表：&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;字符 描述&nbsp;&nbsp; <br />
&nbsp;\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;* 匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;+ 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;? 匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;{n,} n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;{n,m} m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。刘， "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。&nbsp;&nbsp; <br />
&nbsp;(pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0&#8230;$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;(?:pattern) 匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;(?=pattern) 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp; (?!pattern) 负向预查，在任何不匹配 Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;x|y 匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;[xyz] 字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;[^xyz] 负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;[a-z] 字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\b 匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\cx 匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\d 匹配一个数字字符。等价于 [0-9]。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\D 匹配一个非数字字符。等价于 [^0-9]。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\f 匹配一个换页符。等价于 \x0c 和 \cL。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\n 匹配一个换行符。等价于 \x0a 和 \cJ。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\r 匹配一个回车符。等价于 \x0d 和 \cM。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\t 匹配一个制表符。等价于 \x09 和 \cI。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\xn 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。.&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\num 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\nml 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;\un 匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&lt;span style="font-size: 18pt;"&gt;优先权顺序&lt;/span&gt;&nbsp; <br />
&nbsp;在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先权顺序来求值。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;操作符 描述&nbsp;&nbsp; <br />
&nbsp;\ 转义符&nbsp;&nbsp; <br />
&nbsp;(), (?:), (?=), [] 圆括号和方括号&nbsp;&nbsp; <br />
&nbsp;*, +, ?, {n}, {n,}, {n,m} 限定符&nbsp;&nbsp; <br />
&nbsp;^, $, \anymetacharacter 位置和顺序&nbsp;&nbsp; <br />
&nbsp;| &#8220;或&#8221;操作&nbsp;&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;普通字符&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;最简单的正则表达式是一个单独的普通字符，可以匹配所搜索字符串中的该字符本身。例如，单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;/a/&nbsp; <br />
&nbsp;/7/&nbsp; <br />
&nbsp;/M/&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;等价的 VBScript 单字符正则表达式为：&nbsp; <br />
&nbsp;&lt;pre name="code" class="java"&gt;"a"&nbsp; <br />
&nbsp;"7"&nbsp; <br />
&nbsp;"M"&nbsp; <br />
&nbsp;&lt;/pre&gt;&nbsp; <br />
&nbsp;可以将多个单字符组合在一起得到一个较大的表达式。例如，下面的 JScript 正则表达式不是别的，就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;/a7M/&nbsp; <br />
&nbsp;等价的 VBScript 表达式为：&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;"a7M"&nbsp; <br />
&nbsp;请注意这里没有连接操作符。所需要做的就是将一个字符放在了另一个字符后面。&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
</p>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/285630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-07-06 09:20 <a href="http://www.blogjava.net/hulizhong/archive/2009/07/06/285630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>regular expression</title><link>http://www.blogjava.net/hulizhong/archive/2009/07/02/285060.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 02 Jul 2009 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/07/02/285060.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/285060.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/07/02/285060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/285060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/285060.html</trackback:ping><description><![CDATA[<strong>向后引用</strong><br />
<br />
正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下，对一个正则表达式模式或部分模式两边添加圆括号将导致
这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对这部分正则表达式的保存。<br />
<br />
所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始，连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问，其中 n 为一个标识特定缓冲区的一位或两位十进制数。<br />
<br />
向后引用一个最简单，最有用的应用是提供了确定文字中连续出现两个相同单词的位置的能力。请看下面的句子：<br />
<br />
Is is the cost of of gasoline going up up?<br />
根据所写内容，上面的句子明显存在单词多次重复的问题。如果能有一种方法无需查找每个单词的重复现象就能修改该句子就好了。下面的 JScript 正则表达式使用一个子表达式就可以实现这一功能。<br />
<br />
/\b([a-z]+) \1\b/gi<br />
等价的 VBScript 表达式为：<br />
<br />
"\b([a-z]+) \1\b"<br />
在这个示例中，子表达式就是圆括号之间的每一项。所捕获的表达式包括一个或多个字母字符，即由 '[a-z]+'
所指定的。该正则表达式的第二部分是对前面所捕获的子匹配的引用，也就是由附加表达式所匹配的第二次出现的单词。'\1'用来指定第一个子匹配。单词边界
元字符确保只检测单独的单词。如果不这样，则诸如 "is issued" 或 "this is" 这样的短语都会被该表达式不正确地识别。<br />
<br />
在 JScript 表达式中，正则表达式后面的全局标志 ('g')
表示该表达式将用来在输入字符串中查找尽可能多的匹配。大小写敏感性由表达式结束处的大小写敏感性标记 ('i')
指定。多行标记指定可能出现在换行符的两端的潜在匹配。对 VBScript 而言，在表达式中不能设置各种标记，但必须使用 RegExp
对象的属性来显式设置。<br />
<br />
使用上面所示的正则表达式，下面的 JScript 代码可以使用子匹配信息，在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词：<br />
<br />
var ss = "Is is the cost of of gasoline going up up?.\n";<br />
var re = /\b([a-z]+) \1\b/gim;&nbsp; &nbsp;&nbsp; &nbsp; // 创建正则表达式样式。<br />
var rv = ss.replace(re,"$1");&nbsp; &nbsp;// 用一个单词替代两个单词。<img src ="http://www.blogjava.net/hulizhong/aggbug/285060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-07-02 09:21 <a href="http://www.blogjava.net/hulizhong/archive/2009/07/02/285060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 如何优化JavaScript脚本的性能  </title><link>http://www.blogjava.net/hulizhong/archive/2009/05/11/270020.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Mon, 11 May 2009 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/05/11/270020.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/270020.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/05/11/270020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/270020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/270020.html</trackback:ping><description><![CDATA[转 http://shiningray.cn/improve-javascript-performance.html<br />
<br />
<p>随着网络的发展，网速和机器速度的提高，越来越多的网站用到了丰富客户端技术。而现在Ajax则是最为流行的一种方式。JavaScript是一种
解释型语言，所以能无法达到和C/Java之类的水平，限制了它能在客户端所做的事情，为了能改进他的性能，我想基于我以前给JavaScript做过的
很多测试来谈谈自己的经验，希望能帮助大家改进自己的JavaScript脚本性能。</p>
<h1>语言层次方面</h1>
<h2>循环</h2>
<p>循环是很常用的一个控制结构，大部分东西要依靠它来完成，在JavaScript中，我们可以使用<code>for(;;),while(),for(in)</code>三种循环，事实上，这三种循环中<code>for(in)</code>的效率极差，因为他需要查询散列键，只要可以就应该尽量少用。<code>for(;;)</code>和<code>while</code>循环的性能应该说基本（平时使用时）等价。</p>
<p>而事实上，如何使用这两个循环，则有很大讲究。我在测试中有些很有意思的情况，见附录。最后得出的结论是：</p>
<ul>
    <li>
    <p>如果是循环变量递增或递减，不要单独对循环变量赋值，应该在它最后一次读取的时候使用嵌套的<code>++</code>或<code>--</code>操作符。</p>
    </li>
    <li>
    <p>如果要与数组的长度作比较，应该事先把数组的length属性放入一个局部变量中，减少查询次数。</p>
    </li>
</ul>
<p>举例，假设arr是一个数组，最佳的遍历元素方式为：</p>
<pre><code>for(var i=0, len = arr.length;i&lt;len;i++){...}</code></pre>
<p>或者，如果无所谓顺序的话：</p>
<pre><code>for(var i=arr.length;i&gt;0;i--){...}</code></pre>
<h2>局部变量和全局变量</h2>
<p>局部变量的速度要比全局变量的访问速度更快，因为全局变量其实是全局对象的成员，而局部变量是放在函数的栈当中的。</p>
<h2>不使用Eval</h2>
<p>使用<code>eval</code>相当于在运行时再次调用解释引擎对内容进行运行，需要消耗大量时间。这时候使用JavaScript所支持的闭包可以实现函数模版（关于闭包的内容请参考函数式编程的有关内容）</p>
<h2>减少对象查找</h2>
<p>因为JavaScript的解释性，所以<code>a.b.c.d.e</code>，需要进行至少4次查询操作，先检查a再检查a中的b，再检查b中的c，如此往下。所以如果这样的表达式重复出现，只要可能，应该尽量少出现这样的表达式，可以利用局部变量，把它放入一个临时的地方进行查询。</p>
<p>这一点可以和循环结合起来，因为我们常常要根据字符串、数组的长度进行循环，而通常这个长度是不变的，比如每次查询<code>a.length</code>，就要额外进行一个操作，而预先把<code>var<br />
len=a.length</code>，则就少了一次查询。</p>
<h2>字符串连接</h2>
<p>如果是追加字符串，最好使用<code>s+=anotherStr</code>操作，而不是要使用<code>s=s+anotherStr</code>。</p>
<p>如果要连接多个字符串，应该少使用+=，如</p>
<pre>s+=a;<br />
s+=b;<br />
s+=c;</pre>
<p>
应该写成</p>
<pre>s+=a + b + c；</pre>
<p>
而如果是收集字符串，比如多次对同一个字符串进行+=操作的话，最好使用一个缓存。怎么用呢？使用JavaScript数组来收集，最后使用join方法连接起来，如下</p>
<pre>var buf = new Array();<br />
for(var i = 0; i &lt; 100; i++){<br />
buf.push(i.toString());<br />
}<br />
var all = buf.join("");</pre>
<h2>类型转换</h2>
<p>类型转换是大家常犯的错误，因为JavaScript是动态类型语言，你不能指定变量的类型。</p>
<p>1.<br />
把数字转换成字符串，应用<code>"" + 1</code>，虽然看起来比较丑一点，但事实上这个效率是最高的，性能上来说：</p>
<p><code>("" + ) &gt; String() &gt; .toString() &gt; new String() </code></p>
<p>这条其实和下面的&#8220;直接量&#8221;有点类似，尽量使用编译时就能使用的内部操作要比运行时使用的用户操作要快。</p>
<p><code>String()</code>属于内部函数，所以速度很快，而<code>.toString()</code>要查询原型中的函数，所以速度逊色一些，<code>new String()</code>用于返回一个精确的副本。</p>
<p>2.<br />
浮点数转换成整型，这个更容易出错，很多人喜欢使用<code>parseInt()</code>，其实<code>parseInt()</code>是用于将字符串转换成数字，而不是浮点数和整型之间的转换，我们应该使用<code>Math.floor()</code>或者<code>Math.round()</code>。</p>
<p>另外，和第二节的对象查找中的问题不一样，<code>Math</code>是内部对象，所以<code>Math.floor()</code>其实并没有多少查询方法和调用的时间，速度是最快的。</p>
<p>3.<br />
对于自定义的对象，如果定义了<code>toString()</code>方法来进行类型转换的话，推荐显式调用<code>toString()</code>，因为内部的操作在尝试所有可能性之后，会尝试对象的toString()方法尝试能否转化为String，所以直接调用这个方法效率会更高</p>
<h2>使用直接量</h2>
<p>其实这个影响倒比较小，可以忽略。什么叫使用直接量，比如，JavaScript支持使用<code>[param,param,param,...]</code>来直接表达一个数组，以往我们都使用<code>new Array(param,param,...)</code>，使用前者是引擎直接解释的，后者要调用一个<code>Array</code>内部构造器，所以要略微快一点点。</p>
<p>同样，<code>var foo = {}</code>的方式也比<code>var foo = new Object();</code>快，<code>var reg = /../;</code>要比<code>var reg=new RegExp()</code>快。</p>
<h2>字符串遍历操作</h2>
<p>对字符串进行循环操作，譬如替换、查找，应使用正则表达式，因为本身JavaScript的循环速度就比较慢，而正则表达式的操作是用C写成的语言的API，性能很好。</p>
<h2>高级对象</h2>
<p>自定义高级对象和<code>Date</code>、<code>RegExp</code>对象在构造时都会消耗大量时间。如果可以复用，应采用缓存的方式。</p>
<h1>DOM相关</h1>
<h2>插入HTML</h2>
<p>很多人喜欢在JavaScript中使用<code>document.write</code>来给页面生成内容。事实上这样的效率较低，如果需要直接插入HTML，可以找一个容器元素，比如指定一个div或者span，并设置他们的<code>innerHTML</code>来将自己的HTML代码插入到页面中。</p>
<h2>对象查询</h2>
<p>使用<code>[""]</code>查询要比<code>.items()</code>更快，这和前面的减少对象查找的思路是一样的，调用<code>.items()</code>增加了一次查询和函数的调用。</p>
<h2>创建DOM节点</h2>
<p>通常我们可能会使用字符串直接写HTML来创建节点，其实这样做</p>
<ol>
    <li>
    <p>无法保证代码的有效性</p>
    </li>
    <li>
    <p>字符串操作效率低</p>
    </li>
</ol>
<p>所以应该是用<code>document.createElement()</code>方法，而如果文档中存在现成的样板节点，应该是用<code>cloneNode()</code>方法，因为使用<code>createElement()</code>方法之后，你需要设置多次元素的属性，使用<code>cloneNode()</code>则可以减少属性的设置次数——同样如果需要创建很多元素，应该先准备一个样板节点。</p>
<h2>定时器</h2>
<p>如果针对的是不断运行的代码，不应该使用<code>setTimeout</code>，而应该是用<code>setInterval</code>。<code>setTimeout</code>每次要重新设置一个定时器。</p>
<h1>其他</h1>
<h2>脚本引擎</h2>
<p>据我测试Microsoft的JScript的效率较Mozilla的Spidermonkey要差很多，无论是执行速度还是内存管理上，因为JScript现在基本也不更新了。但SpiderMonkey不能使用<code>ActiveXObject</code></p>
<h2>文件优化</h2>
<p>文件优化也是一个很有效的手段，删除所有的空格和注释，把代码放入一行内，可以加快下载的速度，注意，是下载的速度而不是解析的速度，如果是本地，注释和空格并不会影响解释和执行速度。</p>
<h1>总结</h1>
<p>本文总结了我在JavaScript编程中所找到的提高JavaScript运行性能的一些方法，其实这些经验都基于几条原则：</p>
<ol>
    <li>
    <p>直接拿手头现成的东西比较快，如局部变量比全局变量快，直接量比运行时构造对象快等等。</p>
    </li>
    <li>
    <p>尽可能少地减少执行次数，比如先缓存需要多次查询的。</p>
    </li>
    <li>
    <p>尽可能使用语言内置的功能，比如串链接。</p>
    </li>
    <li>
    <p>尽可能使用系统提供的API，因为这些API是编译好的二进制代码，执行效率很高</p>
    </li>
</ol>
<p>同时，一些基本的算法上的优化，同样可以用在JavaScript中，比如运算结构的调整，这里就不再赘述了。但是由于JavaScript是解释型的，一般不会在运行时对字节码进行优化，所以这些优化仍然是很重要的。</p>
<p>当然，其实这里的一些技巧同样使用在其他的一些解释型语言中，大家也可以进行参考。</p>
<h1>参考</h1>
<ul>
    <li>
    <p><a href="http://www.umsu.de/jsperf/">http://www.umsu.de/jsperf/</a>	各种浏览器的测试对比</p>
    </li>
    <li>
    <p><a href="http://home.earthlink.net/%7Ekendrasg/info/js_opt/">http://home.earthlink.net/~kendrasg/info/js_opt/</a> </p>
    </li>
</ul>
<h1>附录1</h1>
<p>由于是以前做过的测试，测试代码已经不全，我补充了一部分如下：</p>
<pre>var print;<br />
<br />
if(typeof document != "undefined" ){<br />
print = function(){<br />
document.write(arguments[0]);<br />
}<br />
}else if(typeof WScript != "undefined" ){<br />
print = function(){<br />
WScript.Echo(arguments[0],arguments[1],arguments[2]);<br />
}<br />
}<br />
<br />
function empty(){<br />
}<br />
<br />
function benchmark(f){<br />
var i = 0;<br />
var start = (new Date()).getTime();<br />
<br />
while(i &lt; pressure){<br />
f(i++);<br />
}<br />
var end = (new Date()).getTime();<br />
WScript.Echo(end-start);<br />
}<br />
<br />
/*<br />
i=0<br />
start = (new Date()).getTime();<br />
while(i &lt; 60000){<br />
c = [i,i,i,i,i,i,i,i,i,i];<br />
i++;<br />
}<br />
end = (new Date()).getTime();<br />
WScript.Echo(end-start);<br />
i=0<br />
start = (new Date()).getTime();<br />
while(i &lt; 60000){<br />
c = new Array(i,i,i,i,i,i,i,i,i,i);<br />
i++;<br />
}<br />
var end = (new Date()).getTime();<br />
WScript.Echo(end-start);<br />
*/<br />
<br />
function internCast(i){<br />
return "" + i;<br />
}<br />
<br />
function StringCast(i){<br />
return String(i)<br />
}<br />
function newStringCast(i){<br />
return new String(i)<br />
}<br />
function toStringCast(i){<br />
return i.toString();<br />
}<br />
function ParseInt(){<br />
return parseInt(j);<br />
}<br />
function MathFloor(){<br />
return Math.floor(j);<br />
}<br />
function Floor(){<br />
return floor(j);<br />
}<br />
var pressure = 50000;<br />
var a  = "";<br />
var floor = Math.floor;<br />
j = 123.123;<br />
print("-------------\nString Conversion Test");<br />
print("The empty:", benchmark(empty));<br />
print("intern:", benchmark(internCast));<br />
print("String:");<br />
benchmark(StringCast);<br />
print("new String:");<br />
benchmark(newStringCast);<br />
print("toString:");<br />
benchmark(toStringCast);<br />
print("-------------\nFloat to Int Conversion Test");<br />
print("parseInt");<br />
benchmark(ParseInt);<br />
print("Math.floor");<br />
benchmark(MathFloor);<br />
print("floor")<br />
benchmark(Floor);<br />
<br />
function newObject(){<br />
return new Object();<br />
}<br />
<br />
function internObject(){<br />
return {};<br />
}<br />
print("------------\nliteral Test");<br />
print("runtime new object", benchmark(newObject));<br />
print("literal object", benchmark(internObject));<br />
</pre>
<h1>附录2</h1>
<p>代码1：</p>
<pre>    for(var i=0;i&lt;100;i++){<br />
arr[i]=0;<br />
}</pre>
<p>
<br />
</p>
<p>代码2：</p>
<pre>    var i = 0;<br />
while(i &lt; 100){<br />
arr[i++]=0;<br />
}</pre>
<p>
<br />
</p>
<p>代码3：</p>
<pre>    var i = 0;<br />
while(i &lt; 100){<br />
arr[i]=0;<br />
i++;<br />
}</pre>
<p>
<br />
</p>
<p>在firefox下测试这两段代码，结果是代码2优于代码1和3，而代码1一般优于代码3，有时会被代码3超过；而在IE<br />
6.0下，测试压力较大的时候（如测试10000次以上）代码2和3则有时候优于代码1，有时候就会远远落后代码1，而在测试压力较小（如5000次），则代码2&gt;代码3&gt;代码1。</p>
<p>代码4：</p>
<pre>    var i = 0;<br />
var a;<br />
while(i &lt; 100){<br />
a = 0;<br />
i++;<br />
}</pre>
<p>
<br />
</p>
<p>代码5：</p>
<pre>    var a;<br />
for(var i=0;i&lt;100;i++){<br />
a = 0;<br />
}</pre>
<p>
上面两段代码在Firefox和IE下测试结果都是性能接近的。</p>
<p>代码6：</p>
<pre>    var a;<br />
var i=0;<br />
while(i&lt;100){<br />
a=i;<br />
i++;<br />
}</pre>
<p>
<br />
</p>
<p>代码7：</p>
<pre>    var a;<br />
var i=0;<br />
while(i&lt;100){<br />
a=i++;<br />
}</pre>
<p>
<br />
</p>
<p>代码8：</p>
<pre>    var a;<br />
for(var i=0;i&lt;100;i++){<br />
a = i;<br />
}</pre>
<p>
<br />
</p>
<p>代码9：</p>
<pre>    var a;<br />
for(var i=0;i&lt;100;){<br />
a = i++;<br />
}</pre>
<p>
这四段代码在Firefox下6和8的性能接近，7和9的性能接近，而6,<br />
8 &lt; 7, 9；</p>
<p>最后我们来看一下空循环</p>
<p>代码10：</p>
<pre>    for(var i=0;i&lt;100;i++){   }</pre>
<p>
<br />
</p>
<p>代码11：</p>
<pre>    var i;<br />
while(i&lt;100){        i++;    }<br />
</pre>
<p>
最后的测试出现了神奇的结果，Firefox下代码10所花的时间与代码11所花的大约是24:1。所以它不具备参考价值，于是我没有放在一开始给大家看。</p>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/270020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-05-11 11:32 <a href="http://www.blogjava.net/hulizhong/archive/2009/05/11/270020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐一个不错的IE下的js调试插件</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/29/268088.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 29 Apr 2009 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/29/268088.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/268088.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/29/268088.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/268088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/268088.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; JS开发中，调试比较麻烦！常用的有ff的debug工具。IE的debug工具用的到不多，给大家推荐一个IE的JS调试工具<br />
&nbsp;&nbsp; 下载地址：http://www.my-debugbar.com/wiki/CompanionJS/HomePage<br />
<br />
&nbsp;&nbsp; 安装后，在IE工具栏有如下图标<br />
&nbsp;&nbsp; <br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/hulizhong/iedebug2.jpg" alt="" border="0" /><br /><img src ="http://www.blogjava.net/hulizhong/aggbug/268088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-29 13:08 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/29/268088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 javascript:void(0)的妙用</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/22/267026.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 22 Apr 2009 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/22/267026.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/267026.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/22/267026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/267026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/267026.html</trackback:ping><description><![CDATA[转 http://www.cnblogs.com/land/archive/2009/04/20/1439766.html<br />
<br />
<strong>JavaScript中void(0)的含义: <br />
JavaScript中void是一个操作符，该操作符指定要计算一个表达式但是不返回值。 <br />
void 操作符用法格式如下： <br />
1. javascript:void (expression) <br />
2. javascript:void expression <br />
expression
是一个要计算的 JavaScript 标准的表达式。表达式外侧的圆括号是可选的，但是写上去是一个好习惯。我们可以使用 void
操作符指定超级链接。表达式会被计算但是不会在当前文档处装入任何内容。面的代码创建了一个超级链接，当用户点击以后不会发生任何事。当用户点击链接
时，void(0) 计算为 0，但在 JavaScript 上没有任何效果。 <br />
&lt;a href=&#8221;javascript:void(0)&#8221;&gt;单击此处什么也不会发生&lt;/a&gt; <br />
也就是说，要执行某些处理，但是不整体刷新页面的情况下，可以使用void(0),但是在需要对页面进行refresh的情况下，那就要仔细了。 </strong>
<p>在调用自这自定义的JS函数时,如果我们使用&lt;a href="#"
onclick="method;"&gt;click&lt;/a&gt;时,虽然方法可以执行，但是如果页面含有滚动条，会自动滚动到页面的顶端，如
果这个时候我们使用&lt;a href="javascript:void(0);
onclick="method;"&gt;click&lt;/a&gt;，执行时，页面将不会发生滚动，这个对于图片切换、AJAX调用
应该非常有用</p>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/267026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-22 18:12 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/22/267026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 FireBug 调试JS入门 —如何调试JS</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/16/265899.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 16 Apr 2009 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/16/265899.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/265899.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/16/265899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/265899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/265899.html</trackback:ping><description><![CDATA[转 http://www.blogjava.net/vincent/archive/2009/04/14/265591.html<br />
<br />
<span style="font-size: 10pt;">安装就不用说了，很简单，在FireFox上插件库里找到FireBug就Ok了。下图是FireBug Debug 窗口。<br />
<div align="center"><img style="width: 733px; height: 333px;" alt="" src="../../images/blogjava_net/vincent/js.gif" width="733" border="0" height="333" /><br />
</div>
&nbsp;&nbsp;&nbsp;&nbsp; FireBug美工用的非常普遍，公司美工妹妹用的非常熟练 呵呵，而对于我们开发人员，主要用它来Debug JS。看看官方对Debug功能的介绍。<br />
&nbsp;Firebug includes a powerful JavaScript debugger that lets you pause
execution at any time and see what each variable looked like at that
moment. If your code is a little sluggish, use the JavaScript profiler
to measure performance and find bottlenecks fast.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简而言之，FireBug 可以让我们在任何时候debugJS 并查看变量，同时可以通过它找出JS中性能瓶颈。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下图是如何找到Web应用的JS，激活Firebug，点Script，然后在All 旁边选择你要Debug的JS。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-listing.gif" border="0" /></div>
<br />
下图是如何打断点 基本跟Eclipse一样，点击行号就Ok了。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-breakpoint.gif" width="214" border="0" height="164" /></div>
下图是如何在断点上设定条件，如果条件符合，就进入断点，这个功能很不错，特别是Debug很复杂的Function时候。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-cond.gif" width="214" border="0" height="164" /></div>
&nbsp;下图是如何单步调试，跟Eclipse一样 F11单步 <br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-step.gif" width="214" border="0" height="164" /></div>
下图是查看调用的Stack，对以复杂的JS Debug很有帮助。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-stack.gif" width="214" border="0" height="164" /><br />
</div>
下图是查看变量 基本跟EclipseDebug 一样。<br />
<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-watch.gif" border="0" /></div>
<br />
下图是在断点处查看变量。<br />
<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-tooltip.gif" width="214" border="0" height="164" /></div>
<br />
有个很好用的功能，代码行之间快速调转，使得对上千行的JS调试很轻松。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-linejump.gif" width="214" border="0" height="164" /></div>
下图就是Performance 测试结果，使用很简单 点Profile<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-profile.gif" width="214" border="0" height="164" /></div>
<br />
还有一个Log功能比较实用，看下图 如果你不想每次都进入断点，用这个就再好不过了。<br />
<div align="center"><img alt="" src="../../images/blogjava_net/vincent/screenScript-logcalls.gif" width="214" border="0" height="164" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本用法就这些了，希望对大家有帮助。</span><br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/265899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-16 09:14 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/16/265899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 JS中的instanceof和typeof </title><link>http://www.blogjava.net/hulizhong/archive/2009/04/12/265127.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Sun, 12 Apr 2009 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/12/265127.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/265127.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/12/265127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/265127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/265127.html</trackback:ping><description><![CDATA[转 http://www.cnitblog.com/yemoo/archive/2007/10/10/34642.html<br />
<br />
对于instanceof和typeof，以前偶尔的用到过，特别是typeof用到的相对更多一些，今日研究ext源码，很多地方都用到了instanceof，突然觉得他们两个有些相似但也应该有他们区别，网上看了一些文章，对它们之间的关系有了一定的了解。<br />
<br />
instanceof和typeof都能用来判断一个变量是否为空或是什么类型的变量。<br />
typeof用以获取一个变量的类型，typeof一般只能返回如下几个结果：<span style="color: #0000ff;"><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="entrymore"></a>number,boolean,string,function,object,undefined</span>。
我们可以使用typeof来获取一个变量是否存在，如if(typeof
a!="undefined"){}，而不要去使用if(a)因为如果a不存在（未声明）则会出错，对于Array,Null等特殊对象使用typeof
一律返回object，这正是typeof的局限性。<br />
<br />
如果我们希望获取一个对象是否是数组，或判断某个变量是否是某个对象的实例则要选择
使用instanceof。instanceof用于判断一个变量是否某个对象的实例，如var a=new Array();alert(a
instanceof Array);会返回true，同时alert(a instanceof
Object)也会返回true;这是因为Array是object的子类。再如：function test(){};var a=new
test();alert(a instanceof test)会返回true。<br />
<br />
谈到instanceof我们要多插入一个问题，就是function的arguments，我们大家也许都认为arguments是一个Array，但如果使用instaceof去测试会发现arguments不是一个Array对象，尽管看起来很像。 <br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/265127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-12 16:04 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/12/265127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 有关window.undefined=window.undefined写法的理解(Ext2学习总结) </title><link>http://www.blogjava.net/hulizhong/archive/2009/04/12/265126.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Sun, 12 Apr 2009 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/12/265126.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/265126.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/12/265126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/265126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/265126.html</trackback:ping><description><![CDATA[转 http://www.cnitblog.com/yemoo/archive/2007/10/11/34712.html<br />
<br />
在jquery中我们见到<span style="color: #00008b;">window.undefined=window.undefined</span>的写法，今日又在ext中见到<span style="color: #00008b;">window["undefined"]=window["undefined"]</span>，对其写法非常不理解，将自身赋给自身有什么意义，在网上狂搜一番也没有明确的解释，后来看到ext注释写了这么一句：for old browsers，很明显是为了兼容老的浏览器，思虑半天，似乎有了些理解。<br />
<br />
&nbsp;
在较老的浏览器中，如IE5之前的浏览器，undefined并不是window对象的一个子对象，并不是一个已实现的系统保留字，而是代表一个未定义类
型，除了直接赋值和typeof()之外，其它任何对undefined的操作都将导致异常。如果需要知道一个变量是否是undefined，只能采用
typeof()的方法：如var v;if (typeof(v) == 'undefined') {//
...}。如果使用if(a==="undefined")则会报&#8220;undefined未定义&#8221;的错误。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因此为了兼容IE5及之前的
浏览器，我们可以使用一些方法来解决这个问题。本文前面说到的就是其中一种方式。window.undefined=window.undefined;
咋一看很难理解，写法有点bt，但理解一下就不觉得奇怪了，在较早的浏览器中因为window.undefined不存在所以会返回undefined，
将此赋给等号前的window.undefined这样后面就可以直接使用if(a==="undefined")的判断方式了。在新版本的浏览器中
window.undefined=undefined；因此不会造成什么负面影响。<br />
<br />
&nbsp; 除了使用window.undefined=window.undefined和window["undefined"]=window["undefined"]外，还有很多别的办法来实现对IE5及之前浏览器的兼容，如<br />
var undefined = void null;&nbsp;&nbsp;//void函数永远返回undefined<br />
var undefined = function(){}();<br />
var undefined = void 0;<br />
只要等号后的表达式返回undefined即可。<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/265126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-12 15:58 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/12/265126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转全面理解javascript的caller,callee,call,apply概念(修改版)</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/10/264798.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Fri, 10 Apr 2009 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/10/264798.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/264798.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/10/264798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/264798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/264798.html</trackback:ping><description><![CDATA[转 http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html<br />
<br />
<div class="postTitle">
<a id="AjaxHolder_ctl01_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html">全面理解javascript的caller,callee,call,apply概念(修改版)</a>
</div>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体">(<em><strong>注</strong></em>：<em><strong>在看到大家如此关注JS里头的这几个对象，我试着把原文再修改一下，力求能再详细的阐明个中意义&nbsp; 2007-05-21</strong></em>）<br />
在提到上述的概念之前，首先想说说<span lang="EN-US">javascript</span>中函数的隐含参数：<strong><span lang="EN-US">arguments</span></strong></font></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体"><strong></strong></font><strong><span lang="EN-US"><font face="宋体">Arguments<o:p></o:p></font></span></strong></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体">该对象代表正在执行的函数和调用它的函数的参数。<strong><span style="font-size: 14pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></strong></font></p>
<pre style="line-height: 150%;"><span lang="EN-US"><font face="宋体">[<span><span class="MsoHyperlink"><em><u><font color="#0000ff">function</font></u></em></span></span><strong>.</strong>]<strong>arguments[</strong><span><span class="MsoHyperlink"><em><u><font color="#0000ff">n</font></u></em></span></span><strong>]</strong></font></span></pre>
<pre style="line-height: 150%;"><strong><font face="宋体"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">参数</span><br />
</font></strong><em><span lang="EN-US">function</span></em><span lang="EN-US"> </span><span style="font-family: 宋体;">：选项。当前正在执行的</span> <strong><span lang="EN-US">Function</span></strong><span lang="EN-US"> </span><span style="font-family: 宋体;">对象的名字。</span><span lang="EN-US"> <br />
</span><em><span lang="EN-US">n</span></em><span lang="EN-US"> </span><span style="font-family: 宋体;">：选项。要传递给</span> <strong><span lang="EN-US">Function</span></strong><span lang="EN-US"> </span><span style="font-family: 宋体;">对象的从</span><span lang="EN-US">0</span><span style="font-family: 宋体;">开始的参数值索引。</span> </pre>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">说明</span></strong><strong><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></strong></p>
<p style="margin: 0cm 112.45pt 0pt 0cm; line-height: 150%;"><font face="宋体"><strong><span lang="EN-US">Arguments</span></strong><span>是进行函数调用时，除了指定的参数外，还另外创建的一个隐藏对象。<strong><span lang="EN-US">Arguments</span></strong>是一个类似数组但不是数组的对象，说它类似数组是因为其具有数组一样的访问性质及方式，可以由<strong><span lang="EN-US">arguments[</span></strong></span><span lang="EN-US"><span><span class="MsoHyperlink"><em><u><font color="#0000ff">n</font></u></em></span></span><strong>]</strong></span><span>来访问对应的单个参数的值，并拥有数组长度属性</span><span lang="EN-US">length</span>。还有就是<strong><span lang="EN-US">arguments</span></strong><span>对象存储的是实际传递给函数的参数，而不局限于函数声明所定义的参数列表，而且</span>不能显式创建 <strong><span lang="EN-US">arguments</span></strong><span lang="EN-US"> </span>对象。<strong><span lang="EN-US">arguments</span></strong><span lang="EN-US"> </span>对象只有函数开始时才可用。下边例子详细说明了这些性质</font><span lang="EN-US"><font face="宋体">:<br />
</font></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 87.72%; height: 267px; background-color: #eeeeee;"><font face="宋体"><span style="color: #008000;">//</span><span style="color: #008000;">arguments&nbsp;对象的用法。</span></font><span style="color: #008000;"><br />
</span><span style="color: #0000ff;"><font face="宋体">function</font></span><font face="宋体"><span style="color: #000000;">&nbsp;ArgTest(a,&nbsp;b){<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i,&nbsp;s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">The&nbsp;ArgTest&nbsp;function&nbsp;expected&nbsp;</span><span style="color: #000000;">"</span></font><font face="宋体"><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;numargs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arguments.length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取被传递参数的数值。</span></font><span style="color: #008000;"><br />
</span><font face="宋体"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;expargs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ArgTest.length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取期望参数的数值。</span></font><span style="color: #008000;"><br />
</span><font face="宋体"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(expargs&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span></font><font face="宋体"><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;expargs&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;argument.&nbsp;</span><span style="color: #000000;">"</span></font><font face="宋体"><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span></font><span style="color: #000000;"><br />
<font face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</font></span><font face="宋体"><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;expargs&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;arguments.&nbsp;</span><span style="color: #000000;">"</span></font><font face="宋体"><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(numargs&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span></font><font face="宋体"><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;numargs&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;was&nbsp;passed.</span><span style="color: #000000;">"</span></font><font face="宋体"><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span></font><span style="color: #000000;"><br />
<font face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</font></span><font face="宋体"><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;numargs&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;were&nbsp;passed.</span><span style="color: #000000;">"</span></font><font face="宋体"><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\n\n</span><span style="color: #000000;">"</span></font><span style="color: #000000;"><br />
<font face="宋体">&nbsp;&nbsp;&nbsp;</font></span><font face="宋体"><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;numargs;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取参数内容。</span></font><span style="color: #008000;"><br />
</span><font face="宋体"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;Arg&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;=&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;arguments[i]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span></font><font face="宋体"><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">(s);&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;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;返回参数列表。</span></font><span style="color: #008000;"><br />
</span><span style="color: #000000;"><font face="宋体">}</font></span></div>
<p style="margin: 0cm 112.45pt 0pt 0cm; line-height: 150%;"><br />
<font face="宋体">在此添加了一个说明arguments不是数组(Array类)的代码:<br />
</font></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 88.6%; height: 75px; background-color: #eeeeee;"><font face="宋体"><span style="color: #000000;">Array.prototype.selfvalue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span></font><font face="宋体"><span style="color: #000000;">;<br />
alert(</span><span style="color: #0000ff;">new</span></font><font face="宋体"><span style="color: #000000;">&nbsp;Array().selfvalue);<br />
</span><span style="color: #0000ff;">function</span></font><span style="color: #000000;"><font face="宋体">&nbsp;testAguments(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;alert(arguments.selfvalue);<br />
}</font></span></div>
<p style="margin: 0cm 112.45pt 0pt 0cm; line-height: 150%;"><br />
<font face="宋体">运行代码你会发现第一个alert显示1，这表示数组对象拥有selfvalue属性，值为1，而当你调用函数testAguments时，你会发现显示的是&#8220;undefined&#8221;，说明了不是arguments的属性，即arguments并不是一个数组对象。<br />
<span style="color: red;"><strong>在此附加上大家推荐的一个简单方法</strong></span>：</font></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><font face="宋体"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000;">alert(arguments&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;Array);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />alert(arguments&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;Object);</span></font></div>
<p style="margin: 0cm 112.45pt 0pt 0cm; line-height: 150%;"><font face="宋体"><br />
<br />
</font><code><strong><span style="font-size: 14pt; line-height: 150%;" lang="EN-US"><font face="宋体"><span style="font-size: 13.5pt; line-height: 150%; font-family: Verdana;" lang="EN-US">&nbsp;caller</span><br />
</font></span></strong></code><span><font face="宋体">&nbsp; 返回一个对函数的引用，该函数调用了当前函数。<br />
</font></span><strong><span lang="EN-US"><font face="宋体">&nbsp; functionName.caller <br />
</font></span></strong><font face="宋体"><span lang="EN-US">&nbsp; functionName </span><span>对象是所执行函数的名称。<br />
</span></font><strong><font face="宋体">说明<br />
</font></strong><span><font face="宋体">对于函数来说，<strong><span lang="EN-US">caller</span></strong><span lang="EN-US"> </span>属性只有在函数执行时才有定义。如果函数是由顶层调用的，那么 <strong><span lang="EN-US">caller</span></strong><span lang="EN-US"> </span>包含的就是<span lang="EN-US"> null </span>。如果在字符串上下文中使用 <strong><span lang="EN-US">caller</span></strong><span lang="EN-US"> </span>属性，那么结果和<span lang="EN-US"> functionName.toString </span>一样，也就是说，显示的是函数的反编译文本。<br />
</font></span><span><font face="宋体">下面的例子说明了<span lang="EN-US"> caller </span>属性的用法：</font></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 84.29%; height: 166px; background-color: #eeeeee;"><span style="color: #008000;"><font face="宋体">//</font></span><span style="color: #008000;"><font face="宋体">&nbsp;caller&nbsp;demo&nbsp;{</font></span><span style="color: #008000;"><font face="宋体"><br />
</font></span><span style="color: #0000ff;"><font face="宋体">function</font></span><span style="color: #000000;"><font face="宋体">&nbsp;callerDemo()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">if</font></span><span style="color: #000000;"><font face="宋体">&nbsp;(callerDemo.caller)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">var</font></span><span style="color: #000000;"><font face="宋体">&nbsp;a</font></span><span style="color: #000000;"><font face="宋体">=</font></span><span style="color: #000000;"><font face="宋体">&nbsp;callerDemo.caller.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">else</font></span><span style="color: #000000;"><font face="宋体">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</font></span><span style="color: #000000;"><font face="宋体">"</font></span><span style="color: #000000;"><font face="宋体">this&nbsp;is&nbsp;a&nbsp;top&nbsp;function</font></span><span style="color: #000000;"><font face="宋体">"</font></span><span style="color: #000000;"><font face="宋体">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</font></span><span style="color: #0000ff;"><font face="宋体">function</font></span><span style="color: #000000;"><font face="宋体">&nbsp;handleCaller()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;callerDemo();<br />
}</font></span></div>
<p style="margin: 0cm 112.45pt 0pt 0cm; line-height: 150%;"><br />
<strong><span style="font-size: 13.5pt; line-height: 150%; font-family: Verdana;" lang="EN-US">callee<o:p></o:p></span></strong></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体">&nbsp;&nbsp;&nbsp; 返回正被执行的 <strong><span lang="EN-US">Function </span></strong>对象，也就是所指定的 <strong><span lang="EN-US">Function </span></strong>对象的正文。</font></p>
<pre style="line-height: 150%;"><span lang="EN-US"><font face="宋体">[<strong><em>function</em>.</strong>]<strong>arguments.</strong><strong>callee</strong></font></span></pre>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体">可选项 <em><span lang="EN-US">function</span></em><span lang="EN-US"> </span>参数是当前正在执行的<strong><span lang="EN-US"> Function</span></strong><span lang="EN-US"> </span>对象的名称。</font></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><font face="宋体">说明<span lang="EN-US"><o:p></o:p></span></font></strong></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体"><strong><span lang="EN-US">callee</span></strong><span lang="EN-US"> </span>属性的初始值就是正被执行的 <strong><span lang="EN-US">Function </span></strong>对象。</font></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体"><strong><span lang="EN-US">callee</span></strong><span lang="EN-US"> </span>属性是 <strong><span lang="EN-US">arguments </span></strong>对象的一个成员，<span style="color: red;"><strong>它表示对函数对象本身的引用，这有利于匿名<br />
函数的递归或者保证函数的封装性</strong></span>，例如下边示例的递归计算<span lang="EN-US">1</span>到<span lang="EN-US">n</span>的自然数之和。而该属性<br />
仅当相关函数正在执行时才可用。还有需要注意的是<strong><span lang="EN-US">callee</span></strong>拥有<span lang="EN-US">length</span>属性，这个属性有时候<br />
用于验证还是比较好的。<strong><span lang="EN-US">arguments.length</span></strong>是实参长度，<strong><span lang="EN-US">arguments.callee.length</span></strong>是<br />
形参长度，由此可以判断调用时形参长度是否和实参长度一致。</font></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><font face="宋体">示例<br />
</font></strong></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 89.75%; height: 297px; background-color: #eeeeee;"><span style="color: #008000;"><strong><font face="宋体">//</font></strong></span><span style="color: #008000;"><strong><font face="宋体">callee可以打印其本身</font></strong></span><span style="color: #008000;"><strong><font face="宋体"><br />
</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">function</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;calleeDemo()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;alert(arguments.callee);<br />
}<br />
</font></strong></span><span style="color: #008000;"><strong><font face="宋体">//</font></strong></span><span style="color: #008000;"><strong><font face="宋体">用于验证参数</font></strong></span><span style="color: #008000;"><strong><font face="宋体"><br />
</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">function</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;calleeLengthDemo(arg1,&nbsp;arg2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">if</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;(arguments.length</font></strong></span><span style="color: #000000;"><strong><font face="宋体">==</font></strong></span><span style="color: #000000;"><strong><font face="宋体">arguments.callee.length)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.alert(</font></strong></span><span style="color: #000000;"><strong><font face="宋体">"</font></strong></span><span style="color: #000000;"><strong><font face="宋体">验证形参和实参长度正确！</font></strong></span><span style="color: #000000;"><strong><font face="宋体">"</font></strong></span><span style="color: #000000;"><strong><font face="宋体">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">return</font></strong></span><span style="color: #000000;"><strong><font face="宋体">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">else</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</font></strong></span><span style="color: #000000;"><strong><font face="宋体">"</font></strong></span><span style="color: #000000;"><strong><font face="宋体">实参长度：</font></strong></span><span style="color: #000000;"><strong><font face="宋体">"</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">+</font></strong></span><span style="color: #000000;"><strong><font face="宋体">arguments.length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</font></strong></span><span style="color: #000000;"><strong><font face="宋体">"</font></strong></span><span style="color: #000000;"><strong><font face="宋体">形参长度：&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">"</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">+</font></strong></span><span style="color: #000000;"><strong><font face="宋体">arguments.callee.length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</font></strong></span><span style="color: #008000;"><strong><font face="宋体">//</font></strong></span><span style="color: #008000;"><strong><font face="宋体">递归计算</font></strong></span><span style="color: #008000;"><strong><font face="宋体"><br />
</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">var</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;sum&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">=</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">function</font></strong></span><span style="color: #000000;"><strong><font face="宋体">(n){<br />
&nbsp;&nbsp;</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">if</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;(n&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&lt;=</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">0</font></strong></span><span style="color: #000000;"><strong><font face="宋体">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">return</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">1</font></strong></span><span style="color: #000000;"><strong><font face="宋体">;<br />
&nbsp;&nbsp;</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">else</font></strong></span><span style="color: #000000;"><strong><font face="宋体"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</font></strong></span><span style="color: #0000ff;"><strong><font face="宋体">return</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;n&nbsp;＋arguments.callee(n&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">-</font></strong></span><span style="color: #000000;"><strong><font face="宋体">&nbsp;</font></strong></span><span style="color: #000000;"><strong><font face="宋体">1</font></strong></span><span style="color: #000000;"><strong><font face="宋体">)<br />
}</font></strong></span></div>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong></strong><font face="宋体">比较一般的递归函数：</font></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 91.21%; height: 62px; background-color: #eeeeee;"><span style="color: #0000ff;"><font face="宋体">var</font></span><span style="color: #000000;"><font face="宋体">&nbsp;sum&nbsp;</font></span><span style="color: #000000;"><font face="宋体">=</font></span><span style="color: #000000;"><font face="宋体">&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">function</font></span><span style="color: #000000;"><font face="宋体">(n){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">if</font></span><span style="color: #000000;"><font face="宋体">&nbsp;(</font></span><span style="color: #000000;"><font face="宋体">1</font></span><span style="color: #000000;"><font face="宋体">==</font></span><span style="color: #000000;"><font face="宋体">n)&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">return</font></span><span style="color: #000000;"><font face="宋体">&nbsp;</font></span><span style="color: #000000;"><font face="宋体">1</font></span><span style="color: #000000;"><font face="宋体">;<br />
</font></span><span style="color: #0000ff;"><font face="宋体">else</font></span><span style="color: #000000;"><font face="宋体">&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">return</font></span><span style="color: #000000;"><font face="宋体">&nbsp;n&nbsp;</font></span><span style="color: #000000;"><font face="宋体">+</font></span><span style="color: #000000;"><font face="宋体">&nbsp;sum&nbsp;(n</font></span><span style="color: #000000;"><font face="宋体">-</font></span><span style="color: #000000;"><font face="宋体">1</font></span><span style="color: #000000;"><font face="宋体">);<br />
</font></span></div>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体">调用时：<span lang="EN-US">alert(sum(100));<br />
</span></font><font face="宋体">其中函数内部包含了对<span lang="EN-US">sum</span>自身的引用，函数名仅仅是一个变量名，在函数内部调用<span lang="EN-US">sum</span>即相当于调用<br />
一个全局变量，不能很好的体现出是调用自身，这时使用<strong><span lang="EN-US">callee</span></strong>会是一个比较好的方法。<br />
</font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><span style="font-size: 14pt; line-height: 150%;" lang="EN-US">apply and call<o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">&nbsp;&nbsp; 它们的作用都是将函数绑定到另外一个对象上去运行，两者仅在定义参数方式有所区别：</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><span style="font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp; apply</span></strong><span style="font-family: Verdana;" lang="EN-US">(thisArg,argArray);</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><span style="font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp; call</span></strong><span style="font-family: Verdana;" lang="EN-US">(thisArg[,arg1,arg2&#8230;] ]);<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="font-family: 宋体;">即所有函数内部的</span><span lang="EN-US">this</span><span style="font-family: 宋体;">指针都会被赋值为</span><span lang="EN-US">thisArg</span><span style="font-family: 宋体;">，这可实现将函数作为另外一个对象的方法运行的目的</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><span style="font-size: 12pt; line-height: 150%; font-family: Verdana;" lang="EN-US">apply</span></strong><strong><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">的说明</span></strong><strong><span style="font-size: 12pt; line-height: 150%; font-family: Verdana;" lang="EN-US"><o:p></o:p></span></strong></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体">如果 <em><span lang="EN-US">argArray</span></em><span lang="EN-US"> </span>不是一个有效的数组或者不是 <strong><span lang="EN-US">arguments</span></strong><span lang="EN-US"> </span>对象，那么将导致一个<span lang="EN-US"> TypeError</span>。<br />
如果没有提供 <em><span lang="EN-US">argArray</span></em><span lang="EN-US"> </span>和 </font><span style="font-family: Verdana;" lang="EN-US">thisArg</span><font face="宋体">任何一个参数，那么 <strong><span lang="EN-US">Global </span></strong>对象将被用作 </font><span style="font-family: Verdana;" lang="EN-US">thisArg</span><font face="宋体"><em>，</em> <br />
并且无法被传递任何参数。</font></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><font face="宋体"><span lang="EN-US">call</span>的说明<span lang="EN-US"><o:p></o:p></span></font></strong></p>
<p style="margin: 0cm 0cm 0pt; line-height: 150%;"><font face="宋体"><strong><span lang="EN-US">call</span></strong><span lang="EN-US"> </span>方法可将一个函数的对象上下文从初始的上下文改变为由 </font><span style="font-family: Verdana;" lang="EN-US">thisArg</span><font face="宋体">指定的新对象。<br />
如果没有提供 </font><span style="font-family: Verdana;" lang="EN-US">thisArg</span><font face="宋体">参数，那么<span lang="EN-US"> Global </span>对象被用作 </font><span style="font-family: Verdana;" lang="EN-US">thisArg</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">相关技巧</span></strong><span style="font-family: 宋体;">：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="font-family: 宋体;">应用</span><strong><span lang="EN-US">call</span></strong><span style="font-family: 宋体;">和</span><strong><span lang="EN-US">apply</span></strong><span style="font-family: 宋体;">还有一个技巧在里面，就是用</span><strong><span lang="EN-US">call</span></strong><span style="font-family: 宋体;">和</span><strong><span lang="EN-US">apply</span></strong><span style="font-family: 宋体;">应用另一个函数（类）以后，当前的<br />
函数（类）就具备了另一个函数（类）的方法或者是属性，这也可以称之为&#8220;继承&#8221;。看下面示例:</span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 90.3%; height: 168px; background-color: #eeeeee;"><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;继承的演示</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;base()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.member&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;dnnsun_Member</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.alert(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.member);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;extend()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;base.call(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;window.alert(member);<br />
&nbsp;&nbsp;&nbsp;&nbsp;window.alert(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.method);<br />
}</span></div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><br />
上面的例子可以看出，通过<strong><span style="font-family: Verdana;" lang="EN-US">call</span></strong><span style="font-family: 宋体;">之后，</span><span style="font-family: Verdana;" lang="EN-US">extend</span><span style="font-family: 宋体;">可以继承到</span><span style="font-family: Verdana;" lang="EN-US">base</span><span style="font-family: 宋体;">的方法和属性。</span><span style="font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="font-family: Verdana;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="font-family: 宋体;">顺便提一下，在</span><span style="font-family: Verdana;" lang="EN-US">javascript</span><span style="font-family: 宋体;">框架</span><span style="font-family: Verdana;" lang="EN-US">prototype</span><span style="font-family: 宋体;">里就使用</span><span style="font-family: Verdana;" lang="EN-US">apply</span><span style="font-family: 宋体;">来创建一个定义类的模式，</span><span style="font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><span style="font-family: 宋体;">其实现代码如下：</span><code></code></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 85.75%; height: 178px; background-color: #eeeeee;"><span style="color: #0000ff;"><font face="宋体">var</font></span><span style="color: #000000;"><font face="宋体">&nbsp;Class&nbsp;</font></span><span style="color: #000000;"><font face="宋体">=</font></span><span style="color: #000000;"><font face="宋体">&nbsp;{<br />
&nbsp;&nbsp;create:&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">function</font></span><span style="color: #000000;"><font face="宋体">()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">return</font></span><span style="color: #000000;"><font face="宋体">&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">function</font></span><span style="color: #000000;"><font face="宋体">()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="color: #0000ff;"><font face="宋体">this</font></span><span style="color: #000000;"><font face="宋体">.initialize.apply(</font></span><span style="color: #0000ff;"><font face="宋体">this</font></span><span style="color: #000000;"><font face="宋体">,&nbsp;arguments);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}</font></span></div>
<p style="margin: 0cm 0cm 0pt;"><font face="宋体">解析：从代码看<span lang="EN-US">,</span>该对象仅包含一个方法：<span lang="EN-US">Create</span>，其返回一个函数，即类。但这也同时是类的<br />
构造函数，其中调用<span lang="EN-US">initialize</span>，而这个方法是在类创建时定义的初始化函数。通过如此途径，<br />
就可以实现<span lang="EN-US">prototype</span>中的类创建模式<span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><strong><span style="font-family: 宋体;">示例</span></strong><span style="font-family: 宋体;">：</span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 86.74%; height: 179px; background-color: #eeeeee;"><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;vehicle</span><span style="color: #000000;">=</span><span style="color: #000000;">Class.create();<br />
vehicle.prototype</span><span style="color: #000000;">=</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;initialize:</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(type){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.type</span><span style="color: #000000;">=</span><span style="color: #000000;">type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;showSelf:</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000;">"</span><span style="color: #000000;">this&nbsp;vehicle&nbsp;is&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.type);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;moto</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;vehicle(</span><span style="color: #000000;">"</span><span style="color: #000000;">Moto</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
moto.showSelf();<br />
</span></div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><br />
更详细的关于<span style="font-family: Verdana;" lang="EN-US">prototype</span><span style="font-family: 宋体;">信息请到其官方网站查看。<br />
</span><span style="font-family: Verdana;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: 150%;"><code><span style="font-family: 宋体;"><o:p><font face="宋体">评论还有更精彩对此的理解，在这我就不再添加了，大家可以看看加深理解。 <br />
</font></o:p></span></code></p>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/264798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-10 12:41 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/10/264798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 浅谈javascript函数劫持[转自xfocus]</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/10/264761.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Fri, 10 Apr 2009 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/10/264761.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/264761.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/10/264761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/264761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/264761.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转 http://www.cnitblog.com/yemoo/archive/2008/06/23/45937.html一、概述javascript函数劫持，也就是老外提到的javascript hijacking技术。最早还是和剑心同学讨论问题时偶然看到的一段代码，大概这样写的：window.alert = function(s) {};觉得这种用法很巧妙新颖，和A...&nbsp;&nbsp;<a href='http://www.blogjava.net/hulizhong/archive/2009/04/10/264761.html'>阅读全文</a><img src ="http://www.blogjava.net/hulizhong/aggbug/264761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-10 09:02 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/10/264761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Javascript的IE和Firefox兼容性汇编</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/09/264707.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 09 Apr 2009 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/09/264707.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/264707.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/09/264707.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/264707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/264707.html</trackback:ping><description><![CDATA[<p>转 http://blog.csdn.net/nileel/archive/2009/04/08/4056463.aspx<span style="color: #0000ff"><span style="color: #000000"><br />
微软关于IE、Firefox、Opera和Safari的JavaScript兼容性研究曾经发表过一份草案,可以点击下载《</span><a href="http://wiki.ecmascript.org/lib/exe/fetch.php?id=resources%3Aresources&amp;cache=cache&amp;media=resources:jscriptdeviationsfromes3.pdf"><span style="color: #000000">JScript Deviations from ES3</span></a><span style="color: #000000">》</span></span><span style="color: #000000">&nbsp;以下为网上的一些搜集和整理(FF代表Firefox)</span></p>
<p>&nbsp;<span style="color: #0000ff">集合类对象问题</span><br />
现有代码中存在许多 document.form.item("itemName") 这样的语句，不能在 FF 下运行<br />
解决方法：<br />
改用 document.form.elements["elementName"]<br />
说明:IE下,可以使用()或[]获取集合类对象;Firefox下,只能使用[]获取集合类对象.<br />
解决方法:统一使用[]获取集合类对象.</p>
<p><br />
<span style="color: #0000ff">window.event</span><br />
现有问题：<br />
使用 window.event 无法在 FF 上运行<br />
解决方法：<br />
FF 的 event 只能在事件发生的现场使用，此问题暂无法解决。可以这样变通：<br />
原代码(可在IE中运行)：<br />
<span style="background-color: #c0c0c0">&lt;input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/&gt;<br />
&lt;script language="javascript"&gt;<br />
&nbsp;&nbsp;&nbsp; function gotoSubmit() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(window.event);&nbsp;&nbsp;&nbsp; // use window.event<br />
&nbsp;&nbsp;&nbsp; }<br />
&lt;/script&gt;</span><br />
新代码(可在IE和FF中运行)：<br />
<span style="background-color: #c0c0c0">&lt;input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/&gt;<br />
&lt;script language="javascript"&gt;<br />
&nbsp;&nbsp; function gotoSubmit(e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e = e? e : (window.event ? window.event : null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; }<br />
&lt;/script&gt;</span><br />
此外，如果新代码中第一行不改，与老代码一样的话（即 gotoSubmit 调用没有给参数），则仍然只能在IE中运行，但不会出错。所以，这种方案 tpl 部分仍与老代码兼容。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">HTML 对象的 id 作为对象名的问题</span><br />
现有问题：<br />
在 IE 中，HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 FF 中不能。<br />
解决方法：<br />
用 getElementById("idName") 代替 idName 作为对象变量使用。</p>
<p>用idName字符串取得对象的问题<br />
现有问题：<br />
在IE中，利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象，在FF 中不能。<br />
解决方法：<br />
用 getElementById(idName) 代替 eval(idName)。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">变量名与某 HTML 对象 id 相同的问题</span><br />
现有问题：<br />
在 FF 中，因为对象 id 不作为 HTML 对象的名称，所以可以使用与 HTML 对象 id 相同的变量名，IE 中不能。<br />
解决方法：<br />
在声明变量时，一律加上 var ，以避免歧义，这样在 IE 中亦可正常运行。<br />
此外，最好不要取与 HTML 对象 id 相同的变量名，以减少错误。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">event.x 与 event.y 问题</span><br />
现有问题：<br />
在IE 中，event 对象有 x, y 属性，FF中没有。<br />
解决方法：<br />
在FF中，与event.x 等效的是 event.pageX。但event.pageX IE中没有。<br />
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。<br />
event.clientX 与 event.pageX 有微妙的差别（当整个页面有滚动条的时候），不过大多数时候是等效的。<br />
如果要完全一样，可以稍麻烦些：<br />
mX = event.x ? event.x : event.pageX;<br />
然后用 mX 代替 event.x<br />
其它：<br />
event.layerX 在 IE 与 FF 中都有，具体意义有无差别尚未试验。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">关于frame</span><br />
现有问题：<br />
在 IE中 可以用window.testFrame取得该frame，FF中不行<br />
解决方法：<br />
在frame的使用方面FF和ie的最主要的区别是：<br />
如果在frame标签中书写了以下属性：<br />
&lt;frame src="/xx.htm" id="frameId" name="frameName" /&gt;<br />
那么ie可以通过id或者name访问这个frame对应的window对象<br />
而FF只可以通过name来访问这个frame对应的window对象<br />
例如如果上述frame标签写在最上层的window里面的htm里面，那么可以这样访问<br />
IE： window.top.frameId或者window.top.frameName来访问这个window对象<br />
FF： 只能这样window.top.frameName来访问这个window对象<br />
另外，在FF和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签<br />
并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容<br />
也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">父结点的问题</span><br />
在FF中没有 parentElement parentElement.children&nbsp; 而用 parentNode parentNode.childNodes<br />
childNodes的下标的含义在IE和FF中不同，FF使用DOM规范，childNodes中会插入空白文本节点。<br />
一般可以通过node.getElementsByTagName()来回避这个问题。当html中节点缺失时，IE和FF对parentNode的解释不同，例如<br />
<span style="background-color: #c0c0c0">&lt;form&gt;<br />
&lt;table&gt;<br />
&nbsp; &lt;input/&gt;<br />
&lt;/table&gt;<br />
&lt;/form&gt;</span><br />
FF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点<br />
FF中节点没有removeNode方法，必须使用如下方法 node.parentNode.removeChild(node)</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">const 问题</span><br />
现有问题：<br />
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。<br />
解决方法：<br />
不使用 const ，以 var 代替。</p>
<p>body 对象<br />
FF的body在body标签没有被浏览器完全读入之前就存在，而IE则必须在body完全被读入之后才存在</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">URLencoding</span><br />
在js中如果书写url就直接写&amp;不要写&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';<br />
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器<br />
一般会服务器报错参数没有找到<br />
当然如果是在tpl中例外，因为tpl中符合xml规范，要求&amp;书写为&amp;<br />
一般FF无法识别js中的&amp;</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">nodeName 和 tagName 问题</span><br />
现有问题：<br />
在FF中，所有节点均有 nodeName 值，但 textNode 没有 tagName 值。在 IE 中，nodeName 的使用好象有问题<br />
解决方法：<br />
使用 tagName，但应检测其是否为空。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">元素属性</span><br />
IE下 input.type属性为只读，但是FF下可以修改<br />
document.getElementsByName() 和 document.all[name] 的问题<br />
在 IE 中，getElementsByName()、document.all[name] 均不能用来取得多个具有相同name的div 元素集合。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">兼容firefox的 outerHTML，FF中没有outerHtml的方法</span></p>
<p><span style="background-color: #c0c0c0">if (window.HTMLElement) {<br />
&nbsp; HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var r=this.ownerDocument.createRange();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r.setStartBefore(this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var df=r.createContextualFragment(sHTML);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.parentNode.replaceChild(df,this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sHTML;<br />
&nbsp;&nbsp;&nbsp; });</span></p>
<p><span style="background-color: #c0c0c0">&nbsp;&nbsp;&nbsp; HTMLElement.prototype.__defineGetter__("outerHTML",function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var attr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var attrs=this.attributes;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var str="&lt;"+this.tagName.toLowerCase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i=0;i&lt;attrs.length;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attr=attrs[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(attr.specified)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str+=" "+attr.name+'="'+attr.value+'"';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="background-color: #c0c0c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!this.canHaveChildren)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str+"&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str+"&gt;"+this.innerHTML+"&lt;/"+this.tagName.toLowerCase()+"&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</span></p>
<p><span style="background-color: #c0c0c0">&nbsp;&nbsp; HTMLElement.prototype.__defineGetter__("canHaveChildren",function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; switch(this.tagName.toLowerCase()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "area":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "base":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "basefont":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "col":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "frame":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "hr":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "img":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "br":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "input":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "isindex":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "link":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "meta":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "param":<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp; });<br />
}</span></p>
<p><br />
<span style="color: #0000ff">自定义属性问题</span><br />
说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;FF下,只能使用getAttribute()获取自定义属性.<br />
解决方法:统一通过getAttribute()获取自定义属性.</p>
<p>&nbsp;<br />
<span style="color: #0000ff">event.srcElement问题</span><br />
说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性.<br />
解决方法:使用obj(obj = event.srcElement ? event.srcElement : event.target;)来代替IE下的event.srcElement或者Firefox下的event.target. </p>
<p><br />
<span style="color: #0000ff">window.location.href问题</span><br />
说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location.<br />
解决方法:使用window.location来代替window.location.href.</p>
<p><br />
<span style="color: #0000ff">模态和非模态窗口问题</span><br />
说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能.<br />
解决方法:直接使用window.open(pageURL,name,parameters)方式打开新窗口<br />
如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口. 例如：var parWin = window.opener; parWin.document.getElementById("Aqing").value = "Aqing";</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">事件委托方法</span><br />
IE：document.body.onload = inject; //Function inject()在这之前已被实现<br />
FF：document.body.onload = inject();<br />
如果要加传递参数，可以做个闭包<br />
<span style="background-color: #c0c0c0">(function(arg){</span></p>
<p><span style="background-color: #c0c0c0">&nbsp;&nbsp; document.body.onload=function(){inject(arg);};</span></p>
<p><span style="background-color: #c0c0c0">})(arg)</span></p>
<p>innerText在IE中能正常工作，但是innerText在FireFox中却不行.<br />
解决方法:<br />
<span style="background-color: #c0c0c0">if(navigator.appName.indexOf("Explorer") &gt; -1){<br />
&nbsp;&nbsp;&nbsp; document.getElementById('element').innerText = "my text";<br />
} else{<br />
&nbsp;&nbsp;&nbsp; document.getElementById('element').textContent = "my text";<br />
}</span></p>
<p><br />
<span style="color: #0000ff">FF中类似 obj.style.height = imgObj.height 的语句无效</span><br />
解决方法：<br />
obj.style.height = imgObj.height + 'px';</p>
<p><br />
<span style="color: #0000ff">IE,FF以及其它浏览器对于 table 标签的操作都各不相同，在ie中不允许对table和tr的innerHTML赋值，使用js增加一个tr时，使用appendChile方法也不管用</span><br />
解决方法：<br />
//向table追加一个空行：<br />
var row = otable.insertRow(-1);<br />
var cell = document.createElement("td");<br />
cell.innerHTML = " ";<br />
cell.className = "XXXX";<br />
row.appendChild(cell);</p>
<p><br />
<span style="color: #ff0000">样式部分</span><br />
-----------------------------------------------------------------------------------------------------------<br />
cursor:hand VS cursor:pointer<br />
FF不支持hand，但ie支持pointer<br />
解决方法: 统一使用pointer</p>
<p>padding 问题<br />
padding 5px 4px 3px 1px FireFox无法解释简写,<br />
必须改成 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px;</p>
<p>消除ulol等列表的缩进时<br />
样式应写成:list-style:none;margin:0px;padding:0px;<br />
其中margin属性对IE有效，padding属性对FireFox有效</p>
<p>CSS透明<br />
IE：filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)<br />
FF：opacity:0.6</p>
<p>CSS圆角<br />
IE：不支持圆角<br />
FF： -moz-border-radius:4px，或者-moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius- bottomright:4px;</p>
<p>CSS双线凹凸边框<br />
IE：border:2px outset;<br />
FF： -moz-border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080;</p><img src ="http://www.blogjava.net/hulizhong/aggbug/264707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-09 21:02 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/09/264707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 认识延迟时间为0的setTimeout</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/08/264440.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 08 Apr 2009 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/08/264440.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/264440.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/08/264440.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/264440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/264440.html</trackback:ping><description><![CDATA[转 http://www.52web.com/52article/?view-145.html<br />
<br />
<div id="article_showsummary"><strong>摘要:</strong> 现有的 JavaScript 引擎是单线程处理任务的。它把任务放到队列中，不会同步去执行，必须在完成一个任务后才开始另外一个任务。</div>
<p>由 John Resig 的 How <a href="http://www.52web.com/52article/?tag-javascript.html" class="showtag" target="_blank" title="查看&#8220;JavaScript&#8221;的相关文章">JavaScript</a> Timers Work 可以知道，现有的 JavaScript 引擎是<a href="http://www.52web.com/52article/?tag-%B5%A5%CF%DF%B3%CC.html" class="showtag" target="_blank" title="查看&#8220;单线程&#8221;的相关文章">单线程</a>处理任务的。它把任务放到队列中，不会同步去执行，必须在完成一个任务后才开始另外一个任务。</p>
<p>让我们看看之前的文章：<a href="http://www.52web.com/52article/?view-144.html" target="_blank">JavaScript的9个陷阱及评点</a>，在第 9 点 Focus Pocus 中提到的问题。原作者对这个认识有所偏差，其实不只是 IE 的问题，而是现有 JavaScript 引擎对于线程实现的问题（关于线程，我的概念其实不多，如果不对，希望读者多多指教）。我们通过一个关于<a href="http://www.52web.com/52article/?tag-settimeout.html" class="showtag" target="_blank" title="查看&#8220;settimeout&#8221;的相关文章">settimeout</a>的例子来说明，请访问 <a href="http://realazy.org/lab/settimeout.html" target="_blank">http://realazy.org/lab/settimeout.html</a>. 我们来看 1 和 2。如果你能看看源代码，会发现我们的任务很简单，就是给文档增加一个 input 文本框，并聚焦和选中。请现在分别点击一下，可以看到，1 并没有能够聚焦和选中，而 2 可以。它们之间的区别在于，在执行：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>input.focus();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>input.select();&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">input.focus();
input.select();
</pre>
<br />
时， 2 多了一个延迟时间为 0 的 setTimeout 的外围函数，即：<br />
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>setTimeout(</span><span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>input.focus();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>input.select();&nbsp;&nbsp;</span></li>
    <li class=""><span>},&nbsp;0);&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">setTimeout(function(){
input.focus();
input.select();
}, 0);
</pre>
<p>按照 JavaScript: The Definitive Guide 5th 的 14.1 所说：<br />
</p>
<blockquote class="showquote">在实践中，setTimeout 会在其完成当前任何延宕事件的事件处理器的执行，以及完成文档当前状态更新后，告诉浏览器去启用 setTimeout 内注册的函数。</blockquote>
<p>其实，这是一个把需要执行的任务从队列中跳脱的技巧。回到前面的例子，JavaScript 引擎在执行 onkeypress
时，由于没有多线程的同步执行，不可能同时去处理刚创建元素的 focus 和 select 事件，由于这两个事件都不在队列中，在完成
onkeypress 后，JavaScript 引擎已经丢弃了这两个事件，正如你看到的例子 1 的情况。而在例子 2
中，由于setTimeout可以把任务从某个队列中跳脱成为新队列，因而能够得到期望的结果。</p>
<p>这才是延迟事件为 0 的setTimeout的真正目的。在此，你可以看看例子
3，它的任务是实时更新输入的文本，现在请试试，你会发现预览区域总是落后一拍，比如你输 a, 预览区并没有出现 a, 在紧接输入 b 时， a
才不慌不忙地出现。其实我们是有办法让预览区跟输入框同步地，在此我没有给出答案，因为上面所说的，就是解决思路，try it yourself!</p>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/264440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-08 13:04 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/08/264440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 JavaScript的9个陷阱及评点</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/08/264439.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 08 Apr 2009 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/08/264439.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/264439.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/08/264439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/264439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/264439.html</trackback:ping><description><![CDATA[转 http://www.52web.com/52article/?view-144.html<br />
<br />
<div id="article_showsummary"><strong>摘要:</strong> JavaScript容易犯错的九个陷阱，虽然不是什么很高深的技术问题，但注意一下，会使您的编程轻松些，即所谓make life easier. 笔者对某些陷阱会混杂一些评点。</div>
<p>以下是<a href="http://www.52web.com/52article/?tag-javascript.html" class="showtag" target="_blank" title="查看&#8220;JavaScript&#8221;的相关文章">JavaScript</a>容易犯错的九个<a href="http://www.52web.com/52article/?tag-%CF%DD%DA%E5.html" class="showtag" target="_blank" title="查看&#8220;陷阱&#8221;的相关文章">陷阱</a>，来自 <a href="http://www.fitzblog.com/tabid/17782/bid/2127/Nine-Javascript-Gotchas.aspx" target="_blank">Nine Javascript Gotchas</a> 。虽然不是什么很高深的技术问题，但注意一下，会使您的编程轻松些，即所谓make life easier. 笔者对某些陷阱会混杂一些评点。</p>
<p><span class="fstrong">1.最后一个逗号</span></p>
<p>如这段代码，注意最后一个逗号，按语言学角度来说应该是不错的（python的类似数据类型辞典dictionary就允许如此）。IE会报语法错误，但语焉不详，你只能用人眼从几千行代码中扫描。<br />
</p>
<div class="dp-highlighter"><br />
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;script&gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;theObj&nbsp;=&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>city&nbsp;:&nbsp;<span class="string">"Boston"</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>state&nbsp;:&nbsp;<span class="string">"MA"</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">&lt;script&gt;
var theObj = {
city : "Boston",
state : "MA",
}
&lt;/script&gt;
</pre>
<p><span class="fstrong">2.this的引用会改变</span></p>
<p>如这段代码：<br />
</p>
<div class="dp-highlighter"><br />
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;input&nbsp;type=</span><span class="string">"button"</span><span>&nbsp;value=</span><span class="string">"Gotcha!"</span><span>&nbsp;id=</span><span class="string">"MyButton"</span><span>&nbsp;&gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;script&gt;&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;MyObject&nbsp;=&nbsp;</span><span class="keyword">function</span><span>&nbsp;()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">this</span><span>.alertMessage&nbsp;=&nbsp;</span><span class="string">"Javascript&nbsp;rules"</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">this</span><span>.ClickHandler&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>alert(<span class="keyword">this</span><span>.alertMessage&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>}();&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="func">document</span><span>.getElementById(&#8221;theText&#8221;).onclick&nbsp;=&nbsp;&nbsp;MyObject.ClickHandler&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">&lt;input type="button" value="Gotcha!" id="MyButton" &gt;
&lt;script&gt;
var MyObject = function () {
this.alertMessage = "Javascript rules";
this.ClickHandler = function() {
alert(this.alertMessage );
}
}();
document.getElementById(&#8221;theText&#8221;).onclick =  MyObject.ClickHandler
&lt;/script&gt;
</pre>
<p>并不如你所愿，答案并不是&#8221;JavaScript rules&#8221;。在执行MyObject.ClickHandler时，代码中红色这行，this的引用实际上指向的是document.getElementById("theText")的引用。可以这么解决：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;input&nbsp;type=</span><span class="string">"button"</span><span>&nbsp;value=</span><span class="string">"Gotcha!"</span><span>&nbsp;id=</span><span class="string">"theText"</span><span>&nbsp;&gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;script&gt;&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;MyObject&nbsp;=&nbsp;</span><span class="keyword">function</span><span>&nbsp;()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;self&nbsp;=&nbsp;</span><span class="keyword">this</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">this</span><span>.alertMessage&nbsp;=&nbsp;&#8220;Javascript&nbsp;rules&#8221;;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">this</span><span>.OnClick&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>alert(self.value);&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}();&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="func">document</span><span>.getElementById(&#8221;theText&#8221;).onclick&nbsp;=&nbsp;&nbsp;MyObject.OnClick&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">&lt;input type="button" value="Gotcha!" id="theText" &gt;
&lt;script&gt;
var MyObject = function () {
var self = this;
this.alertMessage = &#8220;Javascript rules&#8221;;
this.OnClick = function() {
alert(self.value);
}
}();
document.getElementById(&#8221;theText&#8221;).onclick =  MyObject.OnClick
&lt;/script&gt;
</pre>
<p>实质上，这就是JavaScript作用域的问题。如果你看过，你会发现解决方案不止一种。</p>
<p><span class="fstrong">3.标识盗贼</span></p>
<p>在JavaScript中不要使用跟HTML的id一样的变量名。如下代码：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;input&nbsp;type=</span><span class="string">"button"</span><span>&nbsp;id=</span><span class="string">"TheButton"</span><span>&gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;script&gt;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>TheButton&nbsp;=&nbsp;get(<span class="string">"TheButton"</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">&lt;input type="button" id="TheButton"&gt;
&lt;script&gt;
TheButton = get("TheButton");
&lt;/script&gt;
</pre>
<p>IE会报对象未定义的错误。我只能说：IE sucks.</p>
<p><span class="fstrong">4.字符串只替换第一个匹配</span></p>
<p>如下代码：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;script&gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;fileName&nbsp;=&nbsp;</span><span class="string">"This&nbsp;is&nbsp;a&nbsp;title"</span><span>.replace(</span><span class="string">"&nbsp;"</span><span>,</span><span class="string">"_"</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">&lt;script&gt;
var fileName = "This is a title".replace(" ","_");
&lt;/script&gt;
</pre>
<p>而实际上，结果是&#8221;This_is a title&#8220;. 在JavaScript中，String.replace的第一个参数应该是正则表达式。所以，正确的做法是这样：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;fileName&nbsp;=&nbsp;</span><span class="string">"This&nbsp;is&nbsp;a&nbsp;title"</span><span>.replace(/&nbsp;/g,</span><span class="string">"_"</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">var fileName = "This is a title".replace(/ /g,"_");
</pre>
<p><span class="fstrong">5.mouseout意味着mousein</span></p>
<p>事实上，这是由于事件冒泡导致的。IE中有mouseenter和mouseleave，但不是标准的。作者在此建议大家使用库比如YUI来解决问题。</p>
<p><span class="fstrong">6.parseInt是基于进制体系的</span></p>
<p>这个是常识，可是很多人给忽略了parseInt还有第二个参数，用以指明进制。比如，parseInt("09")，如果你认为答案是9，那就错
了。因为，在此，字符串以0开头，parseInt以八进制来处理它，在八进制中，09是非法，返回false，布尔值false转化成数值就是0.
因此，正确的做法是parseInt("09", 10).</p>
<p><span class="fstrong">7.for...in...会遍历所有的东西</span></p>
<p>有一段这样的代码：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;arr&nbsp;=&nbsp;[5,10,15]&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;total&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">for</span><span>&nbsp;(&nbsp;</span><span class="keyword">var</span><span>&nbsp;x&nbsp;</span><span class="keyword">in</span><span>&nbsp;arr)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>total&nbsp;=&nbsp;total&nbsp;*&nbsp;arr[x];&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">var arr = [5,10,15]
var total = 1;
for ( var x in arr) {
total = total * arr[x];
}
</pre>
<p>运行得好好的，不是吗？但是有一天它不干了，给我返回的值变成了NaN,
晕。我只不过引入了一个库而已啊。原来是这个库改写了Array的prototype，这样，我们的arr平白无过多出了一个属性（方法），而
for...in...会把它给遍历出来。所以这样做才是比较安全的：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">for</span><span>&nbsp;(&nbsp;</span><span class="keyword">var</span><span>&nbsp;x&nbsp;=&nbsp;0;&nbsp;x&nbsp;&lt;&nbsp;arr.length;&nbsp;x++)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>total&nbsp;=&nbsp;total&nbsp;*&nbsp;arr[x];&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">for ( var x = 0; x &lt; arr.length; x++) {
total = total * arr[x];
}
</pre>
<p>其实，这也是污染基本类的prototype会带来危害的一个例证。</p>
<p><span class="fstrong">8.事件处理器的陷阱</span></p>
<p>这其实只会存在使用作为对象属性的事件处理器才会存在的问题。比如window.onclick =
MyOnClickMethod这样的代码，这会复写掉之前的window.onclick事件，还可能导致IE的内容泄露（sucks
again）。在IE还没有支持DOM 2的事件注册之前，作者建议使用库来解决问题，比如使用YUI:<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>YAHOO.util.Event.addListener(</span><span class="func">window</span><span>,&nbsp;</span><span class="string">"click"</span><span>,&nbsp;MyOnClickMethod);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">YAHOO.util.Event.addListener(window, "click", MyOnClickMethod);
</pre>
<p>这应该也属于常识问题，但新手可能容易犯错。</p>
<p><span class="fstrong">9.Focus Pocus</span></p>
<p>新建一个input文本元素，然后把焦点挪到它上面，按理说，这样的代码应该很自然：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;newInput&nbsp;=&nbsp;</span><span class="func">document</span><span>.createElement(</span><span class="string">"input"</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="func">document</span><span>.body.appendChild(newInput);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>newInput.focus();&nbsp;&nbsp;</span></li>
    <li class=""><span>newInput.select();&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">var newInput = document.createElement("input");
document.body.appendChild(newInput);
newInput.focus();
newInput.select();
</pre>
<p>但是IE会报错（sucks again and again）。理由可能是当你执行fouce()的时候，元素尚未可用。因此，我们可以延迟执行：<br />
</p>
<div class="dp-highlighter">
<div class="bar"><br />
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;newInput&nbsp;=&nbsp;</span><span class="func">document</span><span>.createElement(</span><span class="string">"input"</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>newInput.id&nbsp;=&nbsp;<span class="string">"TheNewInput"</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="func">document</span><span>.body.appendChild(newInput);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>setTimeout(<span class="keyword">function</span><span>(){&nbsp;</span><span class="comment">//这里我使用闭包改写过，若有兴趣可以对比原文</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="func">document</span><span>.getElementById(</span><span class="string">'TheNewInput'</span><span>).focus();&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="func">document</span><span>.getElementById(</span><span class="string">'TheNewInput'</span><span>).select();},&nbsp;10);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre style="display: none;" name="articlecode" class="js">var newInput = document.createElement("input");
newInput.id = "TheNewInput";
document.body.appendChild(newInput);
setTimeout(function(){ //这里我使用闭包改写过，若有兴趣可以对比原文
document.getElementById('TheNewInput').focus();
document.getElementById('TheNewInput').select();}, 10);
</pre>
<p>在实践中，JavaScript的陷阱还有很多很多，大多是由于解析器的实现不到位而引起。这些东西一般都不会在教科书中出现，只能靠开发者之间的经验分享。谢天谢地，我们生活在网络时代，很多碰到的问题，一般都可以在Google中找到答案。</p>
<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/264439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-08 12:59 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/08/264439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 关于JavaScript中apply与call的用法意义及区别</title><link>http://www.blogjava.net/hulizhong/archive/2009/04/01/263276.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Wed, 01 Apr 2009 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2009/04/01/263276.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/263276.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2009/04/01/263276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/263276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/263276.html</trackback:ping><description><![CDATA[转 http://www.cnitblog.com/yemoo/archive/2007/11/30/37070.html<br />
<br />
<p>JavaScript中有一个call和apply方法，其作用基本相同，但也有略微的区别。<br />
<br />
先来看看JS手册中对call的解释：<br />
</p>
<div style="border: 1px solid #666666; background-color: #fafafa;">call 方法<br />
调用一个对象的一个方法，以另一个对象替换当前对象。<br />
<br />
call([thisObj[,arg1[, arg2[,&nbsp;&nbsp; [,.argN]]]]])<br />
<br />
<strong>参数</strong><br />
thisObj<br />
可选项。将被用作当前对象的对象。<br />
<br />
arg1, arg2,&nbsp;&nbsp;, argN<br />
可选项。将被传递方法参数序列。<br />
<br />
<strong>说明</strong><br />
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。<br />
<br />
如果没有提供 thisObj 参数，那么 Global 对象被用作 thisObj。<br />
<br />
</div>
<p>说明白一点其实就是更改对象的内部指针，即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。<br />
<br />
引用网上一个代码段，运行后自然就明白其道理。<br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text"</span><span style="color: #ff0000;">&nbsp;id</span><span style="color: #0000ff;">="myText"</span><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="input&nbsp;text"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000; background-color: #f5f5f5;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5;">function</span><span style="color: #000000; background-color: #f5f5f5;">&nbsp;Obj(){</span><span style="color: #0000ff; background-color: #f5f5f5;">this</span><span style="color: #000000; background-color: #f5f5f5;">.value</span><span style="color: #000000; background-color: #f5f5f5;">=</span><span style="color: #000000; background-color: #f5f5f5;">"</span><span style="color: #000000; background-color: #f5f5f5;">对象！</span><span style="color: #000000; background-color: #f5f5f5;">"</span><span style="color: #000000; background-color: #f5f5f5;">;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5;">var</span><span style="color: #000000; background-color: #f5f5f5;">&nbsp;value</span><span style="color: #000000; background-color: #f5f5f5;">=</span><span style="color: #000000; background-color: #f5f5f5;">"</span><span style="color: #000000; background-color: #f5f5f5;">global&nbsp;变量</span><span style="color: #000000; background-color: #f5f5f5;">"</span><span style="color: #000000; background-color: #f5f5f5;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5;">function</span><span style="color: #000000; background-color: #f5f5f5;">&nbsp;Fun1(){alert(</span><span style="color: #0000ff; background-color: #f5f5f5;">this</span><span style="color: #000000; background-color: #f5f5f5;">.value);}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;window.Fun1();&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; background-color: #f5f5f5;">//</span><span style="color: #008000; background-color: #f5f5f5;">global&nbsp;变量</span><span style="color: #008000; background-color: #f5f5f5;"><br />
</span><span style="color: #000000; background-color: #f5f5f5;">&nbsp;&nbsp;&nbsp;&nbsp;Fun1.call(window);&nbsp;&nbsp;</span><span style="color: #008000; background-color: #f5f5f5;">//</span><span style="color: #008000; background-color: #f5f5f5;">global&nbsp;变量</span><span style="color: #008000; background-color: #f5f5f5;"><br />
</span><span style="color: #000000; background-color: #f5f5f5;">&nbsp;&nbsp;&nbsp;&nbsp;Fun1.call(document.getElementById('myText'));&nbsp;&nbsp;</span><span style="color: #008000; background-color: #f5f5f5;">//</span><span style="color: #008000; background-color: #f5f5f5;">input&nbsp;text</span><span style="color: #008000; background-color: #f5f5f5;"><br />
</span><span style="color: #000000; background-color: #f5f5f5;">&nbsp;&nbsp;&nbsp;&nbsp;Fun1.call(</span><span style="color: #0000ff; background-color: #f5f5f5;">new</span><span style="color: #000000; background-color: #f5f5f5;">&nbsp;Obj());&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; background-color: #f5f5f5;">//</span><span style="color: #008000; background-color: #f5f5f5;">对象！</span><span style="color: #008000; background-color: #f5f5f5;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span></div>
<br />
call函数和apply方法的第一个参数都是要传入给当前对象的对象，及函数内部的this。后面的参数都是传递给当前对象的参数。<br />
运行如下代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">script</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;func</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.a</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">func</span><span style="color: #000000;">"</span><span style="color: #000000;">}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;myfunc</span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(x){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">myfunc</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;myfunc.call(func,</span><span style="color: #000000;">"</span><span style="color: #000000;">var</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">script</span><span style="color: #000000;">&gt;</span></div>
<br />
可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。<br />
<br />
对于apply和call两者在作用上是相同的，但两者在参数上有区别的。<br />
<span style="color: #ff0000;">对于第一个参数意义都一样，但对第二个参数：<br />
apply传入的是一个参数数组，也就是将多个参数组合成为一个数组传入，而call则作为call的参数传入（从第二个参数开始）。</span><br />
如 func.call(func1,var1,var2,var3)对应的apply写法为：func.apply(func1,[var1,var2,var3])<br />
<br />
同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入<br />
<br /><img src ="http://www.blogjava.net/hulizhong/aggbug/263276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2009-04-01 09:30 <a href="http://www.blogjava.net/hulizhong/archive/2009/04/01/263276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>