﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-A JavaScript Fancier</title><link>http://www.cnitblog.com/yemoo/</link><description>伟大的javascript技术研究中...</description><language>zh-cn</language><lastBuildDate>Fri, 01 May 2026 09:13:41 GMT</lastBuildDate><pubDate>Fri, 01 May 2026 09:13:41 GMT</pubDate><ttl>60</ttl><item><title>编写 Firefox Extension【转】</title><link>http://www.cnitblog.com/yemoo/archive/2008/07/10/46536.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Thu, 10 Jul 2008 02:22:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/07/10/46536.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/46536.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/07/10/46536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/46536.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/46536.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>为Firefox编写插件很有意思，却又很费力气，因为调试手段太缺乏。<br><br>由于Firefox在版本升级中，插件的结构发生了一定变化，而Mozila的文档对这些变化显得很不统一，也造成了一些困扰。以下所有内容，只在Firefox 1.5.*上得到验证。<br><br>一个打包好的Firefox插件是一个扩展名为xpi的zip文件，它包括以下几个部分：<br>1、chrome.manifest<br>这是核心配置文件，是它指导Firefox内核把插件的各个模块配置并组装起来，安放到指定的位置。<br><br>2、install.rdf<br>这一个安装和卸载是使用的描述文件，包含大量的字符串，主要供Extension Manger获取文字性的描述信息。<br><br>3、chrome/your-name.jar<br>这也是一个zip文件，它将会被chrome.manifest引用。<br><br>这个your-name.jar将大部分插件的内容打包，其中又包含三个文件夹<br>1、content<br>这个文件夹中包含界面描述文件XUL，JavaScript，以及资源文件。<br>2、locale<br>这个文件夹中包含为各地区和语言定制的字符串资源，可供界面文件等引用。它们应使用UTF-8编码。<br>3、skin<br>这个文件夹包含CSS样式表，可用来修饰界面文件<br><br>Firefox对所有这些文件的要求都很严格，一个细小的错误就会造成整个程序的功能错误。因此，编写时必须十分小心。<p><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/46536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-07-10 10:22 <a href="http://www.cnitblog.com/yemoo/archive/2008/07/10/46536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Firefox扩展一个xpi的目录结构 [转]</title><link>http://www.cnitblog.com/yemoo/archive/2008/07/10/46535.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Thu, 10 Jul 2008 02:21:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/07/10/46535.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/46535.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/07/10/46535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/46535.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/46535.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>xpi文件就是firefox能够识别的扩展文件，将xpi安装到firefox的方法比较多，而且挺简单的，以后介绍。<br>将xpi文件以WinRAR或者WinZip打开并解压，可以得到如下目录结构：<br>\chrome<br>\components<br>\defaults<br>\install.js<br>\install.rdf<br>\chrome.manifest<a name=entrymore></a><br>这是顶层的目录结构，在chrome目录下还会有重要的东西，逐一介绍：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chrome是Mozilla 规定扩展必须具备的目录，其中包含一个jar文件，为什么是jar呢？天知道Mozilla为什么要和Sun的Java这样纠缠不清！而实际上，他只是作为一种压缩结构而存在，就像zip包，rar包一样，只不过他是以Zip为压缩包结构，以.jar为扩展名。这个包里保存着完成扩展主要功能的文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;components文件夹用于存放自定义的 XPCOM 组件文件，就是将xpt和dll文件放在里面，上一片blog里说的install.js放在外面~。由于javascript功能还是挺强大的，一般简单的功能是可以完成的，所以这个目录是可选的，我现在在做的项目要用通过xpcom使用一些别的库，所以就要用到xpcom，就会有这个目录。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaults据说是负责存放一些默认的设置数据，我们现在正在做调研，东西做的还比较简单，没用到这个文件夹，当然这个文件夹也是可选的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install.js文件，作为一种安装脚本，他已经被Mozilla新的技术所代替，就是我们看到的另一个文件——install.rdf，但是这个js文件还是有他的作用的，比如将components文件夹里的xpt和dll通过xpinstall的api搬运到firefox的特定文件目录中去。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install.rdf文件，用于描述当前扩展的注册信息和附加信息等。在firefox的扩展软件中找到我们安装的扩展，右键点出关于，about对话框里的信息都是出自这个文件，安装扩展的时候，firefox会自动分析这个文件，提取例如扩展名，版本号，作者之类的信息到系统中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chrome.manifest文件负责将扩展的各种包注册到 Mozilla 的 chrome 系统中。可以理解为一个注册文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再来说一下chrome文件夹里的内容——jar文件包，解压这个包会得到三个目录：<br>\content<br>\local<br>\skin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content用于存放overlay或者Dialog、window这样的xul文件和负责控制逻辑响应事件的javascript文件。这个文件夹是必不可少的，我们扩展的核心内容就在这个文件夹中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local是本地化文件夹，当我们想支持多语言的时候，会用的到，由于我们要做对英语和日语的支持，说以会用到这个文件夹下的内容，以后会详细介绍的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skin文件夹是用于存储负责美化界面外观的样式表文件和图片文件，这些文件中的样式和图片会被 content 目录中的文件所引用，这点是初学者很不容易搞定的！content文件夹下的xul文件会用到！他们定义一个标示（ID），然后在本文件中什么也不做了！这点让我郁闷了一个上午，找啊找，翻啊翻的，结果在skin文件夹下的css文件中找到了！而css文件像一个桥梁一样，将skin中的图片文件与xul中的标签联系在一起！这个下一篇blog介绍。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样，一个xpi的基本目录就介绍完了！搞不明白为什么要分这老些文件夹，但是将content（实现）和skin（资源）分开会有他的好处的，至少很清晰！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做最简单的扩展你只需要这样的目录结构：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\chrome<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---\content<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---\XXX.xul和XXX.js<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\install.rdf<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\chrome.manifest<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实要做一个简单的扩展也不会那么难，以后的4篇blog我会依次介绍如何简单扩展我们可爱的firefox，状态栏，工具栏，菜单，还有定制工具栏那个面板。<p><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/46535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-07-10 10:21 <a href="http://www.cnitblog.com/yemoo/archive/2008/07/10/46535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现Ext的grid单元格数据过长换行显示 </title><link>http://www.cnitblog.com/yemoo/archive/2008/07/10/46534.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Thu, 10 Jul 2008 02:19:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/07/10/46534.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/46534.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/07/10/46534.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/46534.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/46534.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>Grid的单元格对数据显示都是采用省略的办法来处理的，即内容长度超过单元格长度时自动隐藏超过的部分并使用省略号...来显示，这样虽然也很好，但有时我们可能还是希望它能完全的显示出来，即采用换行显示。<br><br>最简单的办法莫过于直接修改ext-all.css，但俺一般不像侵入ext的源文件，那就自己用别的方法实现吧。<br>方法其实也很简单，判断该grid是否需要换行显示。如果是则加上这段代码：<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"><span style="COLOR: #000000">grid.store.on('load',&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;gridEl.select(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">table[class=x-grid3-row-table]</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).each(</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(x)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.addClass('x</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">grid3</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">cell</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">text</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">visible');<br>&nbsp;&nbsp;&nbsp;&nbsp;});<br>});</span></div>
<br><strong>CSS文件内容：<br></strong><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"><span style="COLOR: #800000">.x-grid3-cell-text-visible&nbsp;.x-grid3-cell-inner</span><span style="COLOR: #000000">{</span><span style="COLOR: #ff0000">overflow</span><span style="COLOR: #000000">:</span><span style="COLOR: #0000ff">visible</span><span style="COLOR: #000000">;</span><span style="COLOR: #ff0000">padding</span><span style="COLOR: #000000">:</span><span style="COLOR: #0000ff">3px&nbsp;3px&nbsp;3px&nbsp;5px</span><span style="COLOR: #000000">;</span><span style="COLOR: #ff0000">white-space</span><span style="COLOR: #000000">:</span><span style="COLOR: #0000ff">normal</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">}</span></div>
<br><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/46534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-07-10 10:19 <a href="http://www.cnitblog.com/yemoo/archive/2008/07/10/46534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext实现页面表单Enter全键盘导航</title><link>http://www.cnitblog.com/yemoo/archive/2008/07/10/46533.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Thu, 10 Jul 2008 02:17:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/07/10/46533.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/46533.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/07/10/46533.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/46533.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/46533.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>在web软件中，很多时候我们希望提供用户一个键盘表单导航的功能，使用Enter代替tab实现表单的导航。<br>思路基本就是遍历页面的input字段，为每个表单项增加一个enter键的监听，如果出发了enter键则程序在触发tab键即可。<br><br>下面是在ext中实现的键盘导航的代码。
<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">*<br>*&nbsp;表单全键盘导航功能<br>*&nbsp;index:可选参数，用于设定页面加载完成后默认获取焦点的表单项，支持索引号和id/dom类型参数传入。<br></span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;keyNav&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(index){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;run</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;all</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Ext.DomQuery.select('input[type</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">hidden]');&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">查找所有非隐藏的录入向（ext中select都是用input模拟的所以这里不用找select）</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.each(all,</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(o,i,all){&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">遍历并添加enter的监听</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.get(o).addKeyMap({<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;:&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br>&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">try</span><span style="COLOR: #000000">{all[i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].focus()}</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(e){event.keyCode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">}<br>&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">if</span><span style="COLOR: #000000">(all[i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&amp;&amp;/</span><span style="COLOR: #000000">button</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">reset</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">submit</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">.test(all[i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].type))&nbsp;all[i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].click();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果是按钮则触发click事件</span><span style="COLOR: #008000"><br></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">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.body.focus();&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使页面获取焦点，否则下面设定默认焦点的功能有时不灵验</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;el;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">&nbsp;eval(xFocus)</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">'object'){&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果传入的是id或dom节点</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Ext.getDom(xFocus).tagName</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">'input'</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">Ext.getDom(xFocus):Ext.get(xFocus).first('input',</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">找到input框</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">all[xFocus</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">通过索引号找</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.focus();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(e){}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;Ext.isReady</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">run():Ext.onReady(run);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">页面加载完成后添加表单导航</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}</span></div>
<br><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/46533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-07-10 10:17 <a href="http://www.cnitblog.com/yemoo/archive/2008/07/10/46533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用arguments.callee实现匿名函数的递归</title><link>http://www.cnitblog.com/yemoo/archive/2008/07/10/46532.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Thu, 10 Jul 2008 02:13:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/07/10/46532.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/46532.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/07/10/46532.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/46532.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/46532.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>实现递归的算法大家都是很熟悉的，比如一个求0到n的和的递归函数如下：<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"><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;fn</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(n){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;n</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">fn(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;alert(fn(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">))</span></div>
当然这是一个很简单的函数，如果在一个很复杂的程序中我们可能只需要调用一次该函数，为了函数的精简我们当然要努力较少函数名的定义，这是很自然会想到用匿名函数来直接执行。但是如果是匿名函数如何实现递归？arguments.callee正好派上用场，他指代的就是当前执行的函数的引用。<br><br><strong>利用匿名函数实现的递归如下：</strong><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"><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;s</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(n){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;n</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">arguments.callee(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;})(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;alert(s)</span></div>
一点小总结，主要是对匿名函数及arguments.calle的一些应用，例子举的不是很恰当，但这些知识在开发中还是有用的，总计起来增强一下自己的记忆。<p><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><<img src ="http://www.cnitblog.com/yemoo/aggbug/46532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-07-10 10:13 <a href="http://www.cnitblog.com/yemoo/archive/2008/07/10/46532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让你的个人效率翻三倍(转) </title><link>http://www.cnitblog.com/yemoo/archive/2008/07/10/46531.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Thu, 10 Jul 2008 02:09:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/07/10/46531.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/46531.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/07/10/46531.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/46531.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/46531.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>你是否曾有过这种感觉：当你回顾自己度过的一周时感到消沉，因为你未能完成自身所期望的那么多工作。当你在打造一个成功的职业生涯或你自己的事业时，时间或许是你最宝贵的财富，如何支配你的时间直接决定了你的收入。你无法购买你自有之外的时间，而时钟却永不停息地滴答作响。 <br>&nbsp;&nbsp;&nbsp;&nbsp;几年前，我发现了一个能让我把效率提高近三倍的简单方法，在本文中我将分享一些你可以马上着手进行的非常实用的观念，并且你不必为之付出比现在更多的努力。<br><br><strong>使用一个详细的日程表</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;更好地管理你的时间的首要任务是找出你现在支配时间的方式。使用一个日程表是完成此步骤最有效的方法。仅需尝试一天，你会立即对你的时间到底去了哪里有了不可思议的洞察。该测量的举动通常足以把你的无意识习惯提升到意识层面，如此你才有机会仔细检视并改变它们。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;此处是使用日程表的方法。一整天当你开始或完成某个活动时都把时间纪录下来，可考虑使用秒表来记录每个活动的时间间隔。你可以仅在工作时间使用这个方法，或是一整天都用。一天结束时，把这些时间段分类记录到综合类别中，然后找出你在每类活动中耗费时间的百分比。假如想把这事做彻底，可以持续做上一周，再计算你在每类活动中耗费的时间占总时间的百分比。要尽可能地详尽：记下你在收发电子邮件、阅读新闻组、网上冲浪、打电话、就餐、洗澡等等事情上分别花费了多少时间。当你从椅子上站起来的时候，可能就表示你该在日程表里添上一笔了。我通常每天结束时会有50——100个日程记录。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;你可能会惊讶地发现，你花在那些自认为是实质性工作的活动上只占了工作总时间的一小部分。有研究发现上班族每天在实质性工作上平均花费的时间为1.5小时。其余时间都耗在了社交、工间休息、就餐、与工作无关的交流、把文件挪来挪去，及其它许多与工作无关的事情上。全职上班族平均开始工作的时间是上午11点，而下午3点半左右就开始懈怠了。<br><br><strong>分析你的结果</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;我第一次使用日程表时，我一周在办公室花费了约60个小时，却只完成了15个小时的实质性工作。即使在技术上看来我的效率已是上班族均值的两倍，我仍为这个结果懊恼。另外45小时到哪去了？我的日程表清楚地显示出时间在我无意识的状态中流失——过分频繁地检查邮件、在那些实际上没有必要的事情上苛求完美、通读新闻、就餐时间过长、被其实可预防的干扰打断等等。<br><br><strong>计算你的个人效率比</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;当我察觉自己在办公室里耗了60个小时，却只完成了15个小时的实质性工作时，我开始自问一些有趣的问题。我的收入和成就感仅仅来自那15个小时，而不是我在办公室耗费的所有时间。因此我决定开始记录我的每日效率比，也即我在实质性工作上耗费的时间除以我在办公室耗费的总时间。当我发现自己仅利用了25％的时间时这确实令我感觉糟透了。我同时认识到，仅仅延长工作时间是极其愚蠢的。<br><br><span style="COLOR: #ff0000">效率比＝实际工作时间/总的&#8220;工作时间&#8221;</span><br><br><strong>用减少总时间推动效率提升</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;假如你曾经尝试过约束自己去做那些你并不真正有动力去做的事情，你失败的机率很大。这是当我试着约束自己去更努力地工作时的自然而然的结果。事实上，试图更努力只会降低我的动力并让我的效率比更低。因此我很不情愿地决定尝试相反的方法。第二天我只允许自己在办公室待上5个小时，而那天剩下的时间我不准自己再工作。哈，有趣的事情发生了，我肯定你能想象得到。我的大脑把工作时间当成了稀罕物，因为我持续工作了几乎整整5个小时且效率比超过了90％。我在一周接下来的几天里继续这个实验，于是这周在办公室度过的30个小时当中，我完成了25小时的工作，效率比超过80％。因此我在把每周工作时间减少到30小时的同时还多出了10小时来做实质性工作。假如你的日程表显示你的效率比十分低下，那就试着在一天中严格限制你的工作总时间，看看成果如何。一旦你的大脑认识到工作时间很紧迫，你突然间就会变得极有效率，因为你必须如此。当你有紧迫的时间限制时，你通常总能找出完成工作的办法。而当你有充裕时间时，很容易就变得效率低下。<br><br><strong>保持最高效率的同时逐渐增加工作总时间</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;在几周的时间里，我能在保持自己的效率超过80％的同时逐渐增加我的每周工作时间。迄今为止我保持这个习惯已有多年，一般每周约有40小时用来干实质性工作，同时只需在办公室待上45小时。我觉得这对我来说太棒了。假如我试图在办公室待上更长时间，我的生产率就会飞速下降。最妙的是这个方法能让我在最优化自己的工作效率的同时也让我在生活的其它领域得到极大的平衡。我使用这个方法使事业成效提升了三倍，并且仍有大量时间来追求个人爱好。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;使用日程表是确保生产率最佳而不必增加工作时间的明智选择。不过，日程表必须定期使用，才能产生这些优势。我每3——6个月用一次日程表，多年来它让我有了巨大的改变，总是让我有新的杰出表现。假如太长时间不用日程表，我的生产率就会逐渐下降——因为我又恢复了那些无意识的浪费时间的习惯。你将如我一般，发觉你对生产率的感受与你完成了多少实质性工作密切相关。当你感到自己的生产率比想达到的要低时，就利用日程表来提升你的意识和测量你的效率比，而后优化你的效率，直至生产率恢复如初。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;记录日程是一种高效且无需什么努力就能做到的方法，而它的长期回报是惊人的。<br><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/46531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-07-10 10:09 <a href="http://www.cnitblog.com/yemoo/archive/2008/07/10/46531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>扩展Ext.form.DateField实现定义日期面板默认展示日期</title><link>http://www.cnitblog.com/yemoo/archive/2008/07/10/46530.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Thu, 10 Jul 2008 02:04:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/07/10/46530.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/46530.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/07/10/46530.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/46530.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/46530.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>用了这么久的EXT，感觉Ext的功能是很全很强了，但任何东西都不能涵盖所有的需求，好在Ext为我们提供了书写扩展的接口，通过做一些扩展便可轻松是Ext组件满足我们的特殊需求。<br><br>Ext的date组件就不能满足我们这么一个需求：我们希望当日期框内容为空时，我们点击日期输入框后面的图标显示日期选择面板时，展示的默认日期不是当前日期的年月，而是我们自己设定的一个默认日期。<a name=entrymore></a><br><br>查看Ext.form.DateField的属性列表没有看到提供这么一个参数可以让我们设置默认展示日期。<br><br>因此这就需要我们自己去扩展下了。查看了Ext.form.DateField的onTriggerClick方法，发现面板的默认日期是在这里设定的。<br>Ext设定的是this.getValue() || new Date()，也就是先取输入框的值，如果不存在则使用当前日期。<br><br>ok，来扩展吧，我们自己再setValue一下就可以了。<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"><span style="COLOR: #000000">&nbsp;&nbsp;Ext.form.myDateField</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Ext.extend(Ext.form.DateField,{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onTriggerClick:</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.form.myDateField.superclass.onTriggerClick.call(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">先执行一下父类的函数内容，否则下面的this.menu找不到</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.menu.picker.setValue(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getValue()</span><span style="COLOR: #000000">||</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.defaultDate);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用menuPicker的setValue方法设定一下值</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.reg('myDateField',Ext.form.myDateField);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注册一个类型，便于使用</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使用我们自己扩展myDateField，直接new一个对象</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;date</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Ext.form.myDateField({<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderTo:document.body,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultDate:</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Date(</span><span style="COLOR: #000000">2008</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这个defaultDate就是我们扩展的一个属性</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">通过xtype引用</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;panel</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Ext.Panel({<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height:</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items:{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xtype:'myDateField',&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">通过我们注册的xtype来引用</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultDate:</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Date(</span><span style="COLOR: #000000">2008</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderTo:document.body<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br><br></span></div>
<br>看看代码注释大家一定都能明白，几行代码就搞定了。<br>再此感叹！Ext真强！<p><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/46530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-07-10 10:04 <a href="http://www.cnitblog.com/yemoo/archive/2008/07/10/46530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关onpropertychange事件的一点小发现</title><link>http://www.cnitblog.com/yemoo/archive/2008/06/23/45941.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Mon, 23 Jun 2008 05:42:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/06/23/45941.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/45941.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/06/23/45941.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/45941.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/45941.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;相信很多web开发朋友都使用过onpropertychange这个事件，虽然是ieOnly但也能帮我们不少忙，可能我们只知道该事件在输入框值发生变化的时候会被立即触发，其实这里还有很多我们小秘密。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先从名字上看onpropertychange上来看，应该是属性改变的时候被触发。做个测试。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">input&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="xxx"</span><span style="COLOR: #ff0000">&nbsp;id</span><span style="COLOR: #0000ff">="xx"</span><span style="COLOR: #ff0000">&nbsp;onclick</span><span style="COLOR: #0000ff">="this.myprop='xx'"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('xx').attachEvent('onpropertychange',</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(o){alert('ok')});<br>&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span></div>
<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 执行上面的代码，单击输入框发现也会触发onpropertychange，输入一个值同样也会触发这个事件，这就证明了，只要有属性的值被修改就会触发该事件。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 第二、既然我们发现了这个特点，那就会有一个问题了：当我们有时在输入框值发生改变时希望执行一个函数操作，但同时也要修改一个自定义的属性，这样onpropertychange就会被触发两次，这个可能并不是我们所希望的。<br>&nbsp;&nbsp;&nbsp;&nbsp;猜想一下，既然提供了这么一个属性，那一定应该能获取到是哪个属性被改变了。试着获取参数个数及参数内容.
<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"><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">input&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="xxx"</span><span style="COLOR: #ff0000">&nbsp;id</span><span style="COLOR: #0000ff">="xx"</span><span style="COLOR: #ff0000">&nbsp;onclick</span><span style="COLOR: #0000ff">="this.myprop='xx'"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('xx').attachEvent('onpropertychange',</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(arguments.length);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">for</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">var</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;i</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">0</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">;i</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">arguments.length;i</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">++</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(arguments[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行上面一段代码，会发现弹出了1和[object]，这说明该事件只给回调函数传入一个参数而且是object类型。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那我们就试试遍历一下这个object。<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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">input&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="xxx"</span><span style="COLOR: #ff0000">&nbsp;id</span><span style="COLOR: #0000ff">="xx"</span><span style="COLOR: #ff0000">&nbsp;onclick</span><span style="COLOR: #0000ff">="this.myprop='xx'"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('xx').attachEvent('onpropertychange',</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(o){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">for</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">var</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;item&nbsp;</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">in</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;o){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(item</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">+</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">:</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">+</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">o[item]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp; 执行一下，发现有很多个属性，但仔细看我们可能会发现这么一个属性：propertyName，相信每个人都能猜到这个属性的意思了。对，这个就是用来获取哪个属性被修改的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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"><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">input&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="xxx"</span><span style="COLOR: #ff0000">&nbsp;id</span><span style="COLOR: #0000ff">="xx"</span><span style="COLOR: #ff0000">&nbsp;onclick</span><span style="COLOR: #0000ff">="this.myprop='xx'"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('xx').attachEvent('onpropertychange',</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(o){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(o.propertyName);<br>&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span></div>
<br>&nbsp;&nbsp; 分别单击文本框和输入一个值，会发现分别弹出了myprop和value。<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; 再回到我们开始的问题，我们只需要判断是否是value被改变就ok了。<br>&nbsp;&nbsp; 直接看代码吧：<br>&nbsp;&nbsp;
<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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">input&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="xxx"</span><span style="COLOR: #ff0000">&nbsp;id</span><span style="COLOR: #0000ff">="xx"</span><span style="COLOR: #ff0000">&nbsp;onclick</span><span style="COLOR: #0000ff">="this.myprop='xx'"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('xx').attachEvent('onpropertychange',</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(o){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">if</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(o.propertyName</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">!=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">'value')</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">return</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">;&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">不是value改变不执行下面的操作</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><img src="http://www.cnitblog.com/Images/dot.gif"><img src="http://www.cnitblog.com/Images/dot.gif">.函数处理</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span></div><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/45941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-06-23 13:42 <a href="http://www.cnitblog.com/yemoo/archive/2008/06/23/45941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>“【XPATH错误】方法未知：--&gt;contains(@&lt;-” 的解决办法</title><link>http://www.cnitblog.com/yemoo/archive/2008/06/23/45940.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Mon, 23 Jun 2008 05:40:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/06/23/45940.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/45940.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/06/23/45940.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/45940.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/45940.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>今天使用xpath做一个模糊查询，在使用了一句 result=this.xmlDocRoot.selectNodes(".//*[contains(@c,'"+value+"')]");的语句时，居然报&#8220;方法未知：--&gt;contains(@&lt;-&#8221;的js错，郁闷半天，不明白是怎么回事，以前一直都这样用的，语句没有问题。<br>&nbsp;&nbsp;&nbsp;&nbsp; 详细对比了下以前的脚本，发现了一句不同地方：即创建xmlDom后有这么一句&#8220;xmlDom.setProperty('SelectionLanguage','XPath');&#8221;，突然回忆起来，原来在xmldom中使用xpath语法需要做一个声明，加上这一句测试，问题果然解决！对这个问题印象更加深刻了。希望对同样有遇到此问题的朋友能有所帮助。 <p><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/45940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-06-23 13:40 <a href="http://www.cnitblog.com/yemoo/archive/2008/06/23/45940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext中判断浏览器及系统平台的代码摘录</title><link>http://www.cnitblog.com/yemoo/archive/2008/06/23/45939.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Mon, 23 Jun 2008 05:39:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/06/23/45939.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/45939.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/06/23/45939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/45939.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/45939.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>判断浏览器类型及操作系统平台不算一个什么难题，但要做到短小精悍，那还是有些难度，看了Ext的代码觉得其代码的优秀之一就是代码的短小精悍，以尽可能精简的代码去实现一些操作。<br>这里摘录了Ext.js中关于浏览器类型及操作系统平台的代码，这段代码包含了很全面的关于浏览器和操作系统类型判断，而且代码也非常的精简，应该从中好好学习下：<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"><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;ua&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;navigator.userAgent.toLowerCase();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;isStrict&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;document.compatMode&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">CSS1Compat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOpera&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">opera</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isSafari&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">webkit</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">khtml</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">).test(ua),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isIE&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">isOpera&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">msie</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isIE7&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">isOpera&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">msie&nbsp;7</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isGecko&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">isSafari&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">gecko</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isBorderBox&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;isIE&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">isStrict,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isWindows&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">windows</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">win32</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMac&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">macintosh</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mac&nbsp;os&nbsp;x</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isLinux&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(ua.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isSecure&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;window.location.href.toLowerCase().indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">https</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">===</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span></div><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/45939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-06-23 13:39 <a href="http://www.cnitblog.com/yemoo/archive/2008/06/23/45939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断html元素是否真正可见的巧妙方法</title><link>http://www.cnitblog.com/yemoo/archive/2008/06/23/45938.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Mon, 23 Jun 2008 05:37:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/06/23/45938.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/45938.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/06/23/45938.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/45938.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/45938.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br>在Ext中，几乎所有的组件都有isVisible()方法和hidden属性，都是用来判断是否组件元素是否可见，这在ext内部管理来说没有问题，但有时我们把组件放在了自己的html结构内，如果我们把自己编写的html元素通过css定义为隐藏后，使用ext的isVisible方法和hidden属性就不能正确获取到组件是否可见了，因为ext也仅仅是根据判断元素的visibility和display属性来确定元素是否可见的。因此如果本身没有设定隐藏而外层设定了隐藏，则不能通过这两个css属性来判断元素是否可见了。<br><br>在实际的应用中，有时还必须需要知道元素的真实的可见性，但此时通过ext的内部方法就不管用了，思考测试许久突然想起了一个元素，当元素不可见时读取其实际高度或宽度则可能返回0，测试发现果然如此。<br>通过读取其offsetXXX或clientXXX来判断，或者使用Ext的getSize或getComputedWidth/Height方法获取，如果元素在页面不可见则会返回0，根据这点我们就可以获取到元素的真正可见性了。<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"><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;timer</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">setInterval(</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(el.getComputedHeight()</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">el.getComputedWidth()</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">do&nbsp;something</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clearInterval(timer);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>},</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span></div><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/45938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-06-23 13:37 <a href="http://www.cnitblog.com/yemoo/archive/2008/06/23/45938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈javascript函数劫持[转自xfocus]</title><link>http://www.cnitblog.com/yemoo/archive/2008/06/23/45937.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Mon, 23 Jun 2008 05:35:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/06/23/45937.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/45937.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/06/23/45937.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/45937.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/45937.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、概述javascript函数劫持，也就是老外提到的javascript hijacking技术。最早还是和剑心同学讨论问题时偶然看到的一段代码，大概这样写的：window.alert = function(s) {};觉得这种用法很巧妙新颖，和API Hook异曲同工，索性称之为javascript function hook，也就是函数劫持。通过替换js函数的实现来达到劫持这个函数调用的目的...&nbsp;&nbsp;<a href='http://www.cnitblog.com/yemoo/archive/2008/06/23/45937.html'>阅读全文</a><img src ="http://www.cnitblog.com/yemoo/aggbug/45937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-06-23 13:35 <a href="http://www.cnitblog.com/yemoo/archive/2008/06/23/45937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《JavaScript设计模式》第一章：神奇的JavaScript(二)</title><link>http://www.cnitblog.com/yemoo/archive/2008/06/18/45852.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Wed, 18 Jun 2008 07:11:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/06/18/45852.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/45852.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/06/18/45852.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/45852.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/45852.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><br><br><strong>对象的可变性<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JavaScript中，任何东西都是对象（除了三种基本数据类型外，但其实在需要的时候它们会自动转换为对象），而且，任何对象都是可变的。这两者将使你可以使用一些其他语言所不允许的技术，如为函数设定属性等。
<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"><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;displayError(message)&nbsp;{<br>displayError.numTimesExecuted</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>alert(message);<br>};<br>displayError.numTimesExecuted&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;</span></div>
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同样你可以在类被定义后或被实例化后对它进行修改。
<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Class&nbsp;Person.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;Person(name,&nbsp;age)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.age&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;age;<br>}<br>Person.prototype&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getName:&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.name;<br>&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;getAge:&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.age;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Instantiate&nbsp;the&nbsp;class.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;alice&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Person('Alice',&nbsp;</span><span style="COLOR: #000000">93</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;bill&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Person('Bill',&nbsp;</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Modify&nbsp;the&nbsp;class.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>Person.prototype.getGreeting&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;'Hi&nbsp;'&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getName()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;'</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">';<br>};<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Modify&nbsp;aspecific&nbsp;instance.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>alice.displayGreeting&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getGreeting());<br>}</span></div>
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这个例子中，在类的两个实例对象被创建后又为该类增加了getGreeting方法。根据prototype原型对象的原理这两个实例仍然可以拥有这个方法。但只有Alice拥有displayGreeting方法，其他的实例则没有。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;和变量动态性相关的一个概念是反射。你可以在运行时检测一个对象拥有哪些属性和方法。你可以使用这个技术实例化一个类并动态执行方法，而不需要知道方法名字（通过反射的方法）。这些是动态脚本的一些很重要的特性，是静态语言（如C++）等所不具有的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这本书中模拟创建传统的面向对象特性所使用的大多数技术中都是使用对象可变性和反射来实现的。如果你曾经使用过像C++、Java这些不允许对实例进行继承及不允许对声明后的类进行修改的这类语言，你可能会觉得JavaScript的这些特性有点奇怪。在JavaScript中，所有的一切都可以在运行时被修改。这是一个很强大的特性，它使你可以完成其它语言所不可能完成的一些事。然后，它也有一个缺点，它不能保证为类定义的一些方法在后面的程序中仍能保持原状，它很有可能会被破坏。这也是JavaScript中类型检测很少见的一部分原因。我们在第二章讨论关于避免类型检查和界面检查时会讲解这些。<br><br><strong>继承</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JavaScript中继承不如其他面向对象语言直接易懂。JavaScript采用的基于对象（原型）的继承，通过此方法可以模拟基于类的继承。本书中我们讲解了两种方式，你可以根据你的代码使用其中的一种方式。通常来说其中的一种会更适用于某个特定的任务。每种方式也有不同的性能特点，这通常是决定使用哪种方式的一个重要因素。这是一个很复杂的话题，我们在第四章再讨论。<br><br><strong>JavaScript中的设计模式</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1995年，Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides出版了一本名叫《设计模式》的书。编入这本书的目录的对象能彼此以不同的方式相互作用，并且它在不同类型的目标周围创造一种公用词汇。创造这些不同类型的目标的蓝图被称为设计模式。这本书以语言无关的方式描述这些模式，以便于将其用到任何地方。现在你手中的这本书就是将这些模式应用到了特定的语言JavaScript中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JavaScript语言如此神奇以至于你可以充分发挥自己的想象力将设计模式应用到你的代码中。这里有三个有关为什么你要将设计模式应用到JavaScript中的主要原因：<br>1、可维护性：设计模式有助于使您的模块更好的实现松耦合。这使得你可以更容易的重构你的代码和更换不同的模块。这也使你可以更好的在大型团队中进行工作，并更好的和其他程序员合作。<br>2、便于交流：设计模式提供了一些公用的词汇来描述不同类型的任务目标。这使得程序员可以更简单的描述系统的工作方式而不用进行繁琐的描述，比如你可以说：&#8220;这里使用了工厂模式。&#8221;特定模式的命名使你可以不用深入细节，从而在更高的层级进行讨论问题。<br>3、性能：我们这本书提到的一些模式是最佳化模式。他们可以极大的提高你的程序的运行速度，并减少发送到客户端的代码量。flyWeight（第十三章）和Proxy模式（第十四章）是有关于此的一些很重要的例子。<br><br>这里也有两个你可能不想使用设计模式的原因：<br>1、复杂性：可维护性往往需要一些成本，那就是你的代码可能变得越来越复杂而且对于新程序员很难去理解。<br>2、性能问题：虽然一些模式可以提升性能，但大多数的模式会带来一些轻微的性能开销。根据你项目的具体要求，这些开销的影响可能被忽略不计，也可能根本不能被接受。<br>模式的实现是简单的，懂得使用哪个模式以及什么时候使用才是最难的。不加考虑的将一些设计模式应用到你的代码中是非常危险的。花费点功夫以确保你使用的模式是最合适的，并且保证对性能的影响在可接受范围之内。<br><br><strong>本章摘要</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;神奇的JavaScript提供了强大的功能。尽管它本身缺乏一些有用的内置特性，但它的灵活性使你可以自己为其添加这些特性。根据你的背景和个人喜好，你可以用多种不同的方式来完成一个任务。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JavaScript是弱类型的，程序员在定义变量时不需要声明类型。函数是第一型的并且可以被动态的创建，并且你可以创建闭包。所有的对象和类都是可变的，他们可以在运行时被修改。有两种继承方式可以被使用：原型方式和经典方式，每种方法都有其优点和缺点。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JavaScript中，设计模式可以打来很大的益处，但如果使用不恰当也会带来很大的害处。在类似于JavaScript的这些轻量级语言中，过于复杂的架构很容易是一个程序瘫痪。一定要保证你的编程风格和使用的模式是适合你的工作的。<p><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/45852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-06-18 15:11 <a href="http://www.cnitblog.com/yemoo/archive/2008/06/18/45852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《JavaScript设计模式》第一章：神奇的JavaScript(一)</title><link>http://www.cnitblog.com/yemoo/archive/2008/06/18/45851.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Wed, 18 Jun 2008 07:06:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/06/18/45851.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/45851.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/06/18/45851.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/45851.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/45851.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><p align=left><span style="FONT-SIZE: 12px"><strong style="FONT-SIZE: 18pt">第一章&nbsp;&nbsp;神奇的JavaScript<br></strong></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JavaScript是近年来一个非常流行并被广泛应用的语言。因为它被几乎所有的浏览器所支持，因此也得到了广泛的推广。作为一种语言，它在我们的生活变得难以相信的重要，帮助我们增强web的功能，创建丰富的用户界面。<br>为什么仍然有一些人认为它是一种&#8220;玩具式&#8221;的语言，认为它不适合于专业的程序员。我认为这是因为他们没有认识到它的真正的强大之处和它相比其它各种编程语言的独特性。JavaScript是一门非常神奇高深的语言，拥有一些C家族类语言所没有的特性。<br>本章我们将探讨是哪些特性使JavaScript如此的神奇高深。我们将看到JavaScript使你可以用多种不同的方式来完成同一件事情，以及如何通过函数式程序设计的方式来模拟实现面向对象程序设计。我们将讨论为什么你应该把设计模式放在首页以及如何使用它来使你的代码更有效，工作更简单。<br><br><strong>灵活的JavaScript</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JavaScript的一个很重要的特性就是其灵活性。作为JavaScript程序员，你可以使你的程序很简单或很复杂。JavaScript允许你使用各种不同的编程风格。你可以使用函数式风格或者接近于面向对象的编程风格来编写你的代码，同样你可以在不了解函数式或面向对象编程的情形下书写相对复杂的程序，你也可以通过写一些简单的函数来使用它。或者这些也是一些人把JavaScript看做&#8220;玩具&#8221;语言的一个原因，但我们应该认为这些是一些优秀的特性。它可以使程序员只掌握小部分易学的语言子集来完成一些有用的功能，同样它也意味着当你成为一个更加高级的程序员时JavaScript会在你手中发挥更大的能力。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JavaScript允许你去模拟其他语言中的模式和思想。此外它自身还包含一些独有的特性。它提供了和传统服务端语言完全一样的面向对象特性。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们来看一下通过几个不同的代码组织方式来完成同样的一件任务：启动和停止一个动画。如果你不理解这些例子也无所谓，我们这里使用的所有模式和技术都会在本书中讲到。现在，你可以把这一节做为JavaScript可以通过不同的方式来完成同一件任务的一个实际的例子。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果你以前是一个面向过程的程序员，你可以会像下面这样做： </p>
<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Start&nbsp;and&nbsp;stop&nbsp;animations&nbsp;using&nbsp;functions.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;startAnimation()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>}<br></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;stopAnimation()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>}<br></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种方法非常简单，但它没有创建一个动画的对象来使你可以保存状态并拥有一些只作用于其内部状态的方法。下面这段代码定义了一个类使你可以创建这样的一个对象：<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Anim&nbsp;class.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;Anim&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>};<br>Anim.prototype.start&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>};<br>Anim.prototype.stop&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>};<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Usage.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;myAnim&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Anim();<br>myAnim.start();<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>myAnim.stop();</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里定义了一个叫做Anim的类并为该类的prototype属性增加了两个方法。我们在第三章将详细讨论这种技术。如果你喜欢创建一个只有一个声明的类，你可能会写出如下的代码：<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Anim&nbsp;class,&nbsp;with&nbsp;a&nbsp;slightly&nbsp;different&nbsp;syntax&nbsp;for&nbsp;declaring&nbsp;methods.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;Anim&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{&nbsp;<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>};<br>Anim.prototype&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{<br>start:&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>},<br><br>stop:&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>}<br>};<br></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这看起来有点类似于经典的面向对象编程风格：将函数声明嵌套在一个类声明之内。如果你之前使用过这种风格，你可以试一下下面这个例子，如果不太理解下面的部分代码也不要担心：<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Add&nbsp;a&nbsp;method&nbsp;to&nbsp;the&nbsp;Function&nbsp;object&nbsp;that&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;declare&nbsp;methods.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>Function.prototype.method&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(name,&nbsp;fn)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.prototype[name]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fn;<br>};<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Anim&nbsp;class,&nbsp;with&nbsp;methods&nbsp;created&nbsp;using&nbsp;a&nbsp;convenience&nbsp;method.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;Anim&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{&nbsp;<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>};<br>Anim.method('start',&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>});<br>Anim.method('stop',&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>});</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function.prototype.method使你可以为类增加新的方法。它可以接收两个参数：第一个是作为新方法的名字的字符串，第二个是为这个方法名指定的一个函数。<br>你可以通过对Function.prototype.method稍作修改以使其可以进行链式调用。为此，你只需要在创建完每个方法时返回一个this即可。我们在第6章将讨论链：<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;This&nbsp;version&nbsp;allows&nbsp;the&nbsp;calls&nbsp;to&nbsp;be&nbsp;chained.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>Function.prototype.method&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(name,&nbsp;fn)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.prototype[name]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fn;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br>};<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;Anim&nbsp;class,&nbsp;with&nbsp;methods&nbsp;created&nbsp;using&nbsp;a&nbsp;convenience&nbsp;method&nbsp;and&nbsp;chaining.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;Anim&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{&nbsp;<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>};<br>Anim.<br>method('start',&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>}).<br>method('stop',&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br><img src="http://www.cnitblog.com/Images/dot.gif"><br>});<br></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你刚刚看到了我们使用五种略微不同的方式来完成了同样一件任务。根据你的编程背景，你可能觉得某种方式比其他一种更好。这其实很好，JavaScript允许你使用最适合你们手中项目的编程方式。每种方式拥有不同的特点和不同代码量，效率和性能。我们在本书的第一部分涵盖了所有的这些编程方式。<br><br><strong>一种弱类型的语言</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JavaScript中，在定义变量时不需要定义类型，但是这并不意味着它没有变量类型。一个变量可以保存多种数据类型的数据，其类型取决所赋予给它的数据。JS有三种基本的数据类型：布尔型、数字型和字符串型（JavaScript不同于其他的编程语言，它将整型和浮点型作为同一种类型），此外，它含有可执行代码的function（函数）类型，还有包含复合类型的对象（Object）类型（Array是一种特殊的对象，它包含一些有序的数据集合）。现在，它还有null和undefiend数据类型。基本数据类型按值传递，其它的数据类型是按照引用传递，因此如果你不小心就可能导致一些意外的问题。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;和其它弱类型语言一样，变量会根据被赋予的值改变其数据类型。基本数据类型之间可以互相转换，toString方法可以将一个数字或布尔型数据转换为一个字符串。parseFloat和floatInt函数可以将字符串转换为数字型，双否定号可以将一个字符串或数字数据转换成布尔类型。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var bool = !!num;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;弱类型的变量提供了很多了灵活性，你不需要担心数据类型错误，因为在需要的时候JavaScript会自动做转换。<br><br><strong>函数是第一型对象</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JavaScript语言中，函数是第一性的对象。它可以被存储在一个变量中，作为参数传入到函数中，被函数作为返回值返回，或者在运行的时间动态构造。这些特性使你在使用函数增加了很大的灵活性和表现能力。在本书后面的部分你会看到，这些特性是你构建一个传统的面向对象框架的基础。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你可以使用functiuon(){&#8230;}方法创建一个匿名的函数。它没有函数名但可以被赋给一个变量。下面是一个匿名函数的例子：<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;An&nbsp;anonymous&nbsp;function,&nbsp;executed&nbsp;immediately.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>(</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;foo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;bar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;alert(foo&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bar);<br>})();<br></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个函数在定义和执行时没有赋给任何变量。最后的一对括号会使该函数立即执行。但并一定只能这样写：<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;An&nbsp;anonymous&nbsp;function&nbsp;with&nbsp;arguments.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>(</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(foo,&nbsp;bar)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;alert(foo&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bar);<br>})(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个匿名函数和第一个基本相同，但这个函数没有使用var在内部定义变量，而是作为参数传入了函数，这个函数可以有一个返回值并可以被赋予给一个变量。
<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;An&nbsp;anonymous&nbsp;function&nbsp;that&nbsp;returns&nbsp;avalue.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;baz&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(foo,&nbsp;bar)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;foo&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bar;<br>})(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;baz&nbsp;will&nbsp;equal&nbsp;20.</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;匿名函数的一个最有趣的功能就是创建闭包。闭包就是通过使用嵌套函数，创建一个保护变量空间。JavaScript有函数级的作用域，也就是说在函数中定义的变量不能被外部访问。它还有语法上作用域，也就是函数运行在他们定义的作用域而不是他们执行时的作用域。这两者相结合使你可以通过匿名函数创建一个保护变量。你可以使用这点为类创建私有变量。<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"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;An&nbsp;anonymous&nbsp;function&nbsp;used&nbsp;as&nbsp;aclosure.&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;baz;<br>(</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;foo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;bar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;baz&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;foo&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;bar;&nbsp;<br>};<br>})();<br>baz();&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;baz&nbsp;can&nbsp;access&nbsp;foo&nbsp;and&nbsp;bar,&nbsp;even&nbsp;though&nbsp;it&nbsp;is&nbsp;executed&nbsp;outside&nbsp;of&nbsp;the</span><span style="COLOR: #008000"><br>//</span><span style="COLOR: #008000">&nbsp;anonymous&nbsp;function.</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;变量foo和bar只在匿名函数中定义，因为baz函数也定义在这个闭包中，因此它可以访问这两个变量，甚至在闭包函数执行结束之后。这是我们整本书都会一直接触的一个复杂逻辑。我们在第三章讨论封装的时候将详细讲解这种技术。
<p><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script></p><img src ="http://www.cnitblog.com/yemoo/aggbug/45851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-06-18 15:06 <a href="http://www.cnitblog.com/yemoo/archive/2008/06/18/45851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>try finally 妙用,防止内存泄漏【转自51js】</title><link>http://www.cnitblog.com/yemoo/archive/2008/06/18/45850.html</link><dc:creator>Yemoo'S JS Blog</dc:creator><author>Yemoo'S JS Blog</author><pubDate>Wed, 18 Jun 2008 06:58:00 GMT</pubDate><guid>http://www.cnitblog.com/yemoo/archive/2008/06/18/45850.html</guid><wfw:comment>http://www.cnitblog.com/yemoo/comments/45850.html</wfw:comment><comments>http://www.cnitblog.com/yemoo/archive/2008/06/18/45850.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/yemoo/comments/commentRss/45850.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yemoo/services/trackbacks/45850.html</trackback:ping><description><![CDATA[<script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg1.js"></script><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"><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">d1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">div</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">script&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;createButton(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;obj&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;document.createElement(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">button</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.innerHTML</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">点我!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.onclick</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(){<br>&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">处理click事件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.onmouseover</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(){<br>&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">处理mouseover事件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;obj;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里由于需要返回创建的对象，所以不能把obj直接设为null.&nbsp;return&nbsp;后obj是局部变量，不能在外部断开其与HTMLElement的引用.ie中将出现问题泄漏问题</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}<br></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;按钮&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;document.getElementsById(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">d1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).appendChild(&nbsp;createButton());<br>按钮.做某些事();<br>按钮.做某些事();<br><img src="http://www.cnitblog.com/Images/dot.gif"><img src="http://www.cnitblog.com/Images/dot.gif">..<br>某些东西.某些事(按钮);<br><img src="http://www.cnitblog.com/Images/dot.gif"><img src="http://www.cnitblog.com/Images/dot.gif"><br></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">script</span><span style="COLOR: #000000">&gt;</span></div>
<br>这种写法在IE中100%内存泄漏<br><br>使用try finally很容易解决些问题<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"><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;createButton(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;obj&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;document.createElement(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">button</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.innerHTML</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">点我!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.onclick</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(){<br>&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">处理click事件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.onmouseover</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(){<br>&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">处理mouseover事件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;obj;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="COLOR: #0000ff">finally</span><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这句话在return&nbsp;之后才执行&nbsp;,&nbsp;的效的解决了需在return后将obj置null的问题</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>一个函数或方法中，其实有很多地方都需要这种选返回值，最后执行某些事的<br><script type="text/javascript" src="http://www.cnitblog.com/Files/yemoo/gg2.js"></script><img src ="http://www.cnitblog.com/yemoo/aggbug/45850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yemoo/" target="_blank">Yemoo'S JS Blog</a> 2008-06-18 14:58 <a href="http://www.cnitblog.com/yemoo/archive/2008/06/18/45850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>