﻿<?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-CONAN ZONE-文章分类-JS</title><link>http://www.blogjava.net/conans/category/32364.html</link><description>你越挣扎我就越兴奋</description><language>zh-cn</language><lastBuildDate>Mon, 28 Nov 2011 19:18:28 GMT</lastBuildDate><pubDate>Mon, 28 Nov 2011 19:18:28 GMT</pubDate><ttl>60</ttl><item><title>js获取网页高度</title><link>http://www.blogjava.net/conans/articles/364566.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Tue, 22 Nov 2011 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/364566.html</guid><description><![CDATA[<p>&lt;script&gt; <br />function getInfo() <br />{ <br />var s = ""; <br />s += " 网页可见区域宽："+ document.body.clientWidth; <br />s += " 网页可见区域高："+ document.body.clientHeight; <br />s += " 网页可见区域宽："+ document.body.offsetWidth + " (包括边线和滚动条的宽)"; <br />s += " 网页可见区域高："+ document.body.offsetHeight + " (包括边线的宽)"; <br />s += " 网页正文全文宽："+ document.body.scrollWidth; <br />s += " 网页正文全文高："+ document.body.scrollHeight; <br />s += " 网页被卷去的高(ff)："+ document.body.scrollTop; <br />s += " 网页被卷去的高(ie)："+ document.documentElement.scrollTop; <br />s += " 网页被卷去的左："+ document.body.scrollLeft; <br />s += " 网页正文部分上："+ window.screenTop; <br />s += " 网页正文部分左："+ window.screenLeft; <br />s += " 屏幕分辨率的高："+ window.screen.height; <br />s += " 屏幕分辨率的宽："+ window.screen.width; <br />s += " 屏幕可用工作区高度："+ window.screen.availHeight; <br />s += " 屏幕可用工作区宽度："+ window.screen.availWidth; <br />s += " 你的屏幕设置是 "+ window.screen.colorDepth +" 位彩色"; <br />s += " 你的屏幕设置 "+ window.screen.deviceXDPI +" 像素/英寸"; <br />//alert (s); <br />} <br />getInfo(); <br />&lt;/script&gt; <br />在我本地测试当中： <br />在IE、FireFox、Opera下都可以使用 <br />document.body.clientWidth <br />document.body.clientHeight <br />即可获得，很简单，很方便。 <br />而在公司项目当中： <br />Opera仍然使用 <br />document.body.clientWidth <br />document.body.clientHeight <br />可是IE和FireFox则使用 <br />document.documentElement.clientWidth <br />document.documentElement.clientHeight <br />原来是W3C的标准在作怪啊 <br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; <br />如果在页面中添加这行标记的话 <br /><br />在IE中： <br />document.body.clientWidth ==&gt; BODY对象宽度 <br />document.body.clientHeight ==&gt; BODY对象高度 <br />document.documentElement.clientWidth ==&gt; 可见区域宽度 <br />document.documentElement.clientHeight ==&gt; 可见区域高度 <br />在FireFox中： <br />document.body.clientWidth ==&gt; BODY对象宽度 <br />document.body.clientHeight ==&gt; BODY对象高度 <br />document.documentElement.clientWidth ==&gt; 可见区域宽度 <br />document.documentElement.clientHeight ==&gt; 可见区域高度 <br />? <br />在Opera中： <br />document.body.clientWidth ==&gt; 可见区域宽度 <br />document.body.clientHeight ==&gt; 可见区域高度 <br />document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽） <br />document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高） <br />而如果没有定义W3C的标准，则 <br />IE为： <br />document.documentElement.clientWidth ==&gt; 0 <br />document.documentElement.clientHeight ==&gt; 0 <br />FireFox为： <br />document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽）document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高） <br />Opera为： <br />document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽）document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高） <br />真是一件麻烦事情，其实就开发来看，宁可少一些对象和方法，不使用最新的标准要方便许多啊。<br /><br /><br /><br />有时候需要取页面的底部, 就会用到document.body.clientHeight , 在HTML 标准中(这一句就能取到整个页面的高度, 不论body 的实际内容到底有多高, 例如, 1074*768 的分辨率, 页面最大化时, 这个高度约为720 , 即使页面上只有一句&#8221;hello world&#8221; , 也仍然取到720.</p>
<p>可是在XHTML中, 如果body 体中只有一行, 则document.body.clientHeight 只能取到那一行的高度, 约20px, 这时如何还想取到整个页面的高度, 就要用document.documentElement.clientHeight 来获取了.</p>
<p>原因是: 在HTML 中, body 是整个DOM 的根, 而在XHTML 中, document 才是根, body 不再是根, 所以取body 的属性时, 不能再取到整个页面的值.</p>
<p>区别新旧标准的行是:<br />&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.0 Transitional//EN&#8221; &gt;<br />&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><span style="color: rgb(169,0,3)">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</span></a>&#8220;&gt;<br />前者指明该页面使用旧标准, 后者指明该页面使用新标准.</p>
<p>总结:<br />XHTML中用 document.documentElement.clientHeight 代替<br />document.body.clientHeight<br /><br /></p><img src ="http://www.blogjava.net/conans/aggbug/364566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2011-11-22 15:01 <a href="http://www.blogjava.net/conans/articles/364566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Firebug控制台详解</title><link>http://www.blogjava.net/conans/articles/347393.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Thu, 31 Mar 2011 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/347393.html</guid><description><![CDATA[<div>
<p><a target="_blank" href="http://getfirebug.com/">Firebug</a>是网页开发的利器，能够极大地提升工作效率。</p>
</div>
<p>但是，它不太容易上手。我曾经翻译过一篇<a target="_blank" href="http://www.ruanyifeng.com/blog/2008/06/firebug_tutorial.html">《Firebug入门指南》</a>，介绍了一些基本用法。今天，继续介绍它的高级用法。</p>
<p>===================================</p>
<p><strong>Firebug控制台详解</strong></p>
<p>作者：阮一峰</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032616.png"  alt="" /></p>
<p><br />
控制台（Console）是Firebug的第一个面板，也是最重要的面板，主要作用是显示网页加载过程中产生各类信息。</p>
<p><strong>一、显示信息的命令</strong></p>
<p>Firebug内置一个console对象，提供5种方法，用来显示信息。</p>
<p>最简单的方法是console.log()，可以用来取代alert()或document.write()。比如，在网页脚本中使用console.log("Hello World")，加载时控制台就会自动显示如下内容。</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032601.png"  alt="" /></p>
<p>另外，根据信息的不同性质，console对象还有4种显示信息的方法，分别是一般信息console.info()、除错信息console.debug()、警告提示console.warn()、错误提示console.error()。</p>
<p>比如，在网页脚本中插入下面四行：</p>
<blockquote>
<p>　　console.info("这是info");</p>
<p>　　console.debug("这是debug");</p>
<p>　　console.warn("这是warn");</p>
<p>　　console.error("这是error");</p>
</blockquote>
<p>加载时，控制台会显示如下内容。</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032602.png"  alt="" /></p>
<p>可以看到，不同性质的信息前面有不同的图标，并且每条信息后面都有超级链接，点击后跳转到网页源码的相应行。</p>
<p><strong>二、占位符</strong></p>
<p>console对象的上面5种方法，都可以使用printf风格的占位符。不过，占位符的种类比较少，只支持字符（%s）、整数（%d或%i）、浮点数（%f）和对象（%o）四种。</p>
<p>比如，</p>
<blockquote>
<p>　　console.log("%d年%d月%d日",2011,3,26);</p>
<p>　　console.log("圆周率是%f",3.1415926);</p>
</blockquote>
<p><img src="http://image.beekka.com/blog/201103/bg2011032603.png"  alt="" /></p>
<p>%o占位符，可以用来查看一个对象内部情况。比如，有这样一个对象：</p>
<blockquote>
<p>　　var dog = {} ;</p>
<p>　　dog.name = "大毛" ;</p>
<p>　　dog.color = "黄色";</p>
</blockquote>
<p>然后，对它使用o%占位符。</p>
<blockquote>
<p>　　console.log("%o",dog);</p>
</blockquote>
<p><img src="http://image.beekka.com/blog/201103/bg2011032604.png"  alt="" /></p>
<p><strong>三、分组显示</strong></p>
<p>如果信息太多，可以分组显示，用到的方法是console.group()和console.groupEnd()。</p>
<blockquote>
<p>　　console.group("第一组信息");</p>
<p>　　　　console.log("第一组第一条");</p>
<p>　　　　console.log("第一组第二条");</p>
<p>　　console.groupEnd();</p>
<p>　　console.group("第二组信息");</p>
<p>　　　　console.log("第二组第一条");</p>
<p>　　　　console.log("第二组第二条");</p>
<p>　　console.groupEnd();</p>
</blockquote>
<p><img src="http://image.beekka.com/blog/201103/bg2011032605.png"  alt="" /></p>
<p>点击组标题，该组信息会折叠或展开。</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032606.png"  alt="" /></p>
<p><strong>四、console.dir()</strong></p>
<p>console.dir()可以显示一个对象所有的属性和方法。</p>
<p>比如，现在为第二节的dog对象，添加一个bark()方法。</p>
<blockquote>
<p>　　dog.bark = function(){alert("汪汪汪");};</p>
</blockquote>
<p>然后，显示该对象的内容，</p>
<blockquote>
<p>　　console.dir(dog);</p>
</blockquote>
<p><img src="http://image.beekka.com/blog/201103/bg2011032607.png"  alt="" /></p>
<p><strong>五、console.dirxml()</strong></p>
<p>console.dirxml()用来显示网页的某个节点（node）所包含的html/xml代码。</p>
<p>比如，先获取一个表格节点，</p>
<blockquote>
<p>　　var table = document.getElementById("table1");</p>
</blockquote>
<p>然后，显示该节点包含的代码。</p>
<blockquote>
<p>　　console.dirxml(table);</p>
</blockquote>
<p><img src="http://image.beekka.com/blog/201103/bg2011032608.png"  alt="" /></p>
<p><strong>六、console.assert()</strong></p>
<p>console.assert()用来判断一个表达式或变量是否为真。如果结果为否，则在控制台输出一条相应信息，并且抛出一个异常。</p>
<p>比如，下面两个判断的结果都为否。</p>
<blockquote>
<p>　　var result = 0;</p>
<p>　　console.assert( result );</p>
<p>　　var year = 2000;</p>
<p>　　console.assert(year == 2011 );</p>
</blockquote>
<p><img src="http://image.beekka.com/blog/201103/bg2011032609.png"  alt="" /></p>
<p><strong>七、console.trace()</strong></p>
<p>console.trace()用来追踪函数的调用轨迹。</p>
<p>比如，有一个加法器函数。</p>
<blockquote>
<p>　　function add(a,b){</p>
<p>　　　　return a+b;</p>
<p>　　}</p>
</blockquote>
<p>我想知道这个函数是如何被调用的，在其中加入console.trace()方法就可以了。</p>
<blockquote>
<p>　　function add(a,b){</p>
<p>　　　　console.trace();</p>
<p>　　　　return a+b;</p>
<p>　　}</p>
</blockquote>
<p>假定这个函数的调用代码如下：</p>
<blockquote>
<p>　　var x = add3(1,1);</p>
<p>　　function add3(a,b){return add2(a,b);}</p>
<p>　　function add2(a,b){return add1(a,b);}</p>
<p>　　function add1(a,b){return add(a,b);}</p>
</blockquote>
<p>运行后，会显示add()的调用轨迹，从上到下依次为add()、add1()、add2()、add3()。</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032610.png"  alt="" /></p>
<p><strong>八、计时功能</strong></p>
<p>console.time()和console.timeEnd()，用来显示代码的运行时间。</p>
<blockquote>
<p>　　console.time("计时器一");</p>
<p>　　for(var i=0;i&lt;1000;i++){</p>
<p>　　　　for(var j=0;j&lt;1000;j++){}</p>
<p>　　}</p>
<p>　　console.timeEnd("计时器一");</p>
</blockquote>
<p><img src="http://image.beekka.com/blog/201103/bg2011032611.png"  alt="" /></p>
<p><strong>九、性能分析</strong></p>
<p>性能分析（Profiler）就是分析程序各个部分的运行时间，找出瓶颈所在，使用的方法是console.profile()。</p>
<p>假定有一个函数Foo()，里面调用了另外两个函数funcA()和funcB()，其中funcA()调用10次，funcB()调用1次。</p>
<blockquote>
<p>　　function Foo(){</p>
<p>　　　　for(var i=0;i&lt;10;i++){funcA(1000);}</p>
<p>　　　　funcB(10000);</p>
<p>　　}</p>
<p>　　function funcA(count){</p>
<p>　　　　for(var i=0;i&lt;count;i++){}</p>
<p>　　}</p>
<p>　　function funcB(count){</p>
<p>　　　　for(var i=0;i&lt;count;i++){}</p>
<p>　　}</p>
</blockquote>
<p>然后，就可以分析Foo()的运行性能了。</p>
<blockquote>
<p>　　console.profile('性能分析器一');</p>
<p>　　Foo();</p>
<p>　　console.profileEnd();</p>
</blockquote>
<p>控制台会显示一张性能分析表，如下图。</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032612.png"  alt="" /></p>
<p>标题栏提示，一共运行了12个函数，共耗时2.656毫秒。其中funcA()运行10次，耗时1.391毫秒，最短运行时间0.123毫秒，最长0.284毫秒，平均0.139毫秒；funcB()运行1次，耗时1.229ms毫秒。</p>
<p>除了使用console.profile()方法，firebug还提供了一个"概况"（Profiler）按钮。第一次点击该按钮，"性能分析"
开始，你可以对网页进行某种操作（比如ajax操作），然后第二次点击该按钮，"性能分析"结束，该操作引发的所有运算就会进行性能分析。</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032613.png"  alt="" /></p>
<p><strong>十、属性菜单</strong></p>
<p>控制台面板的名称后面，有一个倒三角，点击后会显示属性菜单。</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032614.png"  alt="" /></p>
<p>默认情况下，控制台只显示Javascript错误。如果选中Javascript警告、CSS错误、XML错误都送上，则相关的提示信息都会显示。</p>
<p>这里比较有用的是"显示XMLHttpRequests"，也就是显示ajax请求。选中以后，网页的所有ajax请求，都会在控制台面板显示出来。</p>
<p>比如，点击一个<a target="_blank" href="http://developer.yahoo.com/yui/examples/datatable/dt_xhrlocalxml.html">YUI示例</a>，控制台就会告诉我们，它用ajax方式发出了一个GET请求，http请求和响应的头信息和内容主体，也都可以看到。</p>
<p><img src="http://image.beekka.com/blog/201103/bg2011032615.png"  alt="" /></p>
<p><strong>[参考文献]</strong></p>
<p>* <a target="_blank" href="http://michaelsync.net/2007/09/09/firebug-tutorial-logging-profiling-and-commandline-part-i">Firebug Tutorial - Logging, Profiling and CommandLine (Part I)</a></p>
<p>* <a target="_blank" href="http://michaelsync.net/2007/09/10/firebug-tutorial-logging-profiling-and-commandline-part-ii">Firebug Tutorial - Logging, Profiling and CommandLine (Part II)</a></p>
（完）
<img src ="http://www.blogjava.net/conans/aggbug/347393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2011-03-31 15:18 <a href="http://www.blogjava.net/conans/articles/347393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用"事件上提" 来简化事件注册(防止潜在的内存泄露)</title><link>http://www.blogjava.net/conans/articles/217041.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 23 Jul 2008 15:03:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/217041.html</guid><description><![CDATA[众所周知, 浏览器中内存泄露以及内存无法回收(两者不是一回事,很多人都把他们弄混淆了),常常是由于对dom元素注册事件不当引起的. <br />
<br />
通常的解决方案是, 自行实现一套 添加事件, 移除事件 以及删除dom元素的机制. <br />
为dom元素添加事件时, 同时记录 这个事件 以及对应的函数, <br />
在删除dom元素时, 先移除dom元素上已经添加的事件 再删除dom元素本身. <br />
<br />
而当页面中添加了事件监听的dom元素很多时, 移除元素变得很麻烦. <br />
例如 一个div 里面有个form form里有多个元素都添加了事件. <br />
那么移除这个div时, 就要先去移除他下面每一个元素上的事件 然后再移除这个div. <br />
<br />
这种做法很多时候是必须的, 而且自己写一个"深度遍历子节点,并移除其事件"的函数也并不是很困难. <br />
<br />
但是 在很多时候 这种做法是可以避免的, 避免的方法就是, 把事件监听注册到更上层的dom元素中. <br />
并且在事件函数中 通过 event.target/event.srcElement 来 事件发生在哪个元素上,然后来执行相关的方法. <br />
这样 在移除元素时 只要移除这个元素以及它上面的事件 就可以了, 而不必执行(或者少量的执行)"移除所有子节点事件"的动作了. <br />
<br />
<br />
见下面的例子 : <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Html代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/217512#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">table</span><span>&nbsp;</span><span class="attribute">width</span><span>=</span><span class="attribute-value">"300"</span><span>&nbsp;</span><span class="attribute">border</span><span>=</span><span class="attribute-value">"1"</span><span>&nbsp;&nbsp;</span><span class="attribute">onclick</span><span>=</span><span class="attribute-value">"showDetail(event)"</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>1</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>Tom</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"button"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"详细信息"</span><span>&nbsp;</span><span class="attribute">userid</span><span>=</span><span class="attribute-value">"1"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>2</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>Kate</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"button"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"详细信息"</span><span>&nbsp;</span><span class="attribute">userid</span><span>=</span><span class="attribute-value">"2"</span><span>&nbsp;&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>3</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>John</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"button"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"详细信息"</span><span>&nbsp;&nbsp;</span><span class="attribute">userid</span><span>=</span><span class="attribute-value">"3"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">table</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="html" style="display: none" name="code">  &lt;table width="300" border="1"  onclick="showDetail(event)"&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Tom&lt;/td&gt;
&lt;td&gt;&lt;input type="button" value="详细信息" userid="1" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Kate&lt;/td&gt;
&lt;td&gt;&lt;input type="button" value="详细信息" userid="2"  /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;John&lt;/td&gt;
&lt;td&gt;&lt;input type="button" value="详细信息"  userid="3" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
</pre>
<br />
<br />
在这个例子中, 实际上事件只是注册在table上, 而没有在"input type="button"上. <br />
<br />
"showDetail" 可以这样写 <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Javascript代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/217512#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span class="keyword">function</span><span>&nbsp;showDetail_b(event)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;event=event||window.event; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;target=event.target||event.srcElement; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;String(target.tagName).toLowerCase()==</span><span class="string">'input'</span><span>&nbsp;&amp;&amp;&nbsp;&nbsp;target.value==</span><span class="string">"详细信息"</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showUserDetail(target.getAttribute(</span><span class="string">'userid'</span><span>)&nbsp;); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="javascript" style="display: none" name="code">	function showDetail_b(event) {
event=event||window.event;
var target=event.target||event.srcElement;
if ( String(target.tagName).toLowerCase()=='input' &amp;&amp;  target.value=="详细信息") {
showUserDetail(target.getAttribute('userid') );
}
}
</pre>
<br />
<br />
<br />
当然 这种做法不是绝对的, 有时候这么做很可能让代码变得臃肿冗长. <br />
到底是否使用"事件上提"的做法 要根据实际情况来选择. <br />
不过 根据我的以往经验, 在列表(table)中, 使用这种技术非常合适. <br />
因为 列表有着"行与行之间模型一致"(只是数据不一致,结构一致)的特点. <br />
<br />
例如,下面的效果, 都可以通过在 table上注册事件来实现: <br />
<br />
1 点击行, 行变色 (不必在 tr 上注册点击事件) <br />
2 点击行中的某个按钮 (不必在 tr 里的 button 上注册点击事件) <br />
3 鼠标经过行时 行变色 (不必在 tr上注册 mouseover/mouseout 事件, 而是可以在table上注册mousemove事件) <br />
4 还有关于单元格的 很多效果..... <br />
<br />
当然,在非列表里 这种做法也有很多的用武之地. <br />
总之 合理的利用"事件上提"的方法, 可以增强dom元素和事件的可控性, 有效的防止内存泄露和内存无法回收的情况. 
<img src ="http://www.blogjava.net/conans/aggbug/217041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-23 23:03 <a href="http://www.blogjava.net/conans/articles/217041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> js判断页面是否load完成</title><link>http://www.blogjava.net/conans/articles/214466.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sat, 12 Jul 2008 11:17:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/214466.html</guid><description><![CDATA[<p>今天发现自己的项目存在一个问题，一些连接需要页面完全load完成之后才能点击，否则报js错，原因是因为有些js文件还没load完成，而这些连接又正好用到这些js，怎么办呢</p>
<p>解决办法2个，第一是在load完成之前把这些按钮全部disabled，再处理onload事件，把他们enable，这样好像比较麻烦</p>
<p>另外一个觉得办法是，在用户点击连接的时候先判断页面是否load完成，如果没有完成，那就什么都不干</p>
<p>判断方法如下</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">?</a></div>
</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;complete&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.onreadystatechange&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;complete&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="jscript" style="display: none" name="code">var complete = false;
document.onreadystatechange = function(){
complete = true;
}</pre>
然后再在连接的onclick事件函数里里加上
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">?</a></div>
</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;PRE&nbsp;</span><span class="keyword">class</span><span>=jscript&nbsp;name=</span><span class="string">"code"</span><span>&gt;</span><span class="keyword">if</span><span>(complete&nbsp;==&nbsp;</span><span class="keyword">false</span><span>){ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&lt;/PRE&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="jscript" style="display: none" name="code">
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">?</a></div>
</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">if</span><span>(complete&nbsp;==&nbsp;</span><span class="keyword">false</span><span>){ &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="jscript" style="display: none" name="code">if(complete == false){
return;
}</pre>
</pre>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://blog.csdn.net/liujun999999/archive/2008/07/11/2638081.aspx#">?</a></div>
</div>
<ol class="dp-c">
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="jscript" style="display: none" name="code">&nbsp;</pre>
<img src ="http://www.blogjava.net/conans/aggbug/214466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-12 19:17 <a href="http://www.blogjava.net/conans/articles/214466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript 中的有限状态机，第 1 部分: 设计一个小部件</title><link>http://www.blogjava.net/conans/articles/214091.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Thu, 10 Jul 2008 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/214091.html</guid><description><![CDATA[<blockquote>
<p>有限状态机很早就已用作设计和实现事件驱动的程序（比如网络适配器和编译器）内复杂行为的组织原则。现在，可编程的 Web 浏览器为新一代的应用程序开辟了一种全新的事件驱动环境。基于浏览器的应用程序因 Ajax 而广为流行，而同时也变得更为复杂。程序设计人员和实现人员能够大大受益于有限状态机的原理和结构。本篇文章将向您介绍如何使用有限状态机来为一个简单的 Web 小部件 —— 一个能够淡入和淡出的工具提示 —— 设计复杂的行为。</p>
<p>本系列的第 2 部分将描述如何在 JavaScript 内实现此设计，以及如何充分利用 JavaScript 独特的语言特性，比如关联数组和函数闭包。第 3 部分则会涵盖如何使此实现能够在所有流行的 Web 浏览器中正常工作的内容。最终的代码紧凑简练，逻辑清晰透明，动画效果即使在负载极重的处理器上也能平稳流畅。</p>
<p>多年以来，Web 设计人员一直都通过在流行的 Web 浏览器内采用 JavaScript 解释器的方式来改善其网站的外观。他们的做法大都是将代码的简短片段复制到 HTML 页面中。当前，随着 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#resources" cmimpressionsent="1">Ajax</a> 的日益流行，软件工程师也开始使用 JavaScript 来开发能在浏览器内执行的新一代的应用程序。基于浏览器的应用程序的规模不断扩大，这就相应要求采用其他执行环境成长和发展所使用的相同设计模式和开发原理。</p>
<p>基于浏览器的应用程序在实时环境中执行，在这种环境中鼠标、键盘、定时器、网络和程序事件都十分常见。当事件驱动的应用程序的行为取决于事件发生的顺序时，其编程就会变得非常复杂，也十分难以调试和修改。软件工程师早已开始使用 <em><a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#resources" cmimpressionsent="1">有限状态机</a> </em>—— 学术领域有时又称其为离散或确定性有限自动机 —— 作为一种组织原理来开发事件驱动的程序了。</p>
<p>有限状态机通过用直观的表格代替复杂的逻辑为设计增加了严密性。从传统意义上讲，有限状态机对开发诸如网络驱动程序和编译器这类程序颇有帮助。有限状态机也同样有助于开发基于浏览器的应用程序。</p>
<p>在本系列中，您将练习开发一个样例有限状态机应用程序，来深入体验 JavaScript 语言的一些独特特性：
<ul>
    <li>函数是<em>一类</em> 对象：与其它对象一样，函数可被创建，可赋给变量，也可作为参数传递。函数可在另一个函数内定义，还可赋给全局变量或作为结果返回。定义这些函数的函数返回之后，这些函数还会一直存在。
    <li>函数可以引用<em>词法作用域</em>（包围函数定义的嵌套括号）内的任何变量，例如本地变量（由函数定义）。这些变量是<em>函数闭包</em> 的一部分（该函数、函数自身的变量和该函数所使用的在其词法作用域内定义的所有变量），而且在定义这些变量函数返回后，这些变量依然会存在。
    <li>函数可以存储于<em>关联数组</em> 中（关联数组是这样一类数组：它们按名称而不是数值索引）。 </li>
</ul>
<p>&nbsp;</p>
<p>这些语言特性可以提供一种紧凑而简明的方式来为状态间的事件和转移组织动作，还可以提供一种巧妙的方式来兼容不同的浏览器事件模型。</p>
<p>样例应用程序 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#download" cmimpressionsent="1">FadingTooltip</a> 比内置于大多数浏览器的默认工具提示更为精致。用 FadingTooltip 小部件创建的工具提示使用动画式淡入和淡出代替突然弹出和消失，并可随光标移动。设计此行为所用的有限状态机模式使逻辑清晰透明。实现此行为所用的 JavaScript 语言特性则使源代码紧凑而有效。</p>
<p>本文展示了如何使用有限状态机的图、表表示设计一个动画式小部件的行为。本系列的后续文章会介绍如何在 JavaScript 内实现有限状态机的表表示以及如何处理与在流行的浏览器内进行测试和实现相关的实际问题。</p>
<p><a name="id2"><span class="smalltitle">基本的工具提示</span></a></p>
<p>当光标暂时停留于一些可视控件 —— 比如按钮、选择器或输入字段 —— 时，时下的许多图形应用程序都能暂时显示包含相应的帮助性定义、操作说明或建议的小文本框。在早期的系统中，这些小文本框被称为 &#8220;气球帮助&#8221;，在 IBM 的一些产品中，称其为 infopop，在一些 Microsoft 产品中，其名字则是 ScreenTip。在本文，我使用的是其中更为常见的术语<em>工具提示</em>。</p>
<p>现在一些流行的 Web 浏览器，比如 Netscape Navigator、Microsoft Internet Explorer、Opera 和 Mozilla Firefox，会为任何拥有 <code>title</code> 属性的 HTML 元素显示工具提示。例如，<a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#browser-tooltip-example-source" cmimpressionsent="1">清单 1</a> 中显示的这三个拥有 <code>title</code> 属性的 HTML 元素。</p>
<p><br />
<a name="browser-tooltip-example-source"><strong>清单 1. 浏览器工具提示的 HTML 代码</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            Here are some
            &lt;span title='Move your cursor a bit to the right, please.'&gt;
            fields with built-in tooltips
            &lt;/span&gt;:
            &lt;input type='text'
            title='Type your bank account and PIN numbers here, please ...'
            size=25&gt;
            &lt;input type='button'
            title='Go ahead. Press it. What's the harm? Trust me.'
            value='Press this button'&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p><a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/test_files/FadingTooltipTests.html" cmimpressionsent="1">样例页面</a> 展示了浏览器如何呈现具有 <code>title</code> 属性的 HTML 元素。注意当光标在元素上移动时工具提示是如何出现和消失的。文本框包含简单的文本，这些文本无任何格式和样式。文本框会在光标短暂停留时弹出，并会在特定时间过后、鼠标从此 HTML 元素移出或单击了某键的情况下突然消失。浏览器一次只显示一个文本框。工具提示的外观和行为已经硬性设定到浏览器内，无法更改。</p>
<p><a name="id3"><span class="smalltitle">更为精致的工具提示</span></a></p>
<p>内置的工具提示还有很多可待提高之处，一些流行浏览器的最新版本为构建更为精致的工具提示提供了所需的 &#8220;原料&#8221;。HTML Division 元素创建了一个可在浏览器窗口的任何地方放置的提示框。通过级联样式表(CSS)，您几乎可以设定框体外观的各个方面。用 JavaScript 编程实现的光标移动可以触发浏览器窗口内任意可视元素的特定动作。您还可以编制一个定时器来控制这些动作的顺序。 </p>
<p>在 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/test_files/FadingTooltipTests.html" cmimpressionsent="1">样例页面</a> 可以找到具有这类工具提示的一些 HTML 元素。如果运行的是流行浏览器的最新版本，您就可以将更为精致的工具提示和内置的工具提示做一对比：
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
    <tbody>
        <tr>
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tbody>
                    <tr>
                        <td bgcolor="#eeeeee">如果使用的是较老的浏览器，您可能无法获得其中的一部分行为。例如，Opera 浏览器版本 9 之前的版本，工具提示是弹入弹出的，而非淡入淡出的，原因是 Opera 在实现 <code>opacity</code> 样式属性方面起步相对较晚。要下载流行的浏览器的当前版本，请参考 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#resources" cmimpressionsent="1">参考资料</a>。</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<ul>
    <li>这类工具提示是淡入淡出的，而不是突然弹出和突然消失。
    <li>这类工具提示包含图像和文本，并经很好的格式化和样式化处理。
    <li>可见时，这类工具提示可以随光标移动。
    <li>当光标从 HTML 元素移出然后又移回此元素时，淡入淡出会反转方向。
    <li>同时可有多个工具提示可视，一些淡出，一些淡入。 </li>
</ul>
<p>&nbsp;</p>
<p>这些增强的行为和外观不仅有修饰的作用，还可以提高可用性。面对有数十个或数百个元素的繁忙页面，用户很可能会错过即刻弹出的工具提示。人类的视觉系统对运动的物体十分敏感，因而也更容易注意到淡入视野并随鼠标而动的工具提示，即使用户的注意力不在这儿也没关系。对比未格式化过的文本，图像、格式化和样式化能更有效地传递信息。而且，这些更为精致的工具提示的所有参数都是可配置的。</p>
<p>本文后面的内容将着重于介绍如何将 FadingTooltip 小部件设计为一个有限状态机。本系列的后续文章会为您展示如何实现和测试这些代码。如果您急于想知道这些代码，也可以在 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#resources" cmimpressionsent="1">参考资料</a> 部分找到到相关 JavaScript 源代码和使用这些代码的一个 HTML Web 页面的链接。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="id2"><span class="atitle">有限状态机</span></a></p>
<p>有限状态机对行为建模，在该模型中，对将来事件的响应取决于先前的事件。此领域已出现了大量学术著作（参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#resources" cmimpressionsent="1">参考资料</a>），而有限状态机的实用定义却十分简单明了。有限状态机就是包含如下内容的计算机程序：
<ul>
    <li><em>事件</em>：程序对事件进行响应。
    <li><em>状态</em>：程序在事件间的状态。
    <li><em>转移</em>：对应于事件，状态间的转移。
    <li><em>动作</em>：转移过程中采取动作。
    <li><em>变量</em>：变量保存事件间的动作所需的值。 </li>
</ul>
<p>&nbsp;</p>
<p>在行为由许多不同类型事件驱动以及对特定事件的响应取决于先前事件发生顺序的情况下，有限状态机最为有用。 驱动有限状态机的事件可以是计算机外部的（由键盘、鼠标、定时器或网络活动发起），也可以是计算机内部的（由本应用程序的其他部分或其他应用程序发起）。</p>
<p>状态是记起先前事件的一种方式，转移则用来组织对将来事件的响应。其中的一个状态必须要被指派为初始状态。结束状态可有可无，FadingTooltip 小部件就没有结束状态。</p>
<p>有限状态机的两种常见表示为：
<dl>
<dt><strong>方向图</strong>
<dd>气球状的圆圈代表状态，圆圈间的箭头线代表转移，它会被标以事件和动作。
<p>&nbsp;</p>
<dt><strong>二维表</strong>
<dd>表的行和列代表事件和状态，单元格内包含动作和转移。 </dd></dl>
<p>上述两种表示是等价的，分别侧重于设计的不同方面。两者都十分有用，我在本文的后面都会用到。 </p>
<p>&nbsp;</p>
<p>用有限状态机开发事件驱动程序比一般的过程式编程要复杂一些；一般来说，需要更多的规则，尤其是更多的设计精力。如果处理得当，有限状态机可以使代码简单、测试迅速、维护轻松。但是，即便如此，有限状态机的复杂性使其并不能适合所有事件驱动的程序的开发。例如，当事件的种类不多或事件触发的动作总是相同时，进行额外的开发可能会得不偿失。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="id4"><span class="atitle">有限状态机和运行时环境</span></a></p>
<p>有限状态机是事件驱动的，需要在它们的运行时环境将其与其相关的事件挂接起来。这可通过<em>事件处理程序</em> 实现，事件处理程序是一些可插入到运行时环境的小的代码片段，一旦特定事件发生，这些处理程序就会执行。事件处理程序执行时，需要获得如下一些基本信息：
<ul>
    <li>已发生事件的类型（例如，光标移动、定时器超时）
    <li>事件的上下文（例如，光标位于哪个 HTML 元素之上、完成的是哪个网络请求）
    <li>有限状态机自身的变量和方法的位置 </li>
</ul>
<p>&nbsp;</p>
<p>JavaScript 十分适合于构建事件驱动的有限状态机。事实上，JavaScript 有点太过适合 —— 它有三种挂接事件的方式。每种<em>事件模型</em> 都很直观明了，但程序必须实现所有三种模型以确保它们可以运行于所有流行的浏览器之上。事件的上下文在其中两个事件模型内被直接传递给事件处理程序；对于另外一个模型，JavaScript 函数闭包允许事件的上下文被包裹进其事件处理程序。</p>
<p>JavaScript 提供一种<em>对象模型</em>，对象模型是 Java 和 C++ 程序员所熟知的，它也可用来对有限状态机的变量和方法进行编码。而且，JavaScript 关联数组还允许直接对有限状态机的二维表进行编码。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="id5"><span class="atitle">系统地设计行为</span></a></p>
<p>有限状态机的基本要素是它所响应的事件及事件间的状态。设计必须考虑到每个可能状态的每个可能事件：
<ul>
    <li>在该状态下，此事件是否可能发生
    <li>采取什么动作来处理事件
    <li>事件过后转移到什么状态
    <li>在事件之间需要记录什么变量 </li>
</ul>
<p>&nbsp;</p>
<p>我以 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#grah-initial" cmimpressionsent="1">图 1</a> 所示的一个图形来开始设计的过程，图中气球形圆圈所示的是状态，连接这些圆圈的箭头线代表的是转移。最终获得的是一张表，如 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#table-as-designed" cmimpressionsent="1">图 4</a> 所示，在该表的标题行和标题列分别列出了事件和状态。表中的一些单元格列出了当特定事件在特定状态发生时所要执行的动作，其它一些则表示在该状态下此事件不能发生。</p>
<p>通常，需要反复执行此设计过程才能获得正确的图和表。对具有多个事件和状态的有限状态机，这个过程可能会十分乏味，每次重复都需要遵守一定的原则来系统地处理表中的每一个单元格。这迫使您不得不考虑在每个可能的情况下您所想要的动作。您可能会发现还可以进一步完善这些行为，也可能会发现所需的状态较预计的要多（或少），甚至会发现您必须重新整理单元格间的这些动作以正确定义每种情况下的行为。</p>
<p>这种设计有限状态机的系统过程虽然有些乏味但却十分值得。<a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#table-as-designed" cmimpressionsent="1">图 4</a> 所示的完成后的表给出了此行动的所有逻辑，并可被直接转换为代码（参见 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/test_files/FadingTooltip.js.html#actionTransitionFunctions" cmimpressionsent="1">actionTransitionFunctions</a> 源代码）。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="id6"><span class="atitle">关于 JavaScript</span></a></p>
<p>要设计 FadingTooltip 小部件，您需要了解 JavaScript 的一些功能。在严谨设计的原则指导下，我只在这里给出基本的设计思想，而将具体的实现留待本系列后续文章中介绍。</p>
<p>当光标经过页面中的 HTML 元素时，所有流行的浏览器都能将事件传递给 JavaScript 代码。这些事件是 <em>mouseover</em>、<em>mousemove</em> 和 <em>mouseout</em>，分别代表光标已经移至、移上和移出 HTML 元素。浏览器用这些事件传递光标当前位置。当事件发生时，可用 JavaScript 编程动态创建 HTML Division 元素，用文本、图像和标记填充这些元素并将其定位到光标附近。</p>
<p>浏览器并没有原生的淡入和淡出函数，但可以通过改变 Division 元素的透明度（实际上是不透明度，透明度的反义词）来模拟这些函数。</p>
<p>JavaScript 有两类定时器：一次定时器在超时时生成 timeout 事件；重复断续器定期生成 timetick 事件。FadingTooltip 小部件需要这两种定时器。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="id7"><span class="atitle">设计状态图</span></a></p>
<p>首先回顾一下想要从 FadingTooltip 小部件获得的基本行为。当光标从特定的 HTML 元素上移过的时候，您可能想让此小部件等待光标在该元素上暂停。如果可以如此，之后您可能又想让此小部件将工具提示淡入，显示一会后再淡出。</p>
<p>有限状态机将需要响应以下事件：
<ul>
    <li>当光标移至、移上和移出某一 HTML 元素时，浏览器能分别将 mouseover、mousemove 和 mouseout 事件传递给 JavaScript。
    <li>JavaScript 可以编程实现 timeout 事件来指示光标已停止足够长的一段时间或工具提示已显示了足够长的一段时间，也可以编程实现 timetick 事件来分别增减工具提示淡入和淡出的不透明度。 </li>
</ul>
<p>&nbsp;</p>
<p>您将需要设计状态机在事件间等待的一些状态。需要调用小部件的初始状态 Inactive，小部件在该状态下等待被 mouseover 事件激活。小部件在 Pause 状态下等待直到 timeout 事件指示光标已经在 HTML 元素上停留了足够长的时间。之后在用 timetick 事件动画式淡入的同时，小部件会在 FadeIn 状态下等待，继而又会在 Display 状态等待另一个 timeout 事件。最后，在用更多 timetick 事件动画式淡出的同时，小部件会在 FadeOut 状态下等待。小部件转回到 Inactive 状态，在此状态下等待另一个 mouseover 事件。</p>
<p><a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#grah-initial" cmimpressionsent="1">图 1</a> 是此过程相应的图形表示，其中的气球形圆圈代表状态，连接圆圈的箭头线代表转移，箭头线上的标注代表事件。双层边界的圆圈代表初始状态。</p>
<p><br />
<a name="grah-initial"><strong>图 1. 状态图的初始设计</strong></a><br />
<img height="153" alt="状态图的初始设计" src="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/FadingTooltip-graph-initial.gif" width="453" /> <br />
</p>
<p>FadingTooltip 小部件必须针对它处理的每个事件采取动作：
<ul>
    <li>当 mouseover 事件在 Inactive 状态发生时，在转入 Pause 状态等待之前，它必须要开启一个一次定时器。
    <li>当 timeout 事件发生时，在转入 FadeIn 状态等待之前，它必须要创建工具提示（初始不透明度值为零）并开启一个重复断续器。
    <li>每次发生 timetick 事件，它都要适当增加工具提示的不透明度。当达到工具提示的最大不透明度时，它必须在转入 Display 状态等待之前取消此重复断续器并开启另一个定时器。
    <li>当定时器的 timeout 事件发生时，它必须在转入 FadeOut 状态等待之前开启另一个重复断续器。
    <li>每次在 FadeOut 状态发生 timetick 事件时，它都必须要适当减少工具提示的不透明度。当工具提示的不透明度减少到零时，小部件会取消此重复断续器，删除工具提示并返回到 Inactive 状态，在该状态等待被另一个 mouseover 事件激活。 </li>
</ul>
<p>&nbsp;</p>
<p><a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#grah-intermediate" cmimpressionsent="1">图 2</a> 在触发这些动作的事件之下列出了这些动作。</p>
<p><br />
<a name="grah-intermediate"><strong>图 2. 在初始状态图的事件下追加动作</strong></a><br />
<img height="250" alt="在初始状态图的事件下追加动作" src="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/FadingTooltip-graph-intermediate.gif" width="453" /> <br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="id8"><span class="atitle">将状态图转换成状态表</span></a></p>
<p>上述的状态图是设计有限状态机的一个很好的开始。但表形式更适合于完成设计，原因是表可以给出事件和状态的所有组合以供参考。</p>
<p>要将状态图转换成状态表，可以在行标题内填上事件名，在列标题内填上状态名。这些名字的顺序是任意的；我在第一行的开始位置放入了初始状态，在第一列的开始位置放入了初始事件，随后将动作和每一事件的下一状态复制到表中适当的单元格内，如 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#table-initial" cmimpressionsent="1">图 3</a> 所示。</p>
<p><br />
<a name="table-initial"><strong>图 3. 与初始状态图对应的初始状态表</strong></a><br />
<img height="201" alt="与初始状态图对应的初始状态表" src="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/FadingTooltip-table-initial.gif" width="572" /> <br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="id9"><span class="atitle">完成状态表</span></a></p>
<p>要完成有限状态机的设计，需要顾及表中的每一个空单元格。您需要为每个单元格做这样的考虑：该事件是否可以发生在该状态，如果可以，小部件在这种情况下将采取什么动作，下一个状态又将是什么。这虽然有些乏味，但却是设计过程的必需部分。 </p>
<p>考虑单元格的顺序先后关系不大。通常在设计过程中需要多次重复此步骤，反复考虑每个单元格，不时地修改其内容，而且每次的考虑顺序都会有所不同。另外随着设计的不断深入，添加（或删除）状态、做进一步的修改也十分常见。在这里，我将跳过这些反复过程，着重总结如何通过依次查看每个状态和事件来获得最终的结果表。</p>
<dl>
<dt><strong>Inactive 状态</strong>
<dd>在这种状态下，只有初始状态可以发生，原因是 mousemove 和 mouseout 事件应该继 mouseover 事件之后发生，而且没有任何定时器在运行。所以应将此列的所有其他单元格标记为&#8220;不应发生&#8221;。
<p>在继续之前，还应注意一下此状态的 mouseover 事件。当为此工具提示创建 HTML Division 元素时，需要将它定位于光标的附近，所以要保存光标的当前位置，当前位置由浏览器与此事件一同传递。而且在开始新的定时器之前，最好能够取消任何运行着的定时器。在 mouseover 对应的单元格内添加上述动作。</p>
<dt><strong>Pause 状态</strong>
<dd>
<p>在等待定时器超时时，光标可能会在 HTML 元素内移动或从此 HTML 元素移出。需要决定一旦发生这些事件所应采取的动作以及下一个状态是什么。如果在此状态发生 mouseout 事件，FadingTooltip 小部件应能返回 Inactive 状态，就像光标从未经过 HTML 元素一样，而且还必须取消定时器。在 mouseout 对应的单元格记录这些动作和转移。</p>
<p>另一方面，对于 mousemove 事件，则需要小部件能够继续等待光标悬停，这又要求取消和重新开启定时器。因为想要让工具提示出现在光标的附近，所以需要更新所保存的光标位置。Pause 状态下的 mousemove 事件的动作和转移与 Inactive 状态下的 mousemove 事件的动作和转移相同。所以无需重复两个单元格的内容，在 mousemove 对应的单元格内放上同样的内容即可。将此列的所有其他单元格标记为&#8220;不应发生&#8221;。</p>
<dt><strong>FadeIn 状态</strong>
<dd>在这种状态下，在用 timetick 事件处理淡入时，光标可以继续到处移动。如果发生 mousemove 事件，需相应移动工具提示并保持当前的状态不变。如果发生 mouseout 事件，转移到 FadeOut 状态，重复断续器仍会运行以便后续的 timetick 事件会在当前值的基础之上减少工具提示的不透明度。在适当的单元格内记录这些动作和转移并将此列的所有其他单元格标记为&#8220;不应发生&#8221;。
<p>&nbsp;</p>
<dt><strong>Display 状态</strong>
<dd>光标仍可以到处移动。如果光标在 HTML 元素之内移动，采取与 FadeIn 状态相同的动作 —— 相应移动工具提示。如果光标从 HTML 元素移出，就采取与 Display 状态下的 timeout 事件相同的状态和转移。在 mousemove 和 mouseout 对应的单元格直接放上相同的内容并将此列的所有其他单元格标记为&#8220;不应发生&#8221;；
<p>&nbsp;</p>
<dt><strong>FadeOut 状态</strong>
<dd>在这种状态下，在用 timetick 事件处理淡出时，光标仍可继续到处移动。如果光标在 HTML 元素之内移动，采取与 FadeIn 和 Display 状态相同的动作。如果光标从 HTML 元素移出，不需要做任何事情 —— 重复断续器会继续运行以便后续的 timetick 事件会在当前值的基础之上减少工具提示的不透明度直到其值为零。
<p>不要将此单元格标记为&#8220;不应发生&#8221;，而是应该标示为无需任何动作。如果光标又再次回到该 HTML 元素，将工具提示移回光标并返回 FadeIn 状态。</p>
</dd></dl>
<p><a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#table-as-designed" cmimpressionsent="1">图 4</a> 显示了所有这些动作和转移。剩下的空白单元格应标记为&#8220;不应发生&#8221;。</p>
<p><br />
<a name="table-as-designed"><strong>图 4. FadingTooltip 小部件设计后的状态表</strong></a><br />
<img height="195" alt="FadingTooltip 小部件设计后的状态表" src="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/FadingTooltip-table-as-desi.gif" width="572" /> <br />
</p>
<p>有限状态机的状态表总是能转换回状态图，因为二者是等价的。<a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#graph-as-designed" cmimpressionsent="1">图 5</a> 显示了完整的状态表对应的状态图。</p>
<p><br />
<a name="graph-as-designed"><strong>图 5. FadingTooltip 小部件设计后的状态图</strong></a><br />
<img height="266" alt="FadingTooltip 小部件设计后的状态图" src="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/FadingTooltip-graph-as-desi.gif" width="514" /> <br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="id10"><span class="atitle">收集状态变量</span></a></p>
<p>完成状态表和状态图之后，很有必要对它再进行一次回顾来收集状态机在两事件间需要记录的变量以便状态机能够执行不同的单元格内的相应动作。有限状态机需要 <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/index.html#inital-state-variables" cmimpressionsent="1">清单 2</a> 中所示的状态变量。 </p>
<p><br />
<a name="inital-state-variables"><strong>清单 2.初始的状态变量列表</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            currentState         string value equal to one of the state names
            currentTimer         pointer to timer object, obtained when set, used to cancel
            currentTicker        pointer to ticker object, obtained when started, used to cancel
            currentOpacity       float that varies from 0.0 (invisible) to 1.0 (fully visible)
            lastCursorPosition   floats obtained from cursor events, used when an HTML Division
            element is created
            tooltipDivision      pointer to HTML Division element, set when created, used when
            faded, moved, or deleted
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>虽然 JavaScript 变量本身不区分类型，但变量所包含的值是区分类型的（这就是说，任何类型的值都可以赋给变量）。根据这一原则，我列出了状态变量名并在注释部分给出了希望赋给这些变量的值的类型。</p>
<a name="download"><span class="atitle">下载</span><br />
<ul>
    <li>Demo: <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/test_files/FadingTooltipTests.html" cmimpressionsent="1">浏览器工具提示和 FadingTooltip 小部件样例</a><br />
    <br />
    <li>Code sample: <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/test_files/FadingTooltipTests.html.html" cmimpressionsent="1">浏览器工具提示和 FadingTooltip 小部件样例的 HTML 源代码</a><br />
    <br />
    <li>Code sample: <a href="http://www.ibm.com/developerworks/cn/web/wa-finitemach1/test_files/FadingTooltip.js.html" cmimpressionsent="1">浏览器工具提示和 FadingTooltip 小部件样例的 JavaScript 源代码</a><br />
    </li>
</ul>
</blockquote>
<img src ="http://www.blogjava.net/conans/aggbug/214091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-10 19:34 <a href="http://www.blogjava.net/conans/articles/214091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript导出Word后对Word分页的处理 </title><link>http://www.blogjava.net/conans/articles/213751.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 09 Jul 2008 11:07:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/213751.html</guid><description><![CDATA[<div class="postText">需求是这样的,导出html指定元素内容为word,并按指定关键字分页.<br />
网上找了半天只有保存为word的方法.在csdn上向专家提了问,没人回啊555.<br />
蹒跚学步开始了.<br />
对于分页,自己用vba录制了<br />
命令,然后用JavaScript调试出来的.<br />
<br />
直接看代码:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">HEAD</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">title</span><span style="color: #000000">&gt;</span><span style="color: #000000">WEB页面导出为Word文档后分页的方法&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">title</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">HEAD</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">SCRIPT&nbsp;LANGUAGE</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">javascript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_123_265_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_265_Open_Text.style.display='none'; Codehighlighter1_123_265_Closed_Image.style.display='inline'; Codehighlighter1_123_265_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_123_265_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_265_Closed_Text.style.display='none'; Codehighlighter1_123_265_Open_Image.style.display='inline'; Codehighlighter1_123_265_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_123_265_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_123_265_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;{Object}&nbsp;cont&nbsp;&nbsp;要导出的html元素内容的id,注意不要加双引号<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;{Object}&nbsp;key&nbsp;&nbsp;&nbsp;分页关键字<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;AllAreaWord(cont,key)<br />
<img id="Codehighlighter1_324_1887_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_1887_Open_Text.style.display='none'; Codehighlighter1_324_1887_Closed_Image.style.display='inline'; Codehighlighter1_324_1887_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_324_1887_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_324_1887_Closed_Text.style.display='none'; Codehighlighter1_324_1887_Open_Image.style.display='inline'; Codehighlighter1_324_1887_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_324_1887_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_324_1887_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;oWD&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ActiveXObject(</span><span style="color: #000000">"</span><span style="color: #000000">Word.Application</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">默认为页面视图</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;oDC&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;oWD.Documents.Add(</span><span style="color: #000000">""</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;oRange&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;oDC.Range(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">var&nbsp;oRange1&nbsp;=&nbsp;oDC.Range(0,2);</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;sel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;document.body.createTextRange();<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">参数为html元素id&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel.moveToElementText(cont);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel.select();<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel.execCommand(</span><span style="color: #000000">"</span><span style="color: #000000">Copy</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oRange.Paste();<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oWD.Application.Visible&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">得到打开后word的selection对象</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;selection&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;oWD.Selection;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">设置字体大小</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.Font.Size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">ctrl+A&nbsp;全选操作</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.WholeStory();<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">清除格式</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.Find.ClearFormatting();<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">指定查找关键字</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.Find.Text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;key;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">^m为手动分页符标记</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&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">向下查找</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.Find.Forward&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.Find.Wrap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">不区分大小写</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.Find.MatchCase&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">不匹配整个单词</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.Find.MatchWholeWord&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">如果找到指定字符串返回真,否则返回false</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(selection.Find.Execute())&nbsp;<br />
<img id="Codehighlighter1_1744_1869_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1744_1869_Open_Text.style.display='none'; Codehighlighter1_1744_1869_Closed_Image.style.display='inline'; Codehighlighter1_1744_1869_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1744_1869_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1744_1869_Closed_Text.style.display='none'; Codehighlighter1_1744_1869_Open_Image.style.display='inline'; Codehighlighter1_1744_1869_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1744_1869_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1744_1869_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&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">插入分页符,分页符常量为7,具体可查word&nbsp;api</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selection.InsertBreak(</span><span style="color: #000000">7</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">SCRIPT</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">body</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">BR</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">div&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aaa<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bbb<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ccc<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">div</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">input&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">button</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;onclick</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">javascript:AllAreaWord(test,'^');</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">导出页面指定区域内容到Word</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">body</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span></div>
</div>
<img src ="http://www.blogjava.net/conans/aggbug/213751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-09 19:07 <a href="http://www.blogjava.net/conans/articles/213751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>悟透JavaScript (转帖[绝对经典])</title><link>http://www.blogjava.net/conans/articles/210930.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Thu, 26 Jun 2008 11:52:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/210930.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 引子&nbsp;&nbsp;&nbsp; 编程世界里只存在两种基本元素，一个是数据，一个是代码。编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力。&nbsp;&nbsp;&nbsp;&nbsp;数据天生就是文静的，总想保持自己固有的本色；而代码却天生活泼，总想改变这个世界。&nbsp;&nbsp;&nbsp; 你看，数据代码间的关系与物质能量间的关系有着惊人的...&nbsp;&nbsp;<a href='http://www.blogjava.net/conans/articles/210930.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/210930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-26 19:52 <a href="http://www.blogjava.net/conans/articles/210930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javaScript常用技巧续（二） </title><link>http://www.blogjava.net/conans/articles/210577.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 25 Jun 2008 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/210577.html</guid><description><![CDATA[<span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">.如何设定打开页面的大小<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">body&nbsp;onload</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">top.resizeTo(300,200);</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
打开页面的位置</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">body&nbsp;onload</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">top.moveBy(300,200);</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
<br />
</span><span style="color: rgb(0,0,0)">27</span><span style="color: rgb(0,0,0)">.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">STYLE</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
body<br />
{background</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">image:url(</span><span style="color: rgb(0,0,0)">/</span><span style="color: rgb(0,0,0)">logo.gif);&nbsp;background</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">repeat:no</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">repeat;<br />
background</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">position:center;background</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">attachment:&nbsp;fixed}<br />
</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">STYLE</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
<br />
</span><span style="color: rgb(0,0,0)">28</span><span style="color: rgb(0,0,0)">.&nbsp;检查一段字符串是否全由数字组成<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">script&nbsp;language</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Javascript</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;&lt;!--</span><span style="color: rgb(0,0,0)"><br />
function&nbsp;checkNum(str){</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;str.match(</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">D/)==null}</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">alert(checkNum(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">1232142141</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">))<br />
alert(checkNum(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">123214214a1</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">))<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;--&gt;&lt;/script&gt;</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,0,0)">29</span><span style="color: rgb(0,0,0)">.&nbsp;获得一个窗口的大小<br />
document.body.clientWidth;&nbsp;document.body.clientHeight<br />
<br />
<br />
</span><span style="color: rgb(0,0,0)">30</span><span style="color: rgb(0,0,0)">.&nbsp;怎么判断是否是字符<br />
</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(</span><span style="color: rgb(0,0,0)">/</span><span style="color: rgb(0,0,0)">[</span><span style="color: rgb(0,0,0)">^/</span><span style="color: rgb(0,0,0)">x00</span><span style="color: rgb(0,0,0)">-/</span><span style="color: rgb(0,0,0)">xff]</span><span style="color: rgb(0,0,0)">/</span><span style="color: rgb(0,0,0)">g.test(s))&nbsp;alert(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">含有汉字</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;alert(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">全是字符</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
<br />
<br />
</span><span style="color: rgb(0,0,0)">31</span><span style="color: rgb(0,0,0)">.TEXTAREA自适应文字行数的多少<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">textarea&nbsp;rows</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">&nbsp;name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">s1&nbsp;cols</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">27</span><span style="color: rgb(0,0,0)">&nbsp;onpropertychange<br />
</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">this.style.posHeight=this.scrollHeight</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">textarea</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
<br />
</span><span style="color: rgb(0,0,0)">32</span><span style="color: rgb(0,0,0)">.&nbsp;日期减去天数等于第二个日期<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">script&nbsp;language</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">Javascript</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
function&nbsp;cc(dd,dadd)<br />
{<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">可以加上错误处理</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">var&nbsp;a&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;Date(dd)<br />
a&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;a.valueOf()<br />
a&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;a&nbsp;</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">&nbsp;dadd&nbsp;</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">24</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">60</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">60</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">1000</span><span style="color: rgb(0,0,0)"><br />
a&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;Date(a)<br />
alert(a.getFullYear()&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">年</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;(a.getMonth()&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">月</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;a.getDate()&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">日</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">)<br />
}<br />
cc(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">12/23/2002</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">)<br />
</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">script</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
<br />
</span><span style="color: rgb(0,0,0)">33</span><span style="color: rgb(0,0,0)">.&nbsp;选择了哪一个Radio<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">HTML</span><span style="color: rgb(0,0,0)">&gt;&lt;</span><span style="color: rgb(0,0,0)">script&nbsp;language</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">vbscript</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
function&nbsp;checkme()<br />
</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;each&nbsp;ob&nbsp;in&nbsp;radio1<br />
</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;ob.checked&nbsp;then<br />
window.alert&nbsp;ob.value<br />
next<br />
end&nbsp;function<br />
</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">script</span><span style="color: rgb(0,0,0)">&gt;&lt;</span><span style="color: rgb(0,0,0)">BODY</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">INPUT&nbsp;name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">radio1</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;type</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">radio</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;value</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">/style</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;checked</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">Style<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">INPUT&nbsp;name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">radio1</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;type</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">radio</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;value</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">/blog/barcode</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">Barcode<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">INPUT&nbsp;type</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">button</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;value</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">check</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;onclick</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">checkme()</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">BODY</span><span style="color: rgb(0,0,0)">&gt;&lt;/</span><span style="color: rgb(0,0,0)">HTML</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
<br />
</span><span style="color: rgb(0,0,0)">34</span><span style="color: rgb(0,0,0)">.脚本永不出错<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">SCRIPT&nbsp;LANGUAGE</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">JavaScript</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;!--</span><span style="color: rgb(0,0,0)">&nbsp;Hide<br />
function&nbsp;killErrors()&nbsp;{<br />
</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">true</span><span style="color: rgb(0,0,0)">;<br />
}<br />
window.onerror&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;killErrors;<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;--&gt;</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">SCRIPT</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
<br />
</span><span style="color: rgb(0,0,0)">35</span><span style="color: rgb(0,0,0)">.ENTER键可以让光标移到下一个输入框<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">input&nbsp;onkeydown</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">if(event.keyCode==13)event.keyCode=9</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span>
<img src ="http://www.blogjava.net/conans/aggbug/210577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-25 15:51 <a href="http://www.blogjava.net/conans/articles/210577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javaScript常用技巧续（一） </title><link>http://www.blogjava.net/conans/articles/210576.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 25 Jun 2008 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/210576.html</guid><description><![CDATA[16. 最小化、最大化、关闭窗口 <br />
&lt;object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <br />
&lt;param name="Command" value="Minimize"&gt;&lt;/object&gt; <br />
&lt;object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <br />
&lt;param name="Command" value="Maximize"&gt;&lt;/object&gt; <br />
&lt;OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt; <br />
&lt;PARAM NAME="Command" value="/Close"&gt;&lt;/OBJECT&gt; <br />
&lt;input type=button value="/最小化 onclick=hh1.Click()&gt; <br />
&lt;input type=button value="/blog/最大化 onclick=hh2.Click()&gt; <br />
&lt;input type=button value=关闭 onclick=hh3.Click()&gt; <br />
本例适用于IE <br />
<br />
<br />
17.屏蔽功能键Shift,Alt,Ctrl <br />
&lt;script&gt; <br />
function look(){ <br />
if(event.shiftKey) <br />
alert("禁止按Shift键!"); //可以换成ALT　CTRL <br />
} <br />
document.onkeydown=look; <br />
&lt;/script&gt; <br />
<br />
<br />
18. 网页不会被缓存 <br />
&lt;META HTTP-EQUIV="pragma" CONTENT="no-cache"&gt; <br />
&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"&gt; <br />
&lt;META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"&gt; <br />
或者&lt;META HTTP-EQUIV="expires" CONTENT="0"&gt; <br />
<br />
<br />
19.怎样让表单没有凹凸感？ <br />
&lt;input type=text"border:1 solid #000000"&gt; <br />
或 <br />
&lt;input type=text style="border-left:none; border-right:none; border-top:none; border-bottom: <br />
1 solid #000000"&gt;&lt;/textarea&gt; <br />
<br />
<br />
20.&lt;div&gt;&lt;span&gt;&amp;&lt;layer&gt;的区别？ <br />
&lt;div&gt;(division)用来定义大段的页面元素，会产生转行 <br />
&lt;span&gt;用来定义同一行内的元素，跟&lt;div&gt;的唯一区别是不产生转行 <br />
&lt;layer&gt;是ns的标记，ie不支持，相当于&lt;div&gt; <br />
<br />
<br />
21.让弹出窗口总是在最上面: <br />
&lt;body onblur="this.focus();"&gt; <br />
<br />
<br />
22.不要滚动条? <br />
让竖条没有: <br />
&lt;body style="overflow:scroll;overflow-y:hidden"&gt; <br />
&lt;/body&gt; <br />
让横条没有: <br />
&lt;body style="overflow:scroll;overflow-x:hidden"&gt; <br />
&lt;/body&gt; <br />
两个都去掉？更简单了 <br />
&lt;body scroll="no"&gt; <br />
&lt;/body&gt; <br />
<br />
<br />
23.怎样去掉图片链接点击后，图片周围的虚线？ <br />
&lt;a href="#" onFocus="this.blur()"&gt;&lt;img src="/logo.jpg" border=0&gt;&lt;/a&gt; <br />
<br />
<br />
24.电子邮件处理提交表单 <br />
&lt;form name="form1" method="post" action=mailto:****@***.com <br />
enctype="text/plain"&gt; <br />
&lt;input type=submit&gt; <br />
&lt;/form&gt; <br />
<br />
<br />
25.在打开的子窗口刷新父窗口的代码里如何写？ <br />
window.opener.location.reload() 
<img src ="http://www.blogjava.net/conans/aggbug/210576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-25 15:50 <a href="http://www.blogjava.net/conans/articles/210576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javaScript常用技巧 </title><link>http://www.blogjava.net/conans/articles/210575.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 25 Jun 2008 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/210575.html</guid><description><![CDATA[<font size="4">1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <br />
&lt;table border oncontextmenu=return(false)&gt;&lt;td&gt;no&lt;/table&gt; 可用于Table <br />
<br />
2. &lt;body onselectstart="return false"&gt; 取消选取、防止复制 <br />
<br />
3. onpaste="return false" 不准粘贴 <br />
<br />
4. oncopy="return false;" oncut="return false;" 防止复制 <br />
<br />
5. &lt;link rel="Shortcut Icon" href="favicon.ico"&gt; IE地址栏前换成自己的图标 <br />
<br />
6. &lt;link rel="Bookmark" href="favicon.ico"&gt; 可以在收藏夹中显示出你的图标 <br />
<br />
<br />
7. &lt;input style="ime-mode:disabled"&gt; 关闭输入法 <br />
<br />
<br />
8. 永远都会带着框架 <br />
&lt;script language="JavaScript"&gt;&lt;!-- <br />
if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页 <br />
// --&gt;&lt;/script&gt; <br />
<br />
<br />
9. 防止被人frame <br />
&lt;SCRIPT LANGUAGE=JAVASCRIPT&gt;&lt;!-- <br />
if (top.location != self.location)top.location=self.location; <br />
// --&gt;&lt;/SCRIPT&gt; <br />
<br />
<br />
10. 网页将不能被另存为 <br />
&lt;noscript&gt;&lt;*** src="/*.html&gt;";&lt;/***&gt;&lt;/noscript&gt; <br />
<br />
<br />
11. &lt;input type=button value="/查看网页源代码 <br />
onclick="window.location = "view-source:"+ "http://www.pconline.com.cn""&gt; <br />
12.删除时确认 <br />
&lt;a href=""javascript :if(confirm("确实要删除吗?"))location="boos.asp?&amp;areyou=删除&amp;page=1""&gt;删除&lt;/a&gt; <br />
<br />
<br />
13. 取得控件的绝对位置 <br />
//Javascript <br />
&lt;script language="Javascript"&gt; <br />
function getIE(e){ <br />
var t=e.offsetTop; <br />
var l=e.offsetLeft; <br />
while(e=e.offsetParent){ <br />
t+=e.offsetTop; <br />
l+=e.offsetLeft; <br />
} <br />
alert("top="+t+"/nleft="+l); <br />
} <br />
&lt;/script&gt; <br />
//VBScript <br />
&lt;script language="VBScript"&gt;&lt;!-- <br />
function getIE() <br />
dim t,l,a,b <br />
set a=document.all.img1 <br />
t=document.all.img1.offsetTop <br />
l=document.all.img1.offsetLeft <br />
while a.tagName&lt;&gt;"BODY" <br />
set a = a.offsetParent <br />
t=t+a.offsetTop <br />
l=l+a.offsetLeft <br />
wend <br />
msgbox "top="&amp;t&amp;chr(13)&amp;"left="&amp;l,64,"得到控件的位置" <br />
end function <br />
--&gt;&lt;/script&gt; <br />
<br />
<br />
14. 光标是停在文本框文字的最后 <br />
&lt;script language="javascript"&gt; <br />
function cc() <br />
{ <br />
var e = event.srcElement; <br />
var r =e.createTextRange(); <br />
r.moveStart("character",e.value.length); <br />
r.collapse(true); <br />
r.select(); <br />
} <br />
&lt;/script&gt; <br />
&lt;input type=text name=text1 value="123" onfocus="cc()"&gt; <br />
<br />
<br />
15. 判断上一页的来源 <br />
javascript : <br />
document.referrer</font> 
<img src ="http://www.blogjava.net/conans/aggbug/210575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-25 15:48 <a href="http://www.blogjava.net/conans/articles/210575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注意! JavaScript中的"陷阱"</title><link>http://www.blogjava.net/conans/articles/209885.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sun, 22 Jun 2008 10:58:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/209885.html</guid><description><![CDATA[<p>&nbsp;</p>
以下是JavaScript容易犯错的几个"陷阱".由本人google+体验+搜集而来.虽然不是什么很高深的技术问题，但注意一下，会使您的编程轻松些. <br />
<br />
<strong>1.　最后一个逗号</strong> <br />
<br />
如这段代码，注意最后一个逗号，按语言学角度来说应该是不错的（python的类似数据类型辞典dictionary就允许如此）。IE会报语法错误，但语义不详，你只能用人眼从几千行代码中扫描。 <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span>&lt;script&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;theObj&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;city&nbsp;:&nbsp;</span><span class="string">"ShenZhen"</span><span>, &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state&nbsp;:&nbsp;</span><span class="string">"ok"</span><span>, &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&lt;script&gt;
var theObj = {
city : "ShenZhen",
state : "ok",
}
&lt;/script&gt; </pre>
<br />
<br />
<br />
<strong>2.　this的引用会改变</strong> <br />
<br />
如这段代码： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><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><span>&lt;script&gt; &nbsp;&nbsp;</span></li>
    <li><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><span>&nbsp;&nbsp;&nbsp;&nbsp;</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><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.ClickHandler&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span class="keyword">this</span><span>.alertMessage&nbsp;);&nbsp;&nbsp;</span><span class="comment">//行1 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}(); &nbsp;&nbsp;</span></li>
    <li><span>document.getElementById(</span><span class="string">"theText"</span><span>).onclick&nbsp;=&nbsp;&nbsp;MyObject.ClickHandler; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&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 );  //行1
}
}();
document.getElementById("theText").onclick =  MyObject.ClickHandler;
&lt;/script&gt;
</pre>
<br />
<br />
并不如你所愿，答案并不是&#8221;JavaScript rules&#8221;。在执行MyObject.ClickHandler时，在行1中，this的引用实际上指向的是document.getElementById("theText")的引用。可以这么解决： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><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><span>&lt;script&gt; &nbsp;&nbsp;</span></li>
    <li><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><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;self&nbsp;=&nbsp;</span><span class="keyword">this</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.alertMessage&nbsp;=&nbsp;&#8220;Javascript&nbsp;rules&#8221;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.OnClick&nbsp;=&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(self.value); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}(); &nbsp;&nbsp;</span></li>
    <li><span>document.getElementById(&#8221;theText&#8221;).onclick&nbsp;=&nbsp;&nbsp;MyObject.OnClick &nbsp;&nbsp;</span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&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>
<br />
实质上，这就是JavaScript作用域的问题。如果你看过，你会发现解决方案不止一种。 <br />
<br />
<strong>3.　标识盗贼</strong> <br />
<br />
在JavaScript中不要直接使用跟HTML的id一样的变量名。如下代码： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><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><span>&lt;script&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;TheButton&nbsp;=&nbsp;document.getElementById(</span><span class="string">"TheButton"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&lt;input type="button" id="TheButton"&gt;
&lt;script&gt;
TheButton = document.getElementById("TheButton");
&lt;/script&gt;
</pre>
<br />
<br />
IE会报对象未定义的错误。我只能说：IE 真烂. <br />
若在TheButton之前加上var 声明,或者将TheButton改为其它名称,则不会报错.如: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><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><span>&lt;script&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;TheButton&nbsp;=&nbsp;document.getElementById(</span><span class="string">"TheButton"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//或 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestButton&nbsp;=&nbsp;document.getElementById(</span><span class="string">"TheButton"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&lt;input type="button" id="TheButton"&gt;
&lt;script&gt;
var TheButton = document.getElementById("TheButton");
//或
TestButton = document.getElementById("TheButton");
&lt;/script&gt;
</pre>
<br />
<br />
<br />
<strong>4.　字符串只替换第一个匹配</strong> <br />
<br />
如下代码： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span>&lt;script&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;fileName&nbsp;=&nbsp;</span><span class="string">"This&nbsp;is&nbsp;a&nbsp;title"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;fileName=fileName.replace(</span><span class="string">"&nbsp;"</span><span>,</span><span class="string">"_"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&lt;script&gt;
var fileName = "This is a title";
fileName=fileName.replace(" ","_");
&lt;/script&gt;
</pre>
<br />
<br />
而实际上，fileName结果是"This_is a title". 在JavaScript中，String.replace的第一个参数应该是正则表达式。所以，正确的做法是这样： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><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 class="js" style="display: none" name="code">var fileName = "This is a title".replace(/ /g,"_");</pre>
<br />
<br />
<strong>5.　mouseout意味着mousein</strong> <br />
<br />
事实上，这是由于事件冒泡导致的。IE中有mouseenter和mouseleave，但不是标准的。作者在此建议大家使用js库来解决问题。 <br />
<br />
<strong>6.　parseInt是基于进制体系的</strong> <br />
<br />
这个是常识，可是很多人给忽略了parseInt还有第二个参数，用以指明进制。比如，parseInt("09")，如果你认为答案是9，那就错了。因为，在此，字符串以0开头，parseInt以八进制来处理它，在八进制中，09是非法，返回false，布尔值false转化成数值就是0. 因此，正确的做法是 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span>parseInt(</span><span class="string">"09"</span><span>,&nbsp;10).&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">parseInt("09", 10). </pre>
<br />
<br />
<strong>7.　for...in...会遍历所有的东西</strong> <br />
<br />
有一段这样的代码： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span class="keyword">var</span><span>&nbsp;arr&nbsp;=&nbsp;[5,10,15] &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">var</span><span>&nbsp;total&nbsp;=&nbsp;1; &nbsp;&nbsp;</span></span></li>
    <li><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><span>&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;=&nbsp;total&nbsp;*&nbsp;arr[x]; &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">var arr = [5,10,15]
var total = 1;
for ( var x in arr) {
total = total * arr[x];
}
</pre>
<br />
运行得好好的，不是吗？但是有一天它不干了，给我返回的值变成了NaN, 晕。我只不过引入了一个库而已啊。原来是这个库改写了Array的prototype，这样，我们的arr平白无过多出了一个属性（方法），而for...in...会把它给遍历出来。 <br />
其实,就算没有引进库.它的结果也并不是数组所有元素的乘积,因为for...in...会遍历到数组的length属性. <br />
所以这样做才是比较安全的： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><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><span>&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;=&nbsp;total&nbsp;*&nbsp;arr[x]; &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">for ( var x = 0; x &lt; arr.length; x++) {
total = total * arr[x];
}
</pre>
<br />
<br />
其实，这也是污染基本类的prototype会带来危害的一个例证。 <br />
<br />
<strong>8.　事件处理器的陷阱</strong> <br />
<br />
这其实只会存在使用作为对象属性的事件处理器才会存在的问题。比如window.onclick = MyOnClickMethod这样的代码，这会复写掉之前的window.onclick事件，还可能导致IE的内容泄露（sucks again）。在IE还没有支持DOM 2的事件注册之前，作者建议使用库来解决问题，比如使用YUI: <br />
<br />
YAHOO.util.Event.addListener(window, "click", MyOnClickMethod); <br />
<br />
这应该也属于常识问题，但新手可能容易犯错。 <br />
<br />
<strong>9.　focus() 出错</strong> <br />
<br />
新建一个input文本元素，然后把焦点挪到它上面，按理说，这样的代码应该很自然： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span class="keyword">var</span><span>&nbsp;newInput&nbsp;=&nbsp;document.createElement(</span><span class="string">"input"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>document.body.appendChild(newInput); &nbsp;&nbsp;</span></li>
    <li><span>newInput.focus(); &nbsp;&nbsp;</span></li>
    <li><span>newInput.select();&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">var newInput = document.createElement("input");
document.body.appendChild(newInput);
newInput.focus();
newInput.select();
</pre>
<br />
但是IE会报错。这是因为当你执行fouce()的时候，元素尚未可用。因此，我们可以延迟执行： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span class="keyword">var</span><span>&nbsp;newInput&nbsp;=&nbsp;document.createElement(</span><span class="string">"input"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>newInput.id&nbsp;=&nbsp;</span><span class="string">"TheNewInput"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>document.body.appendChild(newInput); &nbsp;&nbsp;</span></li>
    <li><span class="comment">//在0.01秒之后调用匿名函数获取焦点 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>setTimeout(</span><span class="keyword">function</span><span>(){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span class="string">'TheNewInput'</span><span>).focus(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span class="string">'TheNewInput'</span><span>).select();},&nbsp;10);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">var newInput = document.createElement("input");
newInput.id = "TheNewInput";
document.body.appendChild(newInput);
//在0.01秒之后调用匿名函数获取焦点
setTimeout(function(){
document.getElementById('TheNewInput').focus();
document.getElementById('TheNewInput').select();}, 10);
</pre>
更详细的资料参见:<a href="http://realazy.org/blog/category/javascript-dom/" target="_blank">http://realazy.org/blog/category/javascript-dom/</a> <br />
<br />
<br />
<strong>10.document.write()完全替换之前页面内容</strong> <br />
有这样一段代码: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span>&lt;h3&gt;开始&lt;/h3&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;script&nbsp;type=</span><span class="string">"text/jscript"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">function</span><span>&nbsp;init()&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>document.write(</span><span class="string">"现在时间是:"</span><span>&nbsp;+&nbsp;Date()&nbsp;); &nbsp;&nbsp;</span></span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li><span>window.onload&nbsp;=&nbsp;init; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/script&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;h3&gt;结束&lt;/h3&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&lt;h3&gt;开始&lt;/h3&gt;
&lt;script type="text/jscript"&gt;
function init() {
document.write("现在时间是:" + Date() );
}
window.onload = init;
&lt;/script&gt;
&lt;h3&gt;结束&lt;/h3&gt;
</pre>
<br />
<br />
上面代码块中的"开始"和"结束"两块不会输出. <br />
当onload事件结束之后,如果再一次调用document.write()方法写进一段HTML,这段HTML会完全替换掉之前页面的内容.整个页面的源代码就变为了document.write()所写的内容.把上面的改为: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span>&lt;h3&gt;开始&lt;/h3&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;script&nbsp;type=</span><span class="string">"text/jscript"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">function</span><span>&nbsp;init()&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>document.write(</span><span class="string">"现在时间是:"</span><span>&nbsp;+&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date()&nbsp;); &nbsp;&nbsp;</span></span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li><span>init() &nbsp;&nbsp;</span></li>
    <li><span>&lt;/script&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;h3&gt;结束&lt;/h3&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&lt;h3&gt;开始&lt;/h3&gt;
&lt;script type="text/jscript"&gt;
function init() {
document.write("现在时间是:" + new Date() );
}
init()
&lt;/script&gt;
&lt;h3&gt;结束&lt;/h3&gt;
</pre>
<br />
"开始"和"结束"就会正常输出. <br />
<br />
<strong>11.注意你name的值.</strong> <br />
<br />
有这样一段代码: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span>&lt;form&nbsp;name=</span><span class="string">"myForm"</span><span>&nbsp;action=</span><span class="string">"aa.htm"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;input&nbsp;type=</span><span class="string">"text"</span><span>&nbsp;name=</span><span class="string">"action"</span><span>&nbsp;/&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/form&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;script&gt; &nbsp;&nbsp;</span></li>
    <li><span class="comment">//获取form的id </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>alert(document.forms[0].action); &nbsp;&nbsp;</span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">&lt;form name="myForm" action="aa.htm"&gt;
&lt;input type="text" name="action" /&gt;
&lt;/form&gt;
&lt;script&gt;
//获取form的id
alert(document.forms[0].action);
&lt;/script&gt;
</pre>
<br />
可输出结果不是我们想要的"aa.htm",而是一个"[object]"字符串.因为它得到的是myForm中的name为"action"的input标签的值.更详细的内容请参考[url]https://bugzilla.mozilla.org/show_bug.cgi?id=322488 <br />
[/url] <br />
<br />
<br />
<strong>12.后台数据传输不会影响到前台</strong> <br />
<br />
也许你会说这是一非常低级的错误.但我还是想说下: <br />
页面login.htm代码 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span>... &nbsp;&nbsp;</span></span></li>
    <li><span>xmlHttp.open(</span><span class="string">"GET"</span><span>,</span><span class="string">"check.htm"</span><span>,</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>xmlHttp.send(); &nbsp;&nbsp;</span></li>
    <li><span>alert(xmlHttp.responseText); &nbsp;&nbsp;</span></li>
    <li><span>...&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">...
xmlHttp.open("GET","check.htm",false);
xmlHttp.send();
alert(xmlHttp.responseText);
...
</pre>
<br />
页面check.htm代码 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/200401#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-c">
    <li><span><span>... &nbsp;&nbsp;</span></span></li>
    <li><span>window.onload=checkLogin; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">function</span><span>&nbsp;checkLogin(){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果验证失败,弹出错误 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span class="string">"登录失败"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li><span>...&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="js" style="display: none" name="code">...
window.onload=checkLogin;
function checkLogin(){
...
//如果验证失败,弹出错误
alert("登录失败");
...
}
...
</pre>
<br />
很多人习惯用这种方法来进行登录失败的提示.但是要注意:xmlHttp发送数据的时候是进行的后台发送,它所关心的,仅仅是send之后,得到所请求URL的响应.而check.htm页面所执行的一切,都是只在后台完成.不管它怎么跳转,或者alert(),或者close().都不会在界面中有任何显示. <br />
<br />
----------------------------------------------------------------------------------------- <br />
<br />
在实践中，JavaScript的陷阱还有很多很多，大多是由于解析器的实现不到位而引起。这些东西一般都不会在教科书中出现，只能靠开发者之间的经验分享。希望大家有更好的分享。 <br />
如发现其它的"陷阱",我会继续增加内容.谢谢关注. <br />
 <img src ="http://www.blogjava.net/conans/aggbug/209885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-22 18:58 <a href="http://www.blogjava.net/conans/articles/209885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js中replace方法的高级替换</title><link>http://www.blogjava.net/conans/articles/209620.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 20 Jun 2008 15:27:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/209620.html</guid><description><![CDATA[&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;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/conans/articles/209620.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/209620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-06-20 23:27 <a href="http://www.blogjava.net/conans/articles/209620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>