﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-The NoteBook of EricKong-随笔分类-JavaScript</title><link>http://www.blogjava.net/jjshcc/category/45024.html</link><description>桑巴葡语翻译工作室是广州市最专业葡萄牙语翻译机构-www.puyufanyi.com-欢迎寻找Java,As400,Mainframe的猎头eric_cc#qq.ccom(把#换成@)</description><language>zh-cn</language><lastBuildDate>Sat, 03 Jan 2015 13:03:55 GMT</lastBuildDate><pubDate>Sat, 03 Jan 2015 13:03:55 GMT</pubDate><ttl>60</ttl><item><title>关于输入法的keycode</title><link>http://www.blogjava.net/jjshcc/archive/2014/12/31/421977.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 31 Dec 2014 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/12/31/421977.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/421977.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/12/31/421977.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/421977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/421977.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">在英文输入法模式下：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">0-9 对应的keyCode是 48-57</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">在中文输入法模式下：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">数字和字母的按键，以及tab键的keyCode为229</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">回车的回车的 keyCode 为8</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">以后在JS中少用按键的keyCode来判断数字的输入</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">直接用String.fromCharCode的方法来获得输入的字符，然后进行正则表达式的判读</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">找到一种可以屏蔽复制，拖曳的方法，并且只能输入数字，而且使用能让输入法的框消失</p><div id="Msg_{43CDE62B-355D-41F9-BEA1-D712418AC4ED}" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 10pt; font-family: 'Courier New'; color: #000000;"><div bg_xhtml"="" style="width: 700.90625px;"><div><div><strong>[xhtml]</strong>&nbsp;<a href="http://blog.csdn.net/chen123456789198808/article/details/5104712#" title="view plain" style="padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); background-position: 0% 0%; background-repeat: no-repeat;">view plain</a><a href="http://blog.csdn.net/chen123456789198808/article/details/5104712#" title="copy" style="padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); background-position: 0% 0%; background-repeat: no-repeat;">copy</a><div style="position: absolute; left: 711px; top: 942px; width: 18px; height: 18px; z-index: 99;"></div></div></div><ol start="1"><li style="line-height: 18px;"><span style="color: red;">onkeypress</span>=<span style="color: blue;">"return&nbsp;event.keyCode&gt;=48&amp;&amp;event.keyCode&lt;=57||event.keyCode==46"</span>&nbsp;<span style="color: red;">onpaste</span>=<span style="color: blue;">"return&nbsp;!clipboardData.getData('text').match(//D/)"</span>&nbsp;<span style="color: red;">ondragenter</span>=<span style="color: blue;">"return&nbsp;false"</span>&nbsp;<span style="color: red;">style</span>=<span style="color: blue;">"ime-mode:Disabled"</span>&nbsp;&nbsp;</li></ol></div></span></div><div style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></div><div style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="font-size: 10pt; font-family: 'Courier New'; color: #000000;">另外注意，小键盘的onKeyPress 和 onKeyDown的 keyCode是不一样的</span></div><img src ="http://www.blogjava.net/jjshcc/aggbug/421977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-12-31 10:11 <a href="http://www.blogjava.net/jjshcc/archive/2014/12/31/421977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前端解决跨域问题的8种方案（最新最全）</title><link>http://www.blogjava.net/jjshcc/archive/2014/12/12/421329.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Fri, 12 Dec 2014 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/12/12/421329.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/421329.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/12/12/421329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/421329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/421329.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: .同源策略如下：URL说明是否允许通信http://www.a.com/a.jshttp://www.a.com/b.js同一域名下允许http://www.a.com/lab/a.jshttp://www.a.com/script/b.js同一域名下不同文件夹允许http://www.a.com:8000/a.jshttp://www.a.com/b.js同一域名，不同端口不允许http://w...&nbsp;&nbsp;<a href='http://www.blogjava.net/jjshcc/archive/2014/12/12/421329.html'>阅读全文</a><img src ="http://www.blogjava.net/jjshcc/aggbug/421329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-12-12 09:36 <a href="http://www.blogjava.net/jjshcc/archive/2014/12/12/421329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sublime Text 3 常用插件以及安装方法</title><link>http://www.blogjava.net/jjshcc/archive/2014/11/11/419916.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 11 Nov 2014 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/11/11/419916.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/419916.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/11/11/419916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/419916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/419916.html</trackback:ping><description><![CDATA[<h5><strong>直接安装</strong></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">安装Sublime text 2插件很方便，可以直接下载安装包解压缩到Packages目录（菜单-&gt;preferences-&gt;packages）。</p><h5><strong>使用Package Control组件安装</strong></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">也可以安装package control组件，然后直接在线安装：</p><ol style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;"><ol><li>按Ctrl+`调出console（注：安装有QQ输入法的这个快捷键会有冲突的，输入法属性设置-输入法管理-取消热键切换至QQ拼音）</li><li>粘贴以下代码到底部命令行并回车：</li></ol></ol><pre linenums"="" style="line-height: normal;">import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read()) </pre><ol style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;"><li>重启Sublime Text 3。</li><li>如果在Perferences-&gt;package settings中看到package control这一项，则安装成功。</li></ol><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">顺便贴下Sublime Text2 的代码</p><pre linenums"="" style="line-height: normal;">import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')  </pre><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">如果这种方法不能安装成功，可以<a title="手动安装 Package Control" href="http://wbond.net/sublime_packages/package_control/installation" target="_blank">到这里下载文件手动安装</a>。</p><h4>用Package Control安装插件的方法：</h4><ol style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;"><li>按下Ctrl+Shift+P调出命令面板</li><li>输入install 调出 Install Package 选项并回车，然后在列表中选中要安装的插件。</li></ol><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">不爽的是，有的网络环境可能会不允许访问陌生的网络环境从而设置一道防火墙，而Sublime Text 2貌似无法设置代理，可能就获取不到安装包列表了。<br />好，方法介绍完了，下面是本文正题，一些有用的Sublime Text 2插件：</p><h5><strong>GBK Encoding Support</strong></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">对应gb2312来说，Sublime Text 2 本生不支持的，我们可以通过Ctrl+Shift+P调出命令面板或Perferences-&gt;Package Contro,输入install 调出 Install Package 选项并回车，在输入&#8220;GBK Encoding Support&#8221;选择开始安装，左下角状态栏有提示安装成功。这时打开gbk编码的文件就不会出现乱码了，如果有需要转成utf-8的可以在File-GBK to UTF8-选择Save with UTF8就偶看了。</p><h5><strong><a href="https://bitbucket.org/sublimator/sublime-2-zencoding" target="_blank">Zen Coding</a></strong></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">这个，不解释了，还不知道ZenCoding的同学强烈推荐去看一下：《Zen Coding: 一种快速编写HTML/CSS代码的方法》。</p><div alignnone"="" style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; width: 384px;"><img title="Sublime Text 3 常用插件以及安装方法 --PHP 第1张" alt="Sublime Text 3 常用插件以及安装方法 --PHP 第1张" src="http://cache.cnsecer.com/wp-content/uploads/2013/07/aad5f36c472cbee9427b2e6204bab0ba.png?watermark/1/image/aHR0cDovL2NhY2hlLmNuc2VjZXIuY29tL2ltYWdlcy93YXRlci5wbmc=/dissolve/100/gravity/SouthEast/dx/10/dy/10" width="374" height="197" /><p>emmet</p></div><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">PS:Zen Coding for Sublime Text 2插件的开发者已经停止了在Github上共享了，现在只有通过Package Control来安装。</p><h5><a href="https://github.com/mrmartineau/Jquery" target="_blank">jQuery Package for sublime Text</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">如果你离不开jQuery的话，这个必备～～</p><h5><a href="https://github.com/wbond/sublime_prefixr" target="_blank">Sublime Prefixr</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">Prefixr，CSS3 私有前缀自动补全插件，显然也很有用哇</p><div alignnone"="" style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; width: 617px;"><img title="Sublime Text 3 常用插件以及安装方法 --PHP 第2张" alt="Sublime Text 3 常用插件以及安装方法 --PHP 第2张" src="http://cache.cnsecer.com/wp-content/uploads/2013/07/b32ee22ba222e8ab566f3cb7f9269eb8.png?watermark/1/image/aHR0cDovL2NhY2hlLmNuc2VjZXIuY29tL2ltYWdlcy93YXRlci5wbmc=/dissolve/100/gravity/SouthEast/dx/10/dy/10" width="607" height="201" /><p>Sublime Prefixr</p></div><h5><a href="https://github.com/jdc0589/JsFormat" target="_blank">JS Format</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">一个JS代码格式化插件。</p><h5><a href="https://github.com/kronuz/SublimeLinter/" target="_blank">SublimeLinter</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">一个支持lint语法的插件，可以高亮linter认为有错误的代码行，也支持高亮一些特别的注释，比如&#8220;TODO&#8221;，这样就可以被快速定位。（IntelliJ IDEA的TODO功能很赞，这个插件虽然比不上，但是也够用了吧）</p><div alignnone"="" style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; width: 396px;"><img title="Sublime Text 3 常用插件以及安装方法 --PHP 第3张" alt="Sublime Text 3 常用插件以及安装方法 --PHP 第3张" src="http://cache.cnsecer.com/wp-content/uploads/2013/07/492a5e6f1c0a343d04184db9041e1208.png?watermark/1/image/aHR0cDovL2NhY2hlLmNuc2VjZXIuY29tL2ltYWdlcy93YXRlci5wbmc=/dissolve/100/gravity/SouthEast/dx/10/dy/10" width="386" height="138" /><p>SublimeLinter</p></div><h5><a href="https://github.com/mrmartineau/Placeholders" target="_blank">Placeholders</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">故名思意，占位用，包括一些占位文字和HTML代码片段，实用。</p><h5><a href="https://github.com/wbond/sublime_alignment" target="_blank">Sublime Alignment</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">用于代码格式的自动对齐。传说最新版Sublime 已经集成。</p><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;"><img title="Sublime Text 3 常用插件以及安装方法 --PHP 第4张" alt="Sublime Text 3 常用插件以及安装方法 --PHP 第4张" src="http://cache.cnsecer.com/wp-content/uploads/2013/07/0969cd1f6655094904594246c2826e71.png?watermark/1/image/aHR0cDovL2NhY2hlLmNuc2VjZXIuY29tL2ltYWdlcy93YXRlci5wbmc=/dissolve/100/gravity/SouthEast/dx/10/dy/10" width="402" height="139" /></p><h5><a href="https://github.com/kemayo/sublime-text-2-clipboard-history" target="_blank">Clipboard History</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">粘贴板历史记录，方便使用复制/剪切的内容。</p><h5><a href="https://github.com/phillipkoebbe/DetectSyntax" target="_blank">DetectSyntax</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">这是一个代码检测插件。</p><h5><a href="https://github.com/weslly/Nettuts-Fetch" target="_blank">Nettuts Fetch</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">如果你在用一些公用的或者开源的框架，比如&nbsp;<a href="http://necolas.github.com/normalize.css/">Normalize.css</a>或者<a href="http://www.modernizr.com/" target="_blank">modernizr.js</a>，但是，过了一段时间后，可能该开源库已经更新了，而你没有发现，这个时候可能已经不太适合你的项目了，那么你就要重新折腾一遍或者继续用陈旧的文件。Nettuts Fetch可以让你设置一些需要同步的文件列表，然后保存更新。</p><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;"><img title="Sublime Text 3 常用插件以及安装方法 --PHP 第5张" alt="Sublime Text 3 常用插件以及安装方法 --PHP 第5张" src="http://cache.cnsecer.com/wp-content/uploads/2013/07/279052d5f2433dd4e60293b8d6262635.jpg?watermark/1/image/aHR0cDovL2NhY2hlLmNuc2VjZXIuY29tL2ltYWdlcy93YXRlci5wbmc=/dissolve/100/gravity/SouthEast/dx/10/dy/10" /></p><h5><a href="https://github.com/cgutierrez/JsMinifier" target="_blank">JsMinifier</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">该插件基于Google Closure compiler，自动压缩js文件。</p><h5><a href="https://github.com/Kronuz/SublimeCodeIntel" target="_blank">Sublime CodeIntel</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">代码自动提示</p><h5><a href="https://github.com/facelessuser/BracketHighlighter" target="_blank">Bracket Highlighter</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">类似于代码匹配，可以匹配括号，引号等符号内的范围。</p><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;"><img title="Sublime Text 3 常用插件以及安装方法 --PHP 第6张" alt="Sublime Text 3 常用插件以及安装方法 --PHP 第6张" src="http://cache.cnsecer.com/wp-content/uploads/2013/07/085cf8d4ff3c0fde7200737fbf4480e1.png?watermark/1/image/aHR0cDovL2NhY2hlLmNuc2VjZXIuY29tL2ltYWdlcy93YXRlci5wbmc=/dissolve/100/gravity/SouthEast/dx/10/dy/10" /></p><h5><a href="https://github.com/atadams/Hex-to-HSL-Color" target="_blank">Hex to HSL</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">自动转换颜色值，从16进制到HSL格式，快捷键 Ctrl+Shift+U</p><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;"><img title="Sublime Text 3 常用插件以及安装方法 --PHP 第7张" alt="Sublime Text 3 常用插件以及安装方法 --PHP 第7张" src="http://cache.cnsecer.com/wp-content/uploads/2013/07/bd00cb4a7cd02ba80f54f1574b5cb807.png?watermark/1/image/aHR0cDovL2NhY2hlLmNuc2VjZXIuY29tL2ltYWdlcy93YXRlci5wbmc=/dissolve/100/gravity/SouthEast/dx/10/dy/10" /></p><h5><a href="http://www.sublimetext.com/forum/viewtopic.php?f=5&amp;p=22274" target="_blank">GBK to UTF8</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">将文件编码从GBK转黄成UTF8，快捷键Ctrl+Shift+C</p><h5><a href="https://github.com/kemayo/sublime-text-2-git" target="_blank">Git</a></h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;"><img title="Sublime Text 3 常用插件以及安装方法 --PHP 第8张" alt="Sublime Text 3 常用插件以及安装方法 --PHP 第8张" src="http://cache.cnsecer.com/wp-content/uploads/2013/07/42e61e14e67638fb2d2b1a9473ad1a30.png?watermark/1/image/aHR0cDovL2NhY2hlLmNuc2VjZXIuY29tL2ltYWdlcy93YXRlci5wbmc=/dissolve/100/gravity/SouthEast/dx/10/dy/10" /></p><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">该插件基本上实现了git的所有功能。</p><h5>总结</h5><p style="font-family: 'Times New Roman'; font-size: medium; line-height: normal;">好吧，大概就这些，如果你有常用的插件或者扩展，欢迎推荐。Sublime Text 3真是一款一见钟情的编辑器，每次和别人聊到编辑器时必荐的。。。</p><img src ="http://www.blogjava.net/jjshcc/aggbug/419916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-11-11 11:47 <a href="http://www.blogjava.net/jjshcc/archive/2014/11/11/419916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2013年度最强AngularJS资源合集</title><link>http://www.blogjava.net/jjshcc/archive/2014/10/24/419002.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Fri, 24 Oct 2014 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/10/24/419002.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/419002.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/10/24/419002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/419002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/419002.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;">AngularJS是Google开源的一款JavaScript MVC框架，弥补了HTML在构建应用方面的不足，其通过使用指令（directives）结构来扩展HTML词汇，使开发者可以使用HTML来声明动态内容，从而使得Web开发和测试工作变得更加容易。&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><br /><img alt="" src="http://dl2.iteye.com/upload/attachment/0092/7893/6413fe30-ca51-37fb-a869-d32bfa41fd81.jpg" style="border: 0px; display: block; margin-left: auto; margin-right: auto;" />&nbsp;<br /><strong>AngularJS诞生以来，吸引了大量的目光，也迅速成为了Web开发领域的新宠。本文整理了2013年度一些非常有价值的AngularJS相关教程和资源，</strong>如果你想了解AngularJS或正在使用AngularJS，那么这些资源肯定会为你的学习和进阶过程带来帮助。&nbsp;<br /><br /><span style="color: #ff0000;"><strong>一、了解AngularJS&nbsp;</strong></span><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://zh.wikipedia.org/wiki/AngularJS" style="color: #006699;">AngularJS维基百科</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.iteye.com/magazines/121" style="color: #006699;">专访AngularJS框架创始人Misko Hevery</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.iteye.com/news/28275" style="color: #006699;">Angular.js VS. Ember.js：谁将成为Web开发的新宠？</a></li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><strong><span style="color: #ff0000;">二、中文资源&nbsp;</span></strong><br /><br /><strong>1.&nbsp; 中文系列资源&nbsp;</strong><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://damoqiongqiu.iteye.com/category/282002" style="color: #006699;">AngularJS系列教程文章</a>&nbsp;&#8211; 大漠穷秋</li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://angularjs.cn/T006" style="color: #006699;">AngularJS入门系列教程</a>&nbsp;&#8211; AngularJS中文社区</li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://zouyesheng.com/angular.html" style="color: #006699;">AngularJS学习笔记</a>&nbsp;&#8211; 邹业盛</li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.zhihu.com/topic/19837063" style="color: #006699;">AngularJS精彩问答</a>&nbsp;- 知乎</li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><strong>2.&nbsp; 其他单篇文章&nbsp;</strong><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.lovelucy.info/angularjs-best-practices.html" style="color: #006699;">AngularJS 最佳实践</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.infoq.com/cn/news/2013/11/how-to-think-angularjs" style="color: #006699;">有jQuery背景的开发者如何建立起AngularJS的思维模式？</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.gbin1.com/technology/javascript/20130121-three-reasons-for-using-angularjs/" style="color: #006699;">现在就开始使用AngularJS的三个重要原因</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.infoq.com/cn/news/2013/02/angular-web-app" style="color: #006699;">使用AngularJS构建大型Web应用</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.cnblogs.com/whitewolf/archive/2013/03/24/2979344.html" style="color: #006699;">Angularjs开发一些经验总结</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://blog.jobbole.com/48979/" style="color: #006699;">5个示例带你学习AngularJS</a></li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><strong>3.&nbsp; 中文书籍&nbsp;</strong><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://item.jd.com/11342818.html" style="color: #006699;">《使用AngularJS开发下一代WEB应用》</a></li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><span style="color: #ff0000;"><strong>三、英文资源&nbsp;</strong></span><br /><br /><strong>1.&nbsp; AngularJS入门教程&nbsp;</strong><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://code-like-a-poem.blogspot.com.au/2013/03/behold-angularjs-is-here-about.html" style="color: #006699;">AngularJS傻瓜教程系列</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://net.tutsplus.com/tutorials/javascript-ajax/5-awesome-angularjs-features/" style="color: #006699;">AngularJS移动开发权威指南</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.revillwebdesign.com/angularjs-tutorial/" style="color: #006699;">AngularJS 30分钟入门</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://fastandfluid.com/publicdownloads/AngularJSIn60MinutesIsh_DanWahlin_May2013.pdf?utm_source=javascriptweekly&amp;utm_medium=email" style="color: #006699;">60分钟掌握AngularJS</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://joelhooks.com/blog/2013/04/24/modeling-data-and-state-in-your-angularjs-application/" style="color: #006699;">在你的AngularJS应用中建模数据</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.benlesh.com/2013/02/angularjs-creating-service-with-http.html" style="color: #006699;">使用$https创建服务</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://blog.revolunet.com/blog/2013/06/01/starting-with-angularjs/" style="color: #006699;">了解AngularJS的5个步骤</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://weblogs.asp.net/dwahlin/archive/2013/05/22/dynamically-loading-controllers-and-views-with-angularjs-and-requirejs.aspx" style="color: #006699;">AngularJS和RequireJS的动态加载控制器和视图</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://trochette.github.io/Angular-Design-Patterns-Best-Practices/" style="color: #006699;">先进的设计模式和最佳实践</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://flippinawesome.org/2013/08/05/animating-with-angularjs/" style="color: #006699;">AngularJS动画</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://weblogs.asp.net/dwahlin/archive/2013/08/16/using-an-angularjs-factory-to-interact-with-a-restful-service.aspx" style="color: #006699;">AngularJS Factory与RESTful服务的交互</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.davidsalter.com/2013/08/16/using-angular-dot-js-factories-to-get-remote-data/" style="color: #006699;">使用Angular.js Factory获取远程数据</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.sitepoint.com/10-reasons-use-angularjs/" style="color: #006699;">使用AngularJS的10个理由</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://blog.xebia.com/2013/09/01/differences-between-providers-in-angularjs/" style="color: #006699;">AngularJS中Providers之间的差异</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.kidsil.net/2013/09/filtering-with-angularjs" style="color: #006699;">AngularJS过滤</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://blog.artlogic.com/2013/03/06/angularjs-for-jquery-developers/" style="color: #006699;">针对jQuery开发者的AngularJ教程</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://wintellect.com/blogs/jlikness/10-reasons-web-developers-should-learn-angularjs" style="color: #006699;">Web开发者应该了解AngularJS的10个理由</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/" style="color: #006699;">Angular Js：何时应该使用Directive、Controller和Service？</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://blog.thousandeyes.com/creating-extensible-widgets-part-1-jquery-to-angularjs/" style="color: #006699;">30秒从jQuery转到AngularJS</a></li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><strong>2.&nbsp; AngularJS指令学习&nbsp;</strong><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.phloxblog.in/jquery-plugin-angular-js-directive-clean-html-approach/" style="color: #006699;">为jQuery插件构建AngularJS指令</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.phloxblog.in/d3-js-angular-directive/" style="color: #006699;">为D3.js条形图构建AngularJS指令</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.directiv.es/" style="color: #006699;">www.directiv.es：AngularJS指令库</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="https://github.com/agrublev/Angular-localStorage" style="color: #006699;">Angular-localStorage</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://goo.gl/k1a49B" style="color: #006699;">Videogular：一个基于AngularJS的HTML5视频播放器</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://jmdobry.github.io/angular-cache/" style="color: #006699;">Angular-cache</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://angular-ui.github.io/bootstrap/" style="color: #006699;">可用于Twitter Bootstrap的Angular指令</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="https://github.com/wesleyhales/angular-charts" style="color: #006699;">Angular的图表指令和服务</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://modernjavascript.blogspot.com.au/2013/10/angularjs-table-sort.html" style="color: #006699;">表排序</a></li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><strong>3.&nbsp; AngularJS应用开发实战&nbsp;</strong><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://weblogs.asp.net/dwahlin/archive/2013/10/25/learning-angularjs-by-example-the-customer-manager-application.aspx" style="color: #006699;">通过示例学习AngularJS&#8212;&#8212;客户管理应用程序</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.recursiverobot.com/post/53767548784/angularjs-with-indexeddb-using-a-helper-library" style="color: #006699;">AngularJS和IndexedDB结合使用</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://icelab.com.au/articles/levelling-up-with-angularjs-building-a-reusable-click-to-edit-directive/" style="color: #006699;">AngularJS：构建一个可重用的点击编辑指令</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://responsiblysourced.wordpress.com/2013/07/08/reactive-real-time-log-search-with-play-akka-angularjs-and-elasticsearch/" style="color: #006699;">Play、Akka、AngularJS和Elasticsearch打造的实时日志搜索功能</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="https://www.firebase.com/blog/2013-07-16-build-your-own-feed-reader.html" style="color: #006699;">使用Firebase和AngularJS打造自己的Google Reader</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://abou-kone.com/2013/07/17/developing-a-mobile-app-with-phonegap-angularjs-and-expressjs-part-i/" style="color: #006699;">使用Phonegap、AngularJS和ExpressJS开发一个移动App</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://matthiasnehlsen.com/blog/2013/08/13/birdwatch-angularjs-elasticsearch-play/" style="color: #006699;">BirdWatch v0.2：基于AngularJS、ElasticSearch和Play Framework的Tweet流分析工具</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.opensourceconnections.com/2013/08/25/instant-search-with-solr-and-angular/" style="color: #006699;">基于Solr和AngularJS的即时搜索工具</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="https://github.com/amirrajan/sortis" style="color: #006699;">Sortis：高级用户的Twitter客户端，初学者的跳板</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://timothy.userapp.io/post/64117882900/customizable-twitter-timeline-for-angularjs" style="color: #006699;">可定制的Twitter AngularJS时间轴</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://seanhess.github.io/2013/10/14/angularjs-directive-design.html" style="color: #006699;">AngularJS指令设计更轻松</a></li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><strong>4.&nbsp; AngularJS游戏开发</strong>&nbsp;<br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.sitepoint.com/angularjs-tutorial-build-an-app-using-directives-and-data-binding/" style="color: #006699;">基于CoffeeScript和AngularJS的画圈打叉游戏</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="https://github.com/callmehiphop/mario-cards" style="color: #006699;">超级马里奥卡片翻转游戏</a></li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><strong>5.&nbsp; AngularJS工作流程和测试&nbsp;</strong><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.youtube.com/watch?v=UYVcY9EJcRs" style="color: #006699;">AngularJS的测试策略</a>&nbsp;[视频]</li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.portlandwebworks.com/blog/combining-yeoman-angularjs-and-cordova-mobile-development" style="color: #006699;">使用Combining Yeoman、AngularJS和Cordova开发移动App</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.youtube.com/watch?v=eUmDDxrvqSs" style="color: #006699;">介绍Angular、Yeoman和Chrome应用程序</a>&nbsp;[视频]</li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.phloxblog.in/angular-js-tests-jasmine/" style="color: #006699;">使用Jasmine测试Angular.js应用</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-karma.html" style="color: #006699;">使用AngularJS和Karma进行全谱系测试</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="https://github.com/m7r/grunt-ngdocs" style="color: #006699;">使用Grunt插件创建AngularJS文档</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="https://github.com/joshdmiller/ng-boilerplate" style="color: #006699;">ng-boilerplate：新的AngularJS项目的样板</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="https://github.com/angular/angularjs-batarang" style="color: #006699;">基于AngularJS的Chrome Web检查器扩展</a></li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;"><a target="_blank" href="http://weblogs.asp.net/dwahlin/archive/2013/08/30/using-the-angularjs-package-for-sublime-text.aspx" style="color: #006699;">在Sublime Text中使用AngularJS包</a></li></ul><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><strong>6.&nbsp; AngularJS书籍&nbsp;</strong><br /><br /></p><ul style="margin: 0px 0px 1.5em; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #f7f7f7;"><li style="margin: 0px 0px 0.25em 30px; padding: 0px;">《<a target="_blank" href="http://www.manning.com/bford/" style="color: #006699;">AngularJS in Action</a>》</li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;">《<a target="_blank" href="https://leanpub.com/ng-book" style="color: #006699;">The Beginner&#8217;s guide to AngularJS</a>》</li><li style="margin: 0px 0px 0.25em 30px; padding: 0px;">《<a target="_blank" href="https://www.packtpub.com/angularjs-web-application-development/book" style="color: #006699;">Mastering Web Application Development with AngularJS</a>》&nbsp;</li></ul><img src ="http://www.blogjava.net/jjshcc/aggbug/419002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-10-24 16:37 <a href="http://www.blogjava.net/jjshcc/archive/2014/10/24/419002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>addEvent  和 delEvent </title><link>http://www.blogjava.net/jjshcc/archive/2014/08/05/416595.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 05 Aug 2014 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/08/05/416595.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/416595.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/08/05/416595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/416595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/416595.html</trackback:ping><description><![CDATA[var test= {
$ : function(id){
return document.getElementById(id);
},
addEvent : function(obj,eventType,func){
if(obj.attachEvent){obj.attachEvent("on" + eventType,func);}else{obj.addEventListener(eventType,func,false)}},
delEvent : function(obj,eventType,func){
if(obj.detachEvent){obj.detachEvent("on" + eventType,func)}else{obj.removeEventListener(eventType,func,false)}
}
};
<img src ="http://www.blogjava.net/jjshcc/aggbug/416595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-08-05 15:52 <a href="http://www.blogjava.net/jjshcc/archive/2014/08/05/416595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> form 转json最佳示例</title><link>http://www.blogjava.net/jjshcc/archive/2014/06/19/414933.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 19 Jun 2014 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/06/19/414933.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/414933.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/06/19/414933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/414933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/414933.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&nbsp;&nbsp;&lt;html&nbsp;xmlns="http:...&nbsp;&nbsp;<a href='http://www.blogjava.net/jjshcc/archive/2014/06/19/414933.html'>阅读全文</a><img src ="http://www.blogjava.net/jjshcc/aggbug/414933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-06-19 18:39 <a href="http://www.blogjava.net/jjshcc/archive/2014/06/19/414933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为现代JavaScript开发做好准备</title><link>http://www.blogjava.net/jjshcc/archive/2014/05/16/413738.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Fri, 16 May 2014 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2014/05/16/413738.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/413738.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2014/05/16/413738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/413738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/413738.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这篇文章是假设你曾经使用过JavaScript的，所以如果你从没有接触过它，也许你需要先了解下更基础的知识。现在我们开始吧！&nbsp;模块有多少人在一个文件中写的JS像下面的代码块一样？（注意：我可没有说内嵌在HTML文件中哦）:123var someSharedValue = 10;var myFunction = function(){ //do something }var another...&nbsp;&nbsp;<a href='http://www.blogjava.net/jjshcc/archive/2014/05/16/413738.html'>阅读全文</a><img src ="http://www.blogjava.net/jjshcc/aggbug/413738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2014-05-16 13:30 <a href="http://www.blogjava.net/jjshcc/archive/2014/05/16/413738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跨域资源共享的10种方式</title><link>http://www.blogjava.net/jjshcc/archive/2013/10/08/404744.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 08 Oct 2013 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2013/10/08/404744.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/404744.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2013/10/08/404744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/404744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/404744.html</trackback:ping><description><![CDATA[<div><span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 22px; color: #333333; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">在客户端编程语言中，如JavaScript和ActionScript，同源策略是一个很重要的安全理念，它在保证数据的安全性方面有着重要的意义。同 源策略规定跨域之间的脚本是隔离的，一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域，什么叫不同的域呢？</p><section style="display: block; "><h2>同源策略</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">在客户端编程语言中，如JavaScript和ActionScript，同源策略是一个很重要的安全理念，它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的，一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">那么什么叫相同域，什么叫不同的域呢？当两个域具有相同的协议(如http), 相同的端口(如80)，相同的host（如www.example.org)，那么我们就可以认为它们是相同的域。比如http://www.example.org/和http://www.example.org/sub/是同域，而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何两个都将构成跨域。同源策略还应该对一些特殊情况做处理，比如限制file协议下脚本的访问权限。本地的HTML文件在浏览器中是通过file协议打开的，如果脚本能通过file协议访问到硬盘上其它任意文件，就会出现安全隐患，目前IE8还有这样的隐患。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">受到同源策略的影响，跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步，目前在跨域请求的技巧上，有很多宝贵经验的沉淀和积累。这里我把跨域资源共享分成两种，一种是单向的数据请求，还有一种是双向的消息通信。接下来我将罗列出常见的一些跨域方式，以下跨域实例的源代码可以从这里获得。</p></section><section style="display: block; "><h2>单向跨域</h2><section style="display: block; "><h3>JSONP</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">JSONP (JSON with Padding)是一个简单高效的跨域方式，HTML中的script标签可以加载并执行其他域的JavaScript，于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据，那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据，然后在pageA中用script标签把pageB加载进来，那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数，pageB加载完之后会执行pageA中定义的函数，所需要的数据会以参数的形式传递给该函数。JSONP易于实现，但是也会存在一些安全隐患，如果第三方的脚本随意地执行，那么它就可以篡改页面内容，截获敏感数据。但是在受信任的双方传递数据，JSONP是非常合适的选择。</p></section><section style="display: block; "><h3>Flash URLLoader</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">Flash有自己的一套安全策略，服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问，SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域访问资源时，例如从域www.a.com请求域www.b.com上的数据，我们可以借助Flash来发送HTTP请求。首先，修改域www.b.com上的crossdomain.xml(一般存放在根目录，如果没有需要手动创建) ，把www.a.com加入到白名单。其次，通过Flash URLLoader发送HTTP请求，最后，通过Flash API把响应结果传递给JavaScript。Flash URLLoader是一种很普遍的跨域解决方案，不过需要支持iOS的话，这个方案就无能为力了。</p></section><section style="display: block; "><h3>Access Control</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">Access Control是比较超越的跨域方式，目前只在很少的浏览器中得以支持，这些浏览器可以发送一个跨域的HTTP请求（Firefox, Google Chrome等通过XMLHTTPRequest实现，IE8下通过XDomainRequest实现），请求的响应必须包含一个Access-Control-Allow-Origin的HTTP响应头，该响应头声明了请求域的可访问权限。例如www.a.com对www.b.com下的asset.php发送了一个跨域的HTTP请求，那么asset.php必须加入如下的响应头：</p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #48484c; ">header</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">"Access-Control-Allow-Origin: http://www.a.com"</span><span style="color: #93a1a1; ">);</span><span style="color: #48484c; "> 		</span></pre></section><section style="display: block; "><h3>window.name</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">window对象的name属性是一个很特别的属性，当该window的location变化，然后重新加载，它的name属性可以依然保持不变。那么我们可以在页面A中用iframe加载其他域的页面B，而页面B中用JavaScript把需要传递的数据赋值给window.name，iframe加载完成之后，页面A修改iframe的地址，将其变成同域的一个地址，然后就可以读出window.name的值了。这个方式非常适合单向的数据请求，而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。</p></section><section style="display: block; "><h3>server proxy</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">在数据提供方没有提供对JSONP协议或者window.name协议的支持，也没有对其它域开放访问权限时，我们可以通过server proxy的方式来抓取数据。例如当www.a.com域下的页面需要请求www.b.com下的资源文件asset.txt时，直接发送一个指向www.b.com/asset.txt的ajax请求肯定是会被浏览器阻止。这时，我们在www.a.com下配一个代理，然后把ajax请求绑定到这个代理路径下，例如www.a.com/proxy/, 然后这个代理发送HTTP请求访问www.b.com下的asset.txt，跨域的HTTP请求是在服务器端进行的，客户端并没有产生跨域的ajax请求。这个跨域方式不需要和目标资源签订协议，带有侵略性，另外需要注意的是实践中应该对这个代理实施一定程度的保护，比如限制他人使用或者使用频率。</p></section></section><section style="display: block; "><h2>双向跨域</h2><section style="display: block; "><h3>document.domain</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">通过修改document的domain属性，我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域，比如www.a.com和sub.a.com是不同的域，这时，我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript方法。但是当我们把它们document的domain属性都修改为a.com，浏览器就会认为它们处于同一个域下，那么我们就可以互相调用对方的method来通信了。</p></section><section style="display: block; "><h3>FIM &#8211; Fragment Identitier Messaging</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">不同的域之间，JavaScript只能做很有限的访问和操作，其实我们利用这些有限的访问权限就可以达到跨域通信的目的了。FIM (Fragment Identitier Messaging)就是在这个大前提下被发明的。父窗口可以对iframe进行URL读写，iframe也可以读写父窗口的URL，URL有一部分被称为frag，就是#号及其后面的字符，它一般用于浏览器锚点定位，Server端并不关心这部分，应该说HTTP请求过程中不会携带frag，所以这部分的修改不会产生HTTP请求，但是会产生浏览器历史记录。FIM的原理就是改变URL的frag部分来进行双向通信。每个window通过改变其他window的location来发送消息，并通过监听自己的URL的变化来接收消息。这个方式的通信会造成一些不必要的浏览器历史记录，而且有些浏览器不支持onhashchange事件，需要轮询来获知URL的改变，最后，URL在浏览器下有长度限制，这个制约了每次传送的数据量。</p></section><section style="display: block; "><h3>Flash LocalConnection</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">页面上的双向通信也可以通过Flash来解决，Flash API中有LocalConnection这个类，该类允许两个SWF之间通过进程通信，这时SWF可以播放在独立的Flash Player或者AIR中，也可以嵌在HTML页面或者是PDF中。遵循这个通信原则，我们可以在不同域的HTML页面各自嵌套一个SWF来达到相互传递数据的目的了。SWF通过LocalConnection交换数据是很快的，但是每次的数据量有40kb的大小限制。用这种方式来跨域通信过于复杂，而且需要了2个SWF文件，实用性不强。</p></section><section style="display: block; "><h3>window.postMessage</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">window.postMessage是HTML5定义的一个很新的方法，这个方法可以很方便地跨window通信。由于它是一个很新的方法，所以在很旧和比较旧的浏览器中都无法使用。</p></section><section style="display: block; "><h3>Cross Frame</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">Cross Frame是FIM的一个变种，它借助了一个空白的iframe，不会产生多余的浏览器历史记录，也不需要轮询URL的改变，在可用性和性能上都做了很大的改观。它的基本原理大致是这样的，假设在域www.a.com上有页面A.html和一个空白代理页面proxyA.html, 另一个域www.b.com上有个页面B.html和一个空白代理页面proxyB.html，A.html需要向B.html中发送消息时，页面会创建一个隐藏的iframe, iframe的src指向proxyB.html并把message作为URL frag，由于B.html和proxyB.html是同域，所以在iframe加载完成之后，B.html可以获得iframe的URL，然后解析出message，并移除该iframe。当B.html需要向A.html发送消息时，原理一样。Cross Frame是很好的双向通信方式，而且安全高效，但是它在Opera中无法使用，不过在Opera下面我们可以使用更简单的window.postMessage来代替。</p></section></section><section style="display: block; "><h2>总结</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">跨域的方法很多，不同的应用场景我们都可以找到一个最合适的解决方案。比如单向的数据请求，我们应该优先选择JSONP或者window.name，双向通信我们采取Cross Frame，在未与数据提供方没有达成通信协议的情况下我们也可以用server proxy的方式来抓取数据。</p></section></span></div><img src ="http://www.blogjava.net/jjshcc/aggbug/404744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2013-10-08 13:13 <a href="http://www.blogjava.net/jjshcc/archive/2013/10/08/404744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript基本处理事件详解和阻止事件传播</title><link>http://www.blogjava.net/jjshcc/archive/2013/10/08/404743.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 08 Oct 2013 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2013/10/08/404743.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/404743.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2013/10/08/404743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/404743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/404743.html</trackback:ping><description><![CDATA[<div><span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 22px; color: #333333; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">事件就是用户或者浏览器自身执行的某种动作。诸如click、load、和scroll等等，都是事件的名字。而响应某个事件的函就叫做事件处理程序（或事件侦听器）。事件处理程序的名字都是以&#8221;on&#8220;开头，因此ckick事件的事件处理程序就是onclick，load的事件处理程序就是onload。</p><section style="display: block; "><h2>页面中添加事件的有几种方式</h2><ol style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; line-height: 2em; "><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">直接将代码写在HTMl上<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "></p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #1e347b; ">&lt;div</span> <span style="color: #1e347b; ">onclick</span><span style="color: #93a1a1; ">=</span><span style="color: #dd1144; ">"</span><span style="color: #48484c; ">alert</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">'Hello World'</span><span style="color: #93a1a1; ">);</span><span style="color: #dd1144; ">"</span><span style="color: #1e347b; ">&gt;</span><span style="color: #48484c; ">Nowamagic</span><span style="color: #1e347b; ">&lt;/div&gt;</span></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">代码少的还勉强可以，代码多的话就哭了写页面的哥们了。</p></li><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">定义一个函数，分配给html元素<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "></p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #1e347b; ">&lt;script</span> <span style="color: #1e347b; ">type</span><span style="color: #93a1a1; ">=</span><span style="color: #dd1144; ">"text/javascript"</span><span style="color: #1e347b; ">&gt;</span> <span style="color: #1e347b; ">function</span><span style="color: #48484c; "> clk</span><span style="color: #93a1a1; ">(){}</span><span style="color: #48484c; "> </span><span style="color: #1e347b; ">&lt;/script&gt;</span><span style="color: #48484c; "> //..... </span><span style="color: #1e347b; ">&lt;div</span> <span style="color: #1e347b; ">onclick</span><span style="color: #93a1a1; ">=</span><span style="color: #dd1144; ">"</span><span style="color: #48484c; ">clk</span><span style="color: #93a1a1; ">()</span><span style="color: #dd1144; ">"</span><span style="color: #1e347b; ">&gt;</span><span style="color: #48484c; ">Div2 Element</span><span style="color: #1e347b; ">&lt;/div&gt;</span></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">这样做虽然能减少html代码上的js量，但是这样子做有几个缺点：用户可能在HTMl代码已经出现在页面上，但是js事件函数可能还没加载进来的情况下就点击了事件对象元素，从而导致错误；还有就是HTML与javascript代码还是未分离完全，如果要修改就要改HTML代码和javascript代码两处</p></li><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">HTML与javascript代码完全分离<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "></p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #48484c; ">document</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">getElementById</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">'myButton'</span><span style="color: #93a1a1; ">).</span><span style="color: #48484c; ">onclick </span><span style="color: #93a1a1; ">=</span> <span style="color: #1e347b; ">function</span><span style="color: #93a1a1; ">(){</span><span style="color: #48484c; ">     alert</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">'Hello!'</span><span style="color: #93a1a1; ">);</span><span style="color: #48484c; "> </span><span style="color: #93a1a1; ">}</span><span style="color: #48484c; "> </span><span style="color: #93a1a1; ">&lt;</span><span style="color: #48484c; ">div id</span><span style="color: #93a1a1; ">=</span><span style="color: #dd1144; ">"myButton"</span><span style="color: #93a1a1; ">&gt;点击按钮/</span><span style="color: #48484c; ">div</span><span style="color: #93a1a1; ">&gt;</span></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">它只需要HTML元素提供一个id属性(或其它能获取该元素对象的方式)，就可以实现事件的注册。真正做到HTML与javascript代码完全分离，结构与行为完全分离的事件处理方法。</p></li></ol></section><section style="display: block; "><h2>如何监听事件</h2><section style="display: block; "><h3>DOM Leavl 0</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">DOM Leavl 0是最早的事件处理形式，它既可以直接写在HTMl上，也可以把一个函数分配给一个事件处理程序。然而，这种方式给一个元素的同一事件只允许一个处理器。因此，我们还要继续完善。</p></section><section style="display: block; "><h3>W3C DOM Leavl 2 &#8211; 事件监听器</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">通过W3C DEMO Leavl 2事件处理，我们不会直接把一个函数分配给一个事件处理程序；相反，我们将新函数添加一个事件监听器：</p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #1e347b; ">var</span><span style="color: #48484c; "> el </span><span style="color: #93a1a1; ">=</span><span style="color: #48484c; "> document</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">getElementById</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">'myButton'</span><span style="color: #93a1a1; ">)</span><span style="color: #48484c; "> el</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">addEventListener</span><span style="color: #93a1a1; ">(</span> <span style="color: #dd1144; ">'click'</span><span style="color: #93a1a1; ">,</span> <span style="color: #1e347b; ">function</span><span style="color: #93a1a1; ">(){</span><span style="color: #48484c; ">     alert</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">'Hello!'</span><span style="color: #93a1a1; ">);</span><span style="color: #48484c; "> </span><span style="color: #93a1a1; ">},</span> <span style="color: #1e347b; ">false</span><span style="color: #93a1a1; ">)</span></pre><figure style="display: block; margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #999999; font: normal normal normal 14px/22px Georgia, 'Times New Roman', serif; color: #565656; "><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #48484c; ">targetElement</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">addEventlistener</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">typeOfEvent</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; ">listenerFunction</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; ">useCapture</span><span style="color: #93a1a1; ">);</span></pre><figcaption style="display: block; padding-top: 0.25em; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 12px; ">W3C DOM Leaval 2通用语法</figcaption></figure><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">尽管这个方法看起来比之前那个方法复杂了一点，但是那些额外的代码还是有必要打出来的。对于DOM级别2的事件最大的好处就是一个事件可以注册许多处理器。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">addEventlistener的头两个参数是目标对象和事件，不仅如此，函数最后一个参数，可以指定处理器是在捕获阶段还是冒泡阶段被触发（通过设置&#8221;addEventListener()&#8221;函数的第三个参数来指定 &#8211; true表示在捕获阶段，false表示在冒泡阶段）</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">接下来将针对W3C DOM Leavl 2事件进行讨论。</p></section><section style="display: block; "><h2>事件在文档中被传递的两种模型</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">W3C DOM Leavl 2事件流包括三个阶段：事件捕获阶段、处于目标简短和事件冒泡阶段。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">首先我们了解下事件冒泡和事件捕获。</p><section style="display: block; "><h3>事件冒泡</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">在页面上有多个事件，也可以多个元素响应同一个事件。假设网页上有两个元素，其中一个元素嵌套在另一个元素中，并且都被绑定了 click 事件，同时 body 也绑定了 click 事件，如下：</p><figure style="display: block; margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #999999; font: normal normal normal 14px/22px Georgia, 'Times New Roman', serif; color: #565656; "><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span style="color: #48484c; ">js</span><span style="color: #93a1a1; ">代码如下：</span></p><span style="color: #48484c; "> window</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">onload </span><span style="color: #93a1a1; ">=</span> <span style="color: #1e347b; ">function</span><span style="color: #93a1a1; ">(){</span> <span style="color: #1e347b; ">var</span><span style="color: #48484c; "> oBubble </span><span style="color: #93a1a1; ">=</span><span style="color: #48484c; "> document</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">getElementById</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">"oBubble"</span><span style="color: #93a1a1; ">);</span> <span style="color: #1e347b; ">var</span><span style="color: #48484c; "> oBubble1 </span><span style="color: #93a1a1; ">=</span><span style="color: #48484c; "> document</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">getElementById</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">"oBubble1"</span><span style="color: #93a1a1; ">);</span> <span style="color: #1e347b; ">var</span><span style="color: #48484c; "> oBubble2 </span><span style="color: #93a1a1; ">=</span><span style="color: #48484c; "> document</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">getElementById</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">"oBubble2"</span><span style="color: #93a1a1; ">);</span><span style="color: #48484c; ">     oBubble</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">onclick </span><span style="color: #93a1a1; ">=</span> <span style="color: #1e347b; ">function</span><span style="color: #93a1a1; ">(){</span><span style="color: #48484c; ">         alert</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">"Bubble"</span><span style="color: #93a1a1; ">)</span> <span style="color: #93a1a1; ">}</span><span style="color: #48484c; ">     oBubble1</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">onclick </span><span style="color: #93a1a1; ">=</span> <span style="color: #1e347b; ">function</span><span style="color: #93a1a1; ">(){</span><span style="color: #48484c; ">         alert</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">"Bubble1"</span><span style="color: #93a1a1; ">)</span> <span style="color: #93a1a1; ">}</span><span style="color: #48484c; ">     oBubble2</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">onclick </span><span style="color: #93a1a1; ">=</span> <span style="color: #1e347b; ">function</span><span style="color: #93a1a1; ">(){</span><span style="color: #48484c; ">         alert</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">"Bubble2"</span><span style="color: #93a1a1; ">)</span> <span style="color: #93a1a1; ">}</span><span style="color: #48484c; "> </span><span style="color: #93a1a1; ">}</span></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">html代码如下：</p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #1e347b; ">&lt;body</span> <span style="color: #1e347b; ">id</span><span style="color: #93a1a1; ">=</span><span style="color: #dd1144; ">"oBubble"</span><span style="color: #1e347b; ">&gt;</span><span style="color: #48484c; ">//点击#oBubble弹出Bubble     </span><span style="color: #1e347b; ">&lt;div</span> <span style="color: #1e347b; ">id</span><span style="color: #93a1a1; ">=</span><span style="color: #dd1144; ">"oBubble1"</span><span style="color: #1e347b; ">&gt;</span><span style="color: #48484c; ">//点击#oBubble1先后弹出Bubble1、Bubble         </span><span style="color: #1e347b; ">&lt;span</span> <span style="color: #1e347b; ">id</span><span style="color: #93a1a1; ">=</span><span style="color: #dd1144; ">"oBubble2"</span><span style="color: #1e347b; ">&gt;</span><span style="color: #48484c; ">oBubble</span><span style="color: #1e347b; ">&lt;/span&gt;</span><span style="color: #48484c; ">//点击#oBubble2先后弹出Bubble2 、Bubble1、Bubble     </span><span style="color: #1e347b; ">&lt;/div&gt;</span><span style="color: #48484c; "> </span><span style="color: #1e347b; ">&lt;/body&gt;</span></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">事件顺序：span&#8594;div&#8594;body，如下图所示：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><img src="http://www.html5jscss.com/pic/htmljscss/bubble.png" data-original="/pic/htmljscss/bubble.png" alt="JavaScript欲速则不达&#8212;&#8212;基本处理事件详解和阻止事件传播" width="410" height="390" style="max-width: 590px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; vertical-align: middle; padding-top: 1.5em; padding-right: 1.5em; padding-bottom: 1.5em; padding-left: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; " /><br /><ficaption>事件冒泡实例图例</ficaption><br /></p></figure><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">很明显，每个元素都会按照（inside&#8594;outside）的冒泡型事件，所以事件冒泡会引起预料之外的效果。事件冒泡是IE-DOM处理事件对象的方法。</p></section><section style="display: block; "><h3>事件捕获</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">事件捕获和事件冒泡是刚好相反的两个过程，事件捕获是按照（outside&#8594;inside）的冒泡型事件开始触发。因此拿以上冒泡例子，alert信息是跟事件冒泡完全相反的顺序。</p></section><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">一些注意事项：</p><ol style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; line-height: 2em; "><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">W3C DOM Leavl 2标准的addEventListener方法执行事件的顺序是按照事件注册的顺序执行的。而IE的attachEvent方法则相反&#8211;后注册的事件先觖发，先注册的事件后触发。</li><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">W3C DOM Leavl 2标准的浏览器文本节点也会冒泡，而IE内核的浏览器文本节点不会冒泡。</li><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">W3C DOM Leavl 2浏览器事件对象与IE内核的浏览器事件不同(<a href="http://www.quirksmode.org/js/introevents.html" target="_blank" rel="external nofollow" style="cursor: pointer; text-decoration: underline; color: #0059b3; -webkit-transition-property: color, background-color; -webkit-transition-duration: 0.4s, 0.4s; -webkit-transition-timing-function: ease, ease; -webkit-transition-delay: 0.3s, 0.2s; ">具体请参阅</a>)。</li><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">DOM标准的浏览器事件卸载方式与IE内核的事件卸载方式不同。</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">接下来我们就来解决跨浏览器的事件处理的方案。</p></section><section style="display: block; "><h2>跨浏览器的事件处理函数</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">前面我们介绍了事件冒泡和事件捕获两种事件事件获取方式，而W3C模型 是两者中和。就是事件发生时，先从顶层开始进行事件捕获，直到事件触发到达了事件源元素。然后，再从事件源往上进行事件冒泡，直到到达document。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">利用W3C DOM Leavl 2事件监听器，就是 addEventListener函数。我们可以自己选择绑定事件时采用事件捕获还是事件冒泡，方法就是绑定事件时通过addEventListener函数，上面我们介绍过它的三个参数了:如果第三个参数若是true，则表示采用事件捕获，若是false，则表示采用事件冒泡。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">但是在一个支持W3C DOM的浏览器中，按照DOM Leavl 1绑定事件方式，采用的全都是事件冒泡方式。大多数时候，我们也是希望事件从内部嵌套的的元素冒泡到外围元素。</p><section style="display: block; "><h3>解决方案</h3><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">以上我们介绍过 W3C DOM Leaval 2事件绑定中的addEventlistener，可以为元素添加多个事件,而且最后一个参数还支持事件冒泡或捕获，<em style="font-style: italic; ">IE6/7/8仍然没有遵循标准而使用了自己专有的attachEvent，且不支持事件捕获，所有事件都是发生在冒泡阶段。</em></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">所以创建一个可重用。实现了DOM Leavl 2事件处理的事件处理函数，但是，它还是要跨浏览器。如下经典代码</p><figure style="display: block; margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #999999; font: normal normal normal 14px/22px Georgia, 'Times New Roman', serif; color: #565656; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">listenEvent函数代码</p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #1e347b; ">function</span><span style="color: #48484c; "> listenEvent</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventTarget</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; "> eventType</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; "> evrntHandler</span><span style="color: #93a1a1; ">)</span> <span style="color: #93a1a1; ">{</span> <span style="color: #1e347b; ">if</span> <span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventTarget</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">addEventListener</span><span style="color: #93a1a1; ">){</span><span style="color: #48484c; ">         eventTarget</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">addEventListener</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventType</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; "> evrntHandler</span><span style="color: #93a1a1; ">,</span> <span style="color: #1e347b; ">true</span><span style="color: #93a1a1; ">);</span><span style="color: #93a1a1; ">//IE9等其他现代浏览器</span> <span style="color: #93a1a1; ">}</span> <span style="color: #1e347b; ">else</span> <span style="color: #1e347b; ">if</span> <span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventTarget</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">attachEvent</span><span style="color: #93a1a1; ">){</span><span style="color: #48484c; ">         eventType </span><span style="color: #93a1a1; ">=</span> <span style="color: #dd1144; ">"on"</span><span style="color: #93a1a1; ">+</span><span style="color: #48484c; ">eventType</span><span style="color: #93a1a1; ">;</span><span style="color: #48484c; ">         eventTarget</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">attachEvent</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventType</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; ">evrntHandler</span><span style="color: #93a1a1; ">)</span> <span style="color: #93a1a1; ">//IE6、7、8</span> <span style="color: #93a1a1; ">}</span> <span style="color: #1e347b; ">else</span> <span style="color: #93a1a1; ">{</span><span style="color: #48484c; ">eventTarget</span><span style="color: #93a1a1; ">[</span><span style="color: #dd1144; ">"on"</span> <span style="color: #93a1a1; ">+</span><span style="color: #48484c; "> eventType</span><span style="color: #93a1a1; ">]</span> <span style="color: #93a1a1; ">=</span><span style="color: #48484c; "> evrntHandler</span><span style="color: #93a1a1; ">;}</span><span style="color: #93a1a1; ">//IE5~ 个人觉得不写也罢。</span><span style="color: #48484c; "> </span><span style="color: #93a1a1; ">}</span></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">listenEvent函数使用</p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #48484c; ">listenEvent</span><span style="color: #93a1a1; ">（</span><span style="color: #48484c; ">document</span><span style="color: #93a1a1; ">,</span><span style="color: #dd1144; ">"click"</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; ">processClick</span><span style="color: #93a1a1; ">）</span></pre><figcaption style="display: block; padding-top: 0.25em; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 12px; ">可重用的事件处理函数</figcaption></figure><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">此处理函数接受3个函数：目标对象、事件（作为一个字符串），以及函数名称。首先测试对象，看看它是否支持addEventListener(W3C DOM Leaval 2的事件监听方法),如果支持这个方法，就把事件映射到事件处理函数。回到代码，因为IE6、7、8不支持addEventListener，所以检查是否支持attachEvent，记得前面加&#8221;on&#8220;，因为不加&#8221;on&#8220;只是事件的名字，但是因为IE6、7、8只支持向上冒泡，所以此方案中 addEventListener的第三个参数是false。最后为了兼容DOM leaval 0事件处理，还要加最后一行代码。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">使用W3C DOM Leavl 2处理事件事件监听不会有覆盖之前绑定事件的现象，每个绑定的事件都会被执行，<em style="font-style: italic; ">不过 attachEvent 为元素增加的一系列事件不是以添加它们顺序执行的，而是以相反的顺序触发</em>。最重要的是，采用事件监听给对象绑定方法后，可以解除相应的绑定。跟以上代码类似，removeEventListener跟addEventListener对应，detachEvent跟eventType对应，得到如下解决方案：</p><figure style="display: block; margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #999999; font: normal normal normal 14px/22px Georgia, 'Times New Roman', serif; color: #565656; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">stopListening函数代码</p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #1e347b; ">function</span><span style="color: #48484c; "> stopListening</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventTarget</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; "> eventType</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; "> evrntHandler</span><span style="color: #93a1a1; ">)</span> <span style="color: #93a1a1; ">{</span> <span style="color: #1e347b; ">if</span> <span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventTarget</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">removeEventListener</span><span style="color: #93a1a1; ">){</span><span style="color: #48484c; ">         eventTarget</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">removeEventListener</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventType</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; "> evrntHandler</span><span style="color: #93a1a1; ">,</span> <span style="color: #1e347b; ">true</span><span style="color: #93a1a1; ">);</span><span style="color: #93a1a1; ">//IE9等其他现代浏览器</span> <span style="color: #93a1a1; ">}</span> <span style="color: #1e347b; ">else</span> <span style="color: #1e347b; ">if</span> <span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventTarget</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">attachEvent</span><span style="color: #93a1a1; ">){</span><span style="color: #48484c; ">         detachEvent </span><span style="color: #93a1a1; ">=</span> <span style="color: #dd1144; ">"on"</span><span style="color: #93a1a1; ">+</span><span style="color: #48484c; ">eventType</span><span style="color: #93a1a1; ">;</span><span style="color: #48484c; ">         eventTarget</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">detachEvent</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">eventType</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; ">evrntHandler</span><span style="color: #93a1a1; ">)</span> <span style="color: #93a1a1; ">//IE6、7、8</span> <span style="color: #93a1a1; ">}</span> <span style="color: #1e347b; ">else</span> <span style="color: #93a1a1; ">{</span><span style="color: #48484c; ">eventTarget</span><span style="color: #93a1a1; ">[</span><span style="color: #dd1144; ">"on"</span> <span style="color: #93a1a1; ">+</span><span style="color: #48484c; "> eventType</span><span style="color: #93a1a1; ">]</span> <span style="color: #93a1a1; ">=</span> <span style="color: #1e347b; ">null</span><span style="color: #93a1a1; ">;}</span><span style="color: #93a1a1; ">//IE5~</span><span style="color: #48484c; "> </span><span style="color: #93a1a1; ">}</span></pre><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #48484c; ">stopListening</span><span style="color: #93a1a1; ">（</span><span style="color: #48484c; ">document</span><span style="color: #93a1a1; ">,</span><span style="color: #dd1144; ">"click"</span><span style="color: #93a1a1; ">,</span><span style="color: #48484c; ">processClick</span><span style="color: #93a1a1; ">）</span></pre><figcaption style="display: block; padding-top: 0.25em; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 12px; ">可重用的事件处理函数</figcaption></figure><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">在DOM标准的事件卸载方式中需要注意的是：<strong style="color: #1f991f; ">事件捕获的参数。如果你的事件是注册在捕获阶段，则卸载事件时，必须将其指定为捕获阶段(true)，否则无法卸载；如果你的事件注册在注册在冒泡阶段，则必须将其指定为冒泡阶段(false)，否则同样无法卸载。</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">现在，如果我们想停止监听一个事件，可以直接调用stopListening，同样传入3个参数：目标对象、事件和事件处理函数。</p></section></section><section style="display: block; "><h2>阻止冒泡</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">因为大部分浏览器都是按照DOM Leavl 1绑定事件方式，采用的全都是事件冒泡方式。所以阻止事件冒泡（嵌套元素中传播）是很有必要的。如下方案：</p><figure style="display: block; margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #999999; font: normal normal normal 14px/22px Georgia, 'Times New Roman', serif; color: #565656; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">阻止冒泡方案：</p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #1e347b; ">function</span><span style="color: #48484c; "> cancelPropagation </span><span style="color: #93a1a1; ">(</span><span style="color: #1e347b; ">event</span><span style="color: #93a1a1; ">){</span> <span style="color: #1e347b; ">event</span> <span style="color: #93a1a1; ">=</span><span style="color: #48484c; "> window</span><span style="color: #93a1a1; ">.</span><span style="color: #1e347b; ">event</span><span style="color: #93a1a1; ">||</span><span style="color: #1e347b; ">event</span><span style="color: #93a1a1; ">;</span> <span style="color: #1e347b; ">if</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; "> document</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">all</span><span style="color: #93a1a1; ">){</span> <span style="color: #1e347b; ">event</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">cancelBubble </span><span style="color: #93a1a1; ">=</span> <span style="color: #1e347b; ">true</span><span style="color: #93a1a1; ">;</span> <span style="color: #93a1a1; ">}</span><span style="color: #1e347b; ">else</span><span style="color: #93a1a1; ">{</span> <span style="color: #1e347b; ">event</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">stopPropagation</span><span style="color: #93a1a1; ">();</span> <span style="color: #93a1a1; ">}</span><span style="color: #48484c; "> </span><span style="color: #93a1a1; ">}</span></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">stopListening函数使用</p><pre style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cacac8; border-right-color: #cacac8; border-bottom-color: #cacac8; border-left-color: #cacac8; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; color: #dd1144; text-shadow: #ffffff 0px 1px 0px; border-top-left-radius: 4px 4px; border-top-right-radius: 4px 4px; border-bottom-right-radius: 4px 4px; border-bottom-left-radius: 4px 4px; display: block; margin-top: 1em; margin-right: 1em; margin-bottom: 1em; margin-left: 1em; padding-top: 0.5em; padding-right: 0.8em; padding-bottom: 0.5em; padding-left: 0.8em; line-height: 18px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: #f5f5d7; background-size: 3em 3em; background-origin: content-box; "><span style="color: #93a1a1; ">//这里我们采用上面介绍过的事件处理函数 listenEvent 函数</span><span style="color: #48484c; "> listenEvent</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">document</span><span style="color: #93a1a1; ">.</span><span style="color: #48484c; ">getElementById</span><span style="color: #93a1a1; ">(</span><span style="color: #dd1144; ">"oBubble2"</span><span style="color: #93a1a1; ">),</span><span style="color: #dd1144; ">"click"</span><span style="color: #93a1a1; ">,</span><span style="color: #1e347b; ">function</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">evt</span><span style="color: #93a1a1; ">){</span><span style="color: #48484c; ">     cancelPropagation</span><span style="color: #93a1a1; ">(</span><span style="color: #48484c; ">evt</span><span style="color: #93a1a1; ">);</span><span style="color: #48484c; "> </span><span style="color: #93a1a1; ">})</span></pre><figcaption style="display: block; padding-top: 0.25em; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 12px; ">阻止冒泡</figcaption></figure><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">因为IE8、7、6不支持W3C DOM Leavel 2不支持，那么我们就设置event.cancelBubble 的属性值为 true;而支持其他现代浏览器则使用W3C DOM Leavel 2的，则调用stopPropagation方法。</p></section><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">最后罗列文章中出现的几个Event方法</p><ol style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; line-height: 2em; "><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">W3C DOM Leavl 2绑定和解除事件的方法：addEventListener和removeEventListener：</li><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">IE绑定和解除事件的方法：attachEvent和detachEvent</li><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">取消事件：W3C DOM Leavl 2使用preventDefault()，iE直接返回false</li><li style="list-style-type: decimal; list-style-position: inside; list-style-image: initial; ">阻止事件在嵌套函数中传播（阻止冒泡和捕获）：W3C DOM Leavl 2使用stopPropagation()，IE中cancelBubble返回true</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">本文出现所有DEMO下载：<a href="http://www.html5jscss.com/lab/uploads/js-attachEvent.rar" style="cursor: pointer; text-decoration: underline; color: #0059b3; -webkit-transition-property: color, background-color; -webkit-transition-duration: 0.4s, 0.4s; -webkit-transition-timing-function: ease, ease; -webkit-transition-delay: 0.3s, 0.2s; ">js-attachEvent.rar</a></p></section></span></div><img src ="http://www.blogjava.net/jjshcc/aggbug/404743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2013-10-08 13:12 <a href="http://www.blogjava.net/jjshcc/archive/2013/10/08/404743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript的eval(“{JSON object string}”)问题</title><link>http://www.blogjava.net/jjshcc/archive/2013/10/08/404742.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 08 Oct 2013 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2013/10/08/404742.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/404742.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2013/10/08/404742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/404742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/404742.html</trackback:ping><description><![CDATA[<div><span style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 24px; font-size: 13px; color: #333333; "><div id="cnblogs_post_body" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><p style="margin-top: 10px !important; margin-right: auto !important; margin-bottom: 10px !important; margin-left: auto !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">在做<a href="http://baike.baidu.com/view/1641.htm" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333; ">AJAX</a>应用开发的时候，我们通常喜欢把服务器端返回的<a href="http://baike.baidu.com/view/136475.htm" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333; ">JSON</a>格式字符串在客户端的回调函数中把它作为JavaScript代码执行并用一个变量保存起来，以方便使用返回的数据。通常的做法就是var jsonData = eval(xmlHttp.responseText)。这看起来似乎一切都是正确的，但当你运行代码的时候，你会发现报&#8220;invalid labe&#8221;错误了。为什么？我也不清楚，但我找到了解决这个问题的方法。</p><p style="margin-top: 10px !important; margin-right: auto !important; margin-bottom: 10px !important; margin-left: auto !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">在我刚遇到这个问题的时候也特别头痛，因为看起来所有编码是正确的，为了测试出现问题的位置，我逐渐缩小代码范围，最终得到如下简短代码：</p><div style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; background-color: #f5f5f5; font-family: 'Courier New' !important; font-size: 12px !important; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; overflow-x: auto; overflow-y: auto; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #0000ff; ">var</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;jsonStr1&nbsp;</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">=</span>&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">{"Name":"Tom","Sex":"Man"}</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #0000ff; ">var</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;jsonObj1&nbsp;</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">=</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;eval(jsonStr1);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />alert(jsonObj1.Name);</span></div><p style="margin-top: 10px !important; margin-right: auto !important; margin-bottom: 10px !important; margin-left: auto !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">以上代码执行正是报一开始说的invalid labe错误。难道eval函数对某些表达式或对象有限制？于是我又测试了数组对象，代码如下，结果下面代码运行很正常：</p><div style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; background-color: #f5f5f5; font-family: 'Courier New' !important; font-size: 12px !important; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; overflow-x: auto; overflow-y: auto; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #0000ff; ">var</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;arrStr&nbsp;</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">=</span>&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">["Tom","Man"]</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #0000ff; ">var</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;arrObj&nbsp;</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">=</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;eval(arrStr);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />alert(arrObj[</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">0</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">]);</span></div><p style="margin-top: 10px !important; margin-right: auto !important; margin-bottom: 10px !important; margin-left: auto !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">难道是我机子上的JavaScript解析器就JSON解析方面出了问题，于是我又测试下面代码，但结果一样正常：</p><div style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; background-color: #f5f5f5; font-family: 'Courier New' !important; font-size: 12px !important; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; overflow-x: auto; overflow-y: auto; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #0000ff; ">var</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;jsonObj&nbsp;</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">=</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;{</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">"</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">Name</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">"</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">:</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">"</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">Tom</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">"</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">,</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">"</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">Sex</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">"</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">:</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">"</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">Man</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">"</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">};<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />alert(jsonObj.Name);</span></div><p style="margin-top: 10px !important; margin-right: auto !important; margin-bottom: 10px !important; margin-left: auto !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">最终我还是没有自行把问题解决，于是根据相关错误信息上网搜索答案，没想到一下子就找到了问题的根源，解决办法就是<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: red; ">&#8220;在eval的时候，要先把 JSON字符串值用 &#8216;()&#8217;括号先括起来&#8221;</strong>。网上找的资料都没有说明是什么原因，当然我也还是没有明白正真的原因的。括号是起强制先执行或先运算作用的，返回的JSON就一个完整的对象，中间也没有表达式，为什么还要加括号！像数组这种较复杂点的对象也能正常eval。没办法，就先记着这种用法吧。正确用法如下（注意看eval两端的括号）：</p><div style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; background-color: #f5f5f5; font-family: 'Courier New' !important; font-size: 12px !important; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; overflow-x: auto; overflow-y: auto; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #0000ff; ">var</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;jsonStr2&nbsp;</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">=</span>&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">{"Name":"Tom","Sex":"Man"}</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #0000ff; ">var</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;jsonObj2&nbsp;</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">=</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;eval(</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: red; ">(</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span>&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">+</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">&nbsp;jsonStr2&nbsp;</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">+</span>&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: red; ">)</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">'</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; ">);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />alert(jsonObj2.Name);</span></div><div><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Courier New' !important; font-size: 12px !important; line-height: 1.5 !important; color: #000000; "><br /></span></div></div></span></div><img src ="http://www.blogjava.net/jjshcc/aggbug/404742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2013-10-08 12:56 <a href="http://www.blogjava.net/jjshcc/archive/2013/10/08/404742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript事件冒泡简介及应用</title><link>http://www.blogjava.net/jjshcc/archive/2013/10/08/404741.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 08 Oct 2013 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2013/10/08/404741.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/404741.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2013/10/08/404741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/404741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/404741.html</trackback:ping><description><![CDATA[<div><div>一、什么是事件冒泡</div><div></div><div>在一个对象上触发某类事件（比如单击onclick事件），如果此对象定义了此事件的处理程序，那么此事件就会调用这个处理程序，如果没有定义此事件处理程序或者事件返回true，那么这个事件会向这个对象的父级对象传播，从里到外，直至它被处理（父级对象所有同类事件都将被激活），或者它到达了对象层次的最顶层，即document对象（有些浏览器是window）。</div><div></div><div>打个比方说：你在地方法院要上诉一件案子，如果地方没有处理此类案件的法院，地方相关部门会帮你继续往上级法院上诉，比如从市级到省级，直至到中央法院，最终使你的案件得以处理。</div><div></div><div>二、事件冒泡有什么作用</div><div></div><div><strong style="color: red; ">（1）事件<span style="color: red; "><strong>冒泡允许多个操作被集中处理</strong></span><span style="color: red; "><strong>（把事件处理器添加到一个父级元素上，避免把事件处理器添加到多个子级元素上）</strong></span></strong>，它还可以让你在对象层的不同级别捕获事件。</div><div></div><div>【集中处理例子】</div><div></div><div></div><div>&lt;div onclick="eventHandle(event)" id="outSide" style="width:100px; height:100px; background:#000; padding:50px"&gt;</div><div>&lt;div id="inSide" style="width:100px; height:100px; background:#CCC"&gt;&lt;/div&gt;</div><div>&lt;/div&gt;</div><div>&lt;script type="text/javascript"&gt;</div><div>//本例子只在外面盒子定义了处理方法，而这个方法一样可以捕获到子元素点击行为并处理它。假设有成千上万子元素要处理，难道我们要为每个元素加&#8220;onclick="eventHandle(event)"&#8221;？显然没有这种集中处理的方法来的简单，同时它的性能也是更高的。</div><div>function eventHandle(e)</div><div>{</div><div>&nbsp;&nbsp; &nbsp;var e=e||window.event;</div><div>&nbsp;&nbsp; &nbsp;var obj=e.target||e.srcElement;</div><div>&nbsp;&nbsp; &nbsp;alert(obj.id+' was click')</div><div>}</div><div>&lt;/script&gt;</div><div></div><div><span style="color: red; ">（</span><span style="color: red; "><strong>2）让不同的对象同时捕获同一事件，并调用自己的专属处理程序做自己的事情</strong></span>，就像老板一下命令，各自员工做自己岗位上的工作去了。</div><div></div><div>【同时捕获同一事件例子】</div><div></div><div></div><div>&lt;div onclick="outSideWork()" id="outSide" style="width:100px; height:100px; background:#000; padding:50px"&gt;</div><div>&lt;div onclick="inSideWork()" id="inSide" style="width:100px; height:100px; background:#CCC"&gt;&lt;/div&gt;</div><div>&lt;/div&gt;</div><div>&lt;script type="text/javascript"&gt;</div><div>function outSideWork()</div><div>{</div><div>&nbsp;&nbsp; &nbsp;alert('My name is outSide,I was working...');</div><div>}</div><div></div><div>function inSideWork()</div><div>{</div><div>&nbsp;&nbsp; &nbsp;alert('My name is inSide,I was working...');</div><div>}</div><div></div><div>//因为下面程序自动激活单击事件，有些浏览器不允许，所以请单击灰色盒子，从这里开始下命令，这样因为冒泡的原因，黑色大盒子也会收到单击事件，并调用了自己的处理程序。如果还有更多盒子嵌套，一样道理。</div><div></div><div>/*</div><div>function bossOrder()</div><div>{</div><div>&nbsp;&nbsp; &nbsp;document.getElmentById('inSide').click();</div><div>}</div><div>bossOrder();</div><div>*/</div><div>&lt;/script&gt;</div><div></div><div>三、需要注意什么</div><div></div><div>&#9679;事件捕获其实有三种方式，事件冒泡只是其中的一种：（1）IE从里到外（inside&#8594;outside）的冒泡型事件。（2）Netscape4.0从外到里（outside&#8594;inside）的捕获型事件。（3）DOM事件流，先从外到里，再从里到外回到原点（outside&#8594;inside&#8594;outside）的事件捕获方法（似乎对象将触发两次事件处理，这有什么作用？鄙人不懂！）。</div><div></div><div>&#9679;不是所有的事件都能冒泡。以下事件不冒泡：blur、focus、load、unload。</div><div></div><div>&#9679;事件捕获方式在不同浏览器，甚至同种浏览器的不同版本中是有所区别的。如Netscape4.0采用捕获型事件解决方案，其它多数浏览器则支持冒泡型事件解决方案，另外DOM事件流还支持文本节点事件冒泡。</div><div></div><div>&#9679;事件捕获到达顶层的目标在不同浏览器或不同浏览器版本也是有区别的。在IE6中HTML是接收事件冒泡的，另外大部分浏览器将冒泡延续到window对象，即&#8230;&#8230;body&#8594;documen&#8594;window。</div><div></div><div>&#9679;阻止冒泡并不能阻止对象默认行为。比如submit按钮被点击后会提交表单数据，这种行为无须我们写程序定制。</div><div></div><div><span style="color: #ff0000; "><strong>四、阻止事件冒泡</strong></span></div><div></div><div>通常情况下我们都是一步到位，明确自己的事件触发源，并不希望浏览器自作聪明、漫无目的地去帮我们找合适的事件处理程序，即我们明确最精准目标，这种情况下我们不需要事件冒泡。另外通过对事件冒泡的理解，我们知道程序将做多较多额外的事情，这必然增大程序开销。还有一个重要的问题是：事件冒泡处理可能会激活我们本来不想激活的事件，导致程序错乱，甚至无从下手调试，这常成为对事件冒泡不熟悉程序员的棘手问题。所以必要时，我们要阻止事件冒泡。</div><div></div><div>【不想激活的事件被激活例子】</div><div></div><div></div><div>&lt;div onclick="openWin('http://www.baidu.com')" id="outSide" style="width:100px; height:100px; background:#000; padding:50px"&gt;</div><div>&lt;div onclick="openWin('http://www.google.com')" id="inSide" style="width:100px; height:100px; background:#CCC"&gt;&lt;/div&gt;</div><div>&lt;/div&gt;</div><div></div><div>&lt;script type="text/javascript"&gt;</div><div>//本例你实际希望点击灰色盒子打开google首页，而点击黑色盒子打开baidu首页，但结果你点击灰色盒子的时候，却是同时打开了两个网页。其实在实际设计中较少遇到此问题，你可能会想如果我在页面不同DOM深处安置了不同的按钮或链接，深层处的事件触发会不会波及顶层的按钮呢？不会，因为按钮不能形成嵌套关系。</div><div>function openWin(url)</div><div>{</div><div>&nbsp;&nbsp; &nbsp;window.open(url);</div><div>}</div><div>&lt;/script&gt;</div><div></div><div>下面是本人在网上抄的一个方法，<span style="color: #ff0000; "><strong>把这个方法放在精准目标对象处理程序结尾，本事件触发处理结束后，事件将不在进行冒泡处理。</strong></span></div><div></div><div>【阻止事件冒泡例子】</div><div></div><div></div><div>&lt;div onclick="showMsg(this,event)" id="outSide" style="width:100px; height:100px; background:#000; padding:50px"&gt;</div><div>&lt;div onclick="showMsg(this,event)" id="inSide" style="width:100px; height:100px; background:#CCC"&gt;&lt;/div&gt;</div><div>&lt;/div&gt;</div><div>&lt;script type="text/javascript"&gt;</div><div>//阻止事件冒泡后，你点击灰色盒子，整个过程只弹一次对话框了（注意与默认情况对比）</div><div>function showMsg(obj,e)</div><div>{</div><div>&nbsp;&nbsp; &nbsp;alert(obj.id);</div><div>&nbsp;&nbsp; &nbsp;stopBubble(e)</div><div>}</div><div></div><div>//阻止事件冒泡函数</div><div>function stopBubble(e)</div><div>{</div><div>&nbsp;&nbsp; &nbsp;if (e &amp;&amp; e.stopPropagation)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;e.stopPropagation()</div><div>&nbsp;&nbsp; &nbsp;else</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;window.event.cancelBubble=true</div><div>}</div><div>&lt;/script&gt;</div></div><div></div><img src ="http://www.blogjava.net/jjshcc/aggbug/404741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2013-10-08 12:50 <a href="http://www.blogjava.net/jjshcc/archive/2013/10/08/404741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JavaScript中实现高效的StringBuffer</title><link>http://www.blogjava.net/jjshcc/archive/2013/10/08/404717.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 08 Oct 2013 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2013/10/08/404717.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/404717.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2013/10/08/404717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/404717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/404717.html</trackback:ping><description><![CDATA[<div><div>JavaScript中的String是只读的，所以每次对String变量的操作都会在内存中产生一个零时变量，如果要对字符串进行大量的重复操作，性能和效率都会很低下，因此常用数组的方法操作字符串，即先把字符串都存储在数组中，然后使用join()方法连接字符串。</div><div></div><div>当然可以把这种方法再演变一下，在JavaScript中模拟StringBuffer类。</div><div></div><div>&lt;script type="text/javascript"&gt;</div><div>&nbsp;&nbsp; &nbsp;function StringBuffer(){</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this._Strings = new Array();</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;StringBuffer.prototype = {</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;append : function(str){</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._Strings.push(str);</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;},</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;toString : function(){</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return this._Strings.join(",");</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;}</div><div>&nbsp;&nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp;var myvar = new StringBuffer();</div><div>&nbsp;&nbsp; &nbsp;myvar.append("a");</div><div>&nbsp;&nbsp; &nbsp;myvar.append("b");</div><div>&nbsp;&nbsp; &nbsp;myvar.append("c");</div><div>&nbsp;&nbsp; &nbsp;myvar.append("d");</div><div>&nbsp;&nbsp; &nbsp;myvar.append("e");</div><div>&nbsp;&nbsp; &nbsp;alert(myvar.toString());</div><div>&lt;/script&gt;</div><div>可以把这种方法和原始的直接操作String的方法进行对比，会发现效率提高了很多。（注意：要在IE里面进行比较，在firefox里的效率是差不多的）</div></div><img src ="http://www.blogjava.net/jjshcc/aggbug/404717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2013-10-08 09:50 <a href="http://www.blogjava.net/jjshcc/archive/2013/10/08/404717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript--对象冒充实现继承</title><link>http://www.blogjava.net/jjshcc/archive/2012/12/25/393435.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 25 Dec 2012 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2012/12/25/393435.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/393435.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2012/12/25/393435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/393435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/393435.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">原理:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">构造函数使用this关键字给所有属性和方法赋值.因为构造函数只是一个函数,所以可使ClassA的构造方法称为ClassB的方法,然后调用它.</p><p style="margin-top: 10px; margin-bottom: 10px;">ClassB就会收到ClassA的构造方法中定义的属性和方法.</p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">例子:</p><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function ClassA(name){             <span style="color: #0000ff;">this</span>.name=name;             <span style="color: #0000ff;">this</span>.getName=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.name;             }         }                  function ClassB(name,password){             <span style="color: #0000ff;">this</span>.ClassA=ClassA;             <span style="color: #0000ff;">this</span>.ClassA(name);             delete <span style="color: #0000ff;">this</span>.ClassA;                          <span style="color: #0000ff;">this</span>.password=password;             <span style="color: #0000ff;">this</span>.getPassword=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.password;             }         }                  var b =<span style="color: #0000ff;">new</span> ClassB('wwww','1123');         document.write(b.getName());</pre><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">经过调试,我们可以看到:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;"><a href="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image.png" atomicselection="true" style="color: #78afd3;"><img border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_thumb.png" width="697" height="130" style="border: 0px; margin-left: 2em; margin-top: 2px; margin-bottom: 2px;" /></a></p><p style="margin-top: 10px; margin-bottom: 10px;">变量b中已经包含了ClassA中定义的方法.</p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">代码理解:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">在ClassB中,<span style="color: #0000ff;">this</span>.ClassA(name)等价于以下代码:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">this</span>.name=name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">this</span>.getName=function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span>&nbsp;<span style="color: #0000ff;">this</span>.name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin-top: 10px; margin-bottom: 10px;">即:将ClassA函数中的代码复制过来,即:ClassB中的代码如下:</p></blockquote><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function ClassB(name,password){             <span style="color: #0000ff;">this</span>.ClassA=ClassA;                          <span style="color: #0000ff;">this</span>.name=name;             <span style="color: #0000ff;">this</span>.getName=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.name;             }                          delete <span style="color: #0000ff;">this</span>.ClassA;                          <span style="color: #0000ff;">this</span>.password=password;             <span style="color: #0000ff;">this</span>.getPassword=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.password;             }         }</pre><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">然后通过delete this.ClassA之后,ClassB中的实际代码如下:</p></blockquote><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function ClassB(name,password){             <span style="color: #0000ff;">this</span>.name=name;             <span style="color: #0000ff;">this</span>.getName=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.name;             }                          <span style="color: #0000ff;">this</span>.password=password;             <span style="color: #0000ff;">this</span>.getPassword=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.password;             }         }</pre><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">从而实现了对象冒充.</p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">注意:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">对象冒充可以支持多重继承,也就是说一个类可以继承多个类.例子如下:</p></blockquote><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function ClassC(){             <span style="color: #0000ff;">this</span>.ClassX=ClassX;             <span style="color: #0000ff;">this</span>.ClassX();             delete <span style="color: #0000ff;">this</span>.ClassX;                          <span style="color: #0000ff;">this</span>.ClassY=ClassY;             <span style="color: #0000ff;">this</span>.ClassY();             delete <span style="color: #0000ff;">this</span>.ClassY;         }</pre><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">这样就ClassC就实现了继承自ClassX,ClassY.但此处存在一个弊端:</p><p style="margin-top: 10px; margin-bottom: 10px;">若ClassX和ClassY中存在两个同名的变量或方法,则ClassY会覆盖ClassX中的变量或方法.</p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">此外:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">我们还可以通过call()和apply()方法实现对象冒充.</p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">对于call方法:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;"><strong>它的第一个参数用做this的对象,其他参数都直接传递给函数自身</strong>.我们来看下面这个小例子:</p></blockquote><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function ShowColor(param1,param2){             <span style="color: #0000ff;">this</span>.getColor=function(){                 document.write(<span style="color: #0000ff;">this</span>.color+"<span style="color: #8b0000;">&lt;br/&gt;Two Params : </span>"+param1+"<span style="color: #8b0000;"> ; </span>"+param2);             }         }                  var obj = <span style="color: #0000ff;">new</span> Object;         obj.color='Red';         ShowColor.call(obj,"<span style="color: #8b0000;">pm1</span>",'pm2');                  obj.getColor();</pre><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">运行此段代码后,我们发现页面上显示为:</p><p style="margin-top: 10px; margin-bottom: 10px;"><a href="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_1.png" atomicselection="true" style="color: #78afd3;"><img border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_thumb_1.png" width="235" height="64" style="border: 0px; margin-left: 2em; margin-top: 2px; margin-bottom: 2px;" /></a></p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">解释:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">ShowColor方法是在对象外定义的,调用call时,它将第一个参数,也就是将ClassA的this指向了obj,将后面的参数"pm1"传递给了param1,'pm2'传递给了param2.</p></blockquote><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        var obj = <span style="color: #0000ff;">new</span> Object;         obj.color='Red';         ShowColor.call(obj,"<span style="color: #8b0000;">pm1</span>",'pm2');</pre><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">也就实现了以下效果:</p></blockquote><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">我们将上面代码中的obj.color='Red'给注释起来,再运行代码,结果如下:</p></blockquote><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;"><a href="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_2.png" atomicselection="true" style="color: #78afd3;"><img border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_thumb_2.png" width="233" height="61" style="border: 0px; margin-left: 2em; margin-top: 2px; margin-bottom: 2px;" /></a></p></blockquote><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">原因是obj并没有color属性,而obj.getColor()方法中需要this.color,即obj.color,所以会出现undefined的结果.</p><p style="margin-top: 10px; margin-bottom: 10px;">我们再来看如何利用call来实现对象冒充,继续以刚才的ClassA,ClassB为例:</p></blockquote><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function ClassA(name){             <span style="color: #0000ff;">this</span>.name=name;             <span style="color: #0000ff;">this</span>.getName=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.name;             }                     }                  function ClassB(name,password){             <span style="color: #008000;">//this.ClassA=ClassA;</span>             <span style="color: #008000;">//this.ClassA(name);</span>             <span style="color: #008000;">//delete this.ClassA;</span>             ClassA.call(<span style="color: #0000ff;">this</span>,name);                          <span style="color: #0000ff;">this</span>.password=password;             <span style="color: #0000ff;">this</span>.getPassword=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.password;             }         }         var b = <span style="color: #0000ff;">new</span> ClassB('www','111');         b.getPassword();</pre><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">调试效果:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;"><a href="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_3.png" atomicselection="true" style="color: #78afd3;"><img border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_thumb_3.png" width="513" height="115" style="border: 0px; margin-left: 2em; margin-top: 2px; margin-bottom: 2px;" /></a></p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">解释:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">此处的ClassA.call(<span style="color: #0000ff;">this</span>,name); 即将ClassA的this指向了ClassB的this.从而实现了对象冒充.</p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">现在,我们再来看apply方法.</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;"><strong>apply方法有两个参数,用作this的对象和要传传递给函数的参数的数组.</strong></p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">例子:</p><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function ShowColor(param1,param2){             <span style="color: #0000ff;">this</span>.getColor=function(){                 document.write(<span style="color: #0000ff;">this</span>.color+"<span style="color: #8b0000;">&lt;br/&gt;Two Params : </span>"+param1+"<span style="color: #8b0000;"> ; </span>"+param2);             }         }                  var obj = <span style="color: #0000ff;">new</span> Object;         obj.color='Red';         ShowColor.apply(obj,<span style="color: #0000ff;">new</span> Array("<span style="color: #8b0000;">pm1</span>",'pm2'));                  obj.getColor();</pre><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">此方法可以被用于对象冒充:</p><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function ClassA(name){             <span style="color: #0000ff;">this</span>.name=name;             <span style="color: #0000ff;">this</span>.getName=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.name;             }                     }                  function ClassB(name,password){             <span style="color: #008000;">//this.ClassA=ClassA;</span>             <span style="color: #008000;">//this.ClassA(name);</span>             <span style="color: #008000;">//delete this.ClassA;</span>             ClassA.apply(<span style="color: #0000ff;">this</span>,<span style="color: #0000ff;">new</span> Array(name));                          <span style="color: #0000ff;">this</span>.password=password;             <span style="color: #0000ff;">this</span>.getPassword=function(){                 <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.password;             }         }                  var b = <span style="color: #0000ff;">new</span> ClassB('www','111');         b.getPassword();</pre><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">调试效果:</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;"><a href="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_4.png" atomicselection="true" style="color: #78afd3;"><img border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/oneword/WindowsLiveWriter/Javascript_D6BE/image_thumb_4.png" width="455" height="108" style="border: 0px; margin-left: 2em; margin-top: 2px; margin-bottom: 2px;" /></a></p></blockquote><p style="margin-top: 10px; margin-bottom: 10px; font-family: 'black Verdana', Arial, Helvetica, sans-serif; background-color: #ffffff;">原型继承</p><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">Javascript对象的创建和继承使用了一套特别的模式,称作原型式继承.</p><p style="margin-top: 10px; margin-bottom: 10px;">原理是:对象的构造函数可以从其他对象中继承方法,它创建出一个原型对象后,所有其他的新对象都可以基于这个原型对象来构建.</p><p style="margin-top: 10px; margin-bottom: 10px;">原型本身并不会从其他原型或者构造函数中继承属性,而属性都是从实际对象那里继承过来的.</p><p style="margin-top: 10px; margin-bottom: 10px;">例1:</p></blockquote><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; background-color: #ffffff;">        function Person(name){             <span style="color: #0000ff;">this</span>.name=name;         }                  Person.prototype.GetName=function(){             <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.name;         }                  function User(name,password){             <span style="color: #0000ff;">this</span>.name = name;             <span style="color: #0000ff;">this</span>.password = password;         }                  User.prototype = <span style="color: #0000ff;">new</span> Person();         User.prototype.GetPassword=function(){             <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.password;         }</pre><blockquote style="background-color: #ffffff; border-style: none; margin-top: 5px; margin-bottom: 5px; font-family: 'black Verdana', Arial, Helvetica, sans-serif;"><p style="margin-top: 10px; margin-bottom: 10px;">解释:</p><p style="margin-top: 10px; margin-bottom: 10px;">User.prototype = new Person();这句话如何理解呢?User是对User对象构造函数的引用,new Person()使用person构造函数创建了一个Person对象,然后把Person对象的原型置为这个操作的结果.也就是说,当每次new User()时,得到的新User对象都会带有Person对象的所有方法.</p></blockquote><img src ="http://www.blogjava.net/jjshcc/aggbug/393435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2012-12-25 11:03 <a href="http://www.blogjava.net/jjshcc/archive/2012/12/25/393435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax跨域访问解决方案 </title><link>http://www.blogjava.net/jjshcc/archive/2012/12/12/392903.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 12 Dec 2012 12:11:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2012/12/12/392903.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/392903.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2012/12/12/392903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/392903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/392903.html</trackback:ping><description><![CDATA[<div style="line-height: 25px; color: #333333; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;">ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互，而浏览器出于安全考虑，不允许js代码进行跨域操作，所以就诞生了很多跨域的解决方案。当本域和子域间进行访问时最简单的就是设置document.domain，当不同域的访问，大概有下列方法：</div><div style="line-height: 25px; color: #333333; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;">1.<strong>web端代理的方式</strong>，即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面，由该页面代替用户页面完成交互，从而返回合适的结果。</div><div style="line-height: 25px; color: #333333; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;">2.<strong>iframe</strong>，解决方案就是用window.location对象的hash属性，利用JS改变hash值网页不会刷新，可以这样实现通过JS访问hash值来做到通信，大体就是AB网站各嵌入一个对方网站的iframe，然后通过连续不断的监听hash值的变化来进行通信。比如A网站通过改变B网站iframe的hash后，B网站监听到hash的变化后就进行处理，这种方式需要开发者可以控制两个网站的代码。</div><div style="line-height: 25px; color: #333333; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;">3.<strong>通过script标签来请求</strong>，原理就是在本域内的A内生成一个JS标签，它的SRC指向请求的另外一个域的某个页面B，这个src里面通常会加一个A页面定义好的回调函数，B返回数据即可，可以直接返回调用这个回调函数，这种跨域的通信方式被称为JSONP，此方案存在的缺陷是， script的src属性完成该调用时采取的方式时get方式，如果请求时传递的字符串过大时，可能会无法正常运行。</div><div style="line-height: 25px; color: #333333; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;">4.<strong>window.name</strong>，window.name是一种解决跨域数据传输的新技术，通过在iframe中加载一个跨域的HTML文件，并且在HTML文件中设置window.name的值为需要传给接受者的数据，接收者就可以取得到window.name的值并且返回，比较关键的是同源策略的影响对location的控制不受限制，所以需要加载一个代理的页面来让发送页面读取window.name.</div><div style="line-height: 25px; color: #333333; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;">5.<strong>使用flash</strong>，原理是JavaScript将数据提交给本域下的 Flash，通过 Flash 中转去访问其他域的接口，只需要其他域的根目录下有一个crossdomain.xml文件，文件中设置允许所有域名或允许本域访问即可。</div><div style="line-height: 25px; color: #333333; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;">了解更多，请看：</div><div style="line-height: 25px; color: #333333; font-family: Arial, Helvetica, simsun, u5b8bu4f53; background-color: #ccced0;"><span style="line-height: normal; font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; font-size: 13px;"><p style="line-height: 22px; margin: 0px 0px 15px; padding: 0px;"><a target="_blank" rel="nofollow" href="http://www.phpchina.com/html/48/n-33848.html" style="color: #0044aa; line-height: 23px; text-decoration: initial; cursor: pointer;">http://www.phpchina.com/html/48/n-33848.html</a></p><p style="line-height: 22px; margin: 0px 0px 15px; padding: 0px;"><a target="_blank" rel="nofollow" href="http://www.sitepen.com/blog/2008/07/22/windowname-transport/" style="color: #0044aa; line-height: 23px; text-decoration: initial;">http://www.sitepen.com/blog/2008/07/22/windowname-transport/</a></p><p style="line-height: 22px; margin: 0px 0px 15px; padding: 0px;"><a target="_blank" rel="nofollow" href="http://www.planabc.net/2008/09/01/window_name_transport/" style="color: #0044aa; line-height: 23px; text-decoration: initial;">http://www.planabc.net/2008/09/01/window_name_transport/</a></p><p style="line-height: 22px; margin: 0px 0px 15px; padding: 0px;"><a target="_blank" rel="nofollow" href="http://hikejun.com/demo/windowname/demo_windowname.html" style="color: #0044aa; line-height: 23px; text-decoration: initial;">http://hikejun.com/demo/windowname/demo_windowname.html</a></p><p style="line-height: 22px; margin: 0px 0px 15px; padding: 0px;"><a target="_blank" rel="nofollow" href="http://blog.s135.com/ajaxcdr/" style="color: #0044aa; line-height: 23px; text-decoration: initial;">http://blog.s135.com/ajaxcdr/</a></p></span></div><img src ="http://www.blogjava.net/jjshcc/aggbug/392903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2012-12-12 20:11 <a href="http://www.blogjava.net/jjshcc/archive/2012/12/12/392903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>window.close与Firefox</title><link>http://www.blogjava.net/jjshcc/archive/2010/10/19/335561.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 19 Oct 2010 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/10/19/335561.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/335561.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/10/19/335561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/335561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/335561.html</trackback:ping><description><![CDATA[<p>核心：要使window.close在Firefox中有效，必须先设置window.open</p>
<p>对于最常用的关闭窗口链接，都比较熟悉，使用的Javascript函数就是：window.close()，写完后在IE下测试，完全搞定；当你用Mozilla内核的浏览器打开时，点击关闭窗口按钮，你会发现事件并不会像你想象的那么顺利，窗口根本就是无动于衷（真痛恨浏览器的兼容性吧，哈哈，淡定，没有浏览器的兼容性，又怎么会有前端开发这个职业呢），这并不是Mozilla内核浏览器不支持window.close()这个方法（打开<a href="http://www.w3schools.com/">W3CSCHOOL</a>，你会发现在Firefox 1.0就已经支持了），那到底是什么原因引起Firefox没有执行这段代码呢（准确地说应该是执行了，但没有产生预期的效果而已，本人一直坚信：就目前这技术，机器是不会骗人的，一切还是人为原因）？<br />
<br />
经过Google一翻，在一篇名为：在Firefox 2.0中无法用Javascript关闭父窗口（原名：<a href="http://forums.mozillazine.org/viewtopic.php?f=25&amp;t=527665&amp;start=0">Cannot close parent window using javascript in Firefox 2.0</a>）中找到真正的原因，其中有个网友直接使用下面的代码的（问题是：Firefox 2.0以下执行，但2.0无效）:</p>
<pre>function closeWindow() {
window.open('','_parent','');
window.close();
}
</pre>
<p>一位很了解这个问题的网友给出讲解并贴出了原因：它当然不会关闭，如果在window.open方法中不添加URL参数照样执行，但是下面的一行并不会执行或不会做任何事情。下面的稍微变化的代码指出的close()方法常见的错误―close()方法不能关闭非Javascript脚本打开的窗口（原文：Yes, that doesn&#8217;t do anything. If I change the missing URL in the window.open command to an actual page, it executes but then the next line doesn&#8217;t run or doesn&#8217;t do anything. The following variation gives the usual script error for the close() method in this scenario — can&#8217;t close a window not opened by a script）：</p>
<pre>function closeWindow() {
newwin = window.open(location.href,'_parent','');
newwin.close();
}
</pre>
<p>如果你使用window.open打开一个窗口，这时你才可以使用window.close去关闭它，相反如果你通过常规链接打开的窗口，window.close根本就关闭不了它，需要额外的用户权限；这比直接使用关闭按钮更令人讨厌&#8230;（原文：If you launch the initial Firefox window using window.open, then window.close should work on it. However, if it is launched from a regular URL, then as you know it doesn&#8217;t work. There is a way to ask the user for extra permissions. However, that might be more annoying than leaving the window open&#8230;），<span style="color: red">原来上面的两段代码都只针对使用window.open打开的窗口，才能执行window.close关闭，而对于URL链接新开的窗口，必须要额外的用户权限（UniversalBrowserWrite privilege）</span><span style="display: none">，其实只要在执行关闭窗口之前加上：</p>
<pre>netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
</pre>
<p>这段代码即可</span>，具体说明参见Mozilla官网的&#8220;<a href="http://www.mozilla.org/projects/security/components/signed-scripts.html#privs">如何使用扩展权限</a>&#8221;（Using Expanded Privileges）</p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/335561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-10-19 13:08 <a href="http://www.blogjava.net/jjshcc/archive/2010/10/19/335561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript中apply与call的区别</title><link>http://www.blogjava.net/jjshcc/archive/2010/08/04/327948.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 04 Aug 2010 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/08/04/327948.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/327948.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/08/04/327948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/327948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/327948.html</trackback:ping><description><![CDATA[<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; "><strong style="line-height: normal; ">apply and call</strong></p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">&nbsp;&nbsp; 它们的作用都是将函数绑定到另外一个对象上去运行，两者仅在定义参数方式有所区别：</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">&nbsp;&nbsp;&nbsp; apply(thisArg,argArray);</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">&nbsp;&nbsp;&nbsp; call(thisArg[,arg1,arg2&#8230;] ]);</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">即所有函数内部的this指针都会被赋值为thisArg，这可实现将函数作为另外一个对象的方法运行的目的</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">apply的说明</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">&nbsp;&nbsp; &nbsp; &nbsp; 如果 argArray 不是一个有效的数组或者不是 arguments 对象，那么将导致一个 TypeError。&nbsp;<br style="line-height: normal; " />
如果没有提供 argArray 和 thisArg任何一个参数，那么 Global 对象将被用作 thisArg，&nbsp;<br style="line-height: normal; " />
并且无法被传递任何参数。</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">call的说明</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">&nbsp;&nbsp; &nbsp; &nbsp;call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。&nbsp;<br style="line-height: normal; " />
如果没有提供 thisArg参数，那么 Global 对象被用作 thisArg</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">相关技巧：</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">&nbsp;&nbsp; &nbsp; 应用call和apply还有一个技巧在里面，<span style="color: red; ">就是用call和apply应用另一个函数（类）以后，当前的&nbsp;<br style="line-height: normal; " />
函数（类）就具备了另一个函数（类）的方法或者是属性，这也可以称之为&#8220;继承&#8221;。</span>看下面示例:</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; "><span style="color: red; ">// 继承的演示&nbsp;</span><br style="line-height: normal; " />
&nbsp;<span style="color: #000000; font-family: 'Times New Roman'; font-size: 13px; "><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;base()&nbsp;{&nbsp;</span></span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.member&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">我是基类的属性!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">()&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">我是基类method方法!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
}&nbsp;<br />
</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;extend()&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;base.call(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;window.alert(member);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;window.alert(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.method);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.me&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</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;alert(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.me);<br />
}<br />
extend();</span></div>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">上面的例子可以看出，通过call之后，extend可以继承到base的方法和属性。</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; "><br />
</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; "><br />
</p>
<p style="line-height: normal; color: #333333; font-family: Arial; font-size: 14px; ">
<p>call 方法&nbsp;</p>
<p>调用一个对象的一个方法，以另一个对象替换当前对象。&nbsp;</p>
<p>call([thisObj[,arg1[, arg2[, [,.argN]]]]])&nbsp;</p>
<p>参数&nbsp;</p>
<p>thisObj&nbsp;</p>
<p>可选项。<span style="color: red; ">将被用作当前对象的对象（替代当前对象的对象）</span>。&nbsp;</p>
<p>arg1, arg2, , argN&nbsp;</p>
<p>可选项。<span style="color: red; ">将被传递方法参数序列（传递给替代对象的参数列表）</span>。&nbsp;</p>
<p>说明&nbsp;</p>
<p>call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。&nbsp;</p>
<p>如果没有提供 thisObj 参数，那么 Global 对象被用作 thisObj。&nbsp;</p>
<p><br />
</p>
<p><span style="color: red; ">说明白一点其实就是更改对象的内部指针，即改变对象的this指向的内容</span>。这在面向对象的js编程过程中有时是很有用的。&nbsp;</p>
<p>引用网上一个代码段，运行后自然就明白其道理。&nbsp;</p>
<p>&nbsp;<span  style="font-size: 13px; "><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">input&nbsp;</span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="text"</span><span style="color: #FF0000; ">&nbsp;id</span><span style="color: #0000FF; ">="myText"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="input&nbsp;text"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">&nbsp;</span></span></p>
<p>&nbsp;<span  style="font-size: 13px; "><span style="color: #0000FF; ">function</span></span><span  style="font-size: 13px; "><span style="color: #000000; ">&nbsp;Obj(){</span></span><span  style="font-size: 13px; "><span style="color: #0000FF; ">this</span></span><span  style="font-size: 13px; "><span style="color: #000000; ">.value</span></span><span  style="font-size: 13px; "><span style="color: #000000; ">=</span></span><span  style="font-size: 13px; "><span style="color: #000000; ">"</span></span><span  style="font-size: 13px; "><span style="color: #000000; ">对象！</span></span><span  style="font-size: 13px; "><span style="color: #000000; ">"</span></span><span  style="font-size: 13px; "><span style="color: #000000; ">;}&nbsp;</span></span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">global&nbsp;变量</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;&nbsp;<br />
</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;Fun1(){alert(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.value);}&nbsp;<br />
window.Fun1();&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">global&nbsp;变量&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">Fun1.call(window);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">global&nbsp;变量&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">Fun1.call(document.getElementById('myText'));&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">input&nbsp;text&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">Fun1.call(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Obj());&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">对象！</span></div>
<p><br />
</p>
<p>call函数和apply方法的第一个参数都是要传入给当前对象的对象，及函数内部的this。后面的参数都是传递给当前对象的参数。&nbsp;</p>
<p>运行如下代码：&nbsp;</p>
<p>&nbsp;<span  style="font-size: 13px; "><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;func</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">func</span><span style="color: #000000; ">"</span><span style="color: #000000; ">}&nbsp;</span></span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;myfunc</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(x){&nbsp;<br />
</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">myfunc</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;&nbsp;<br />
alert(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.a);&nbsp;<br />
alert(x);&nbsp;<br />
}&nbsp;<br />
myfunc.call(func,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">var</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;</span></div>
<p>可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。&nbsp;</p>
<p><br />
</p>
<p>对于apply和call两者在作用上是相同的，但两者在参数上有区别的。&nbsp;</p>
<p>对于第一个参数意义都一样，但对第二个参数：&nbsp;</p>
<p>apply传入的是一个参数数组，也就是将多个参数组合成为一个数组传入，而call则作为call的参数传入（从第二个参数开始）。&nbsp;</p>
<p>如 func.call(func1,var1,var2,var3)对应的apply写法为：func.apply(func1,[var1,var2,var3])&nbsp;</p>
<p><br />
</p>
<p>同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入</p>
</p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/327948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-08-04 17:13 <a href="http://www.blogjava.net/jjshcc/archive/2010/08/04/327948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript中的this</title><link>http://www.blogjava.net/jjshcc/archive/2010/08/04/327935.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 04 Aug 2010 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/08/04/327935.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/327935.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/08/04/327935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/327935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/327935.html</trackback:ping><description><![CDATA[<table width="100%" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: Verdana, Arial, Tahoma; font-size: 14px; line-height: 25px; ">
    <tbody style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
        <tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            <td style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">前言<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
            Javascript是一门基于对象的动态语言，也就是说，所有东西都是对象，一个很典型的例子就是函数也被视为普通的对象。Javascript可以通过一定的设计模式来实现面向对象的编程，其中this &#8220;指针&#8221;就是实现面向对象的一个很重要的特性。但是this也是Javascript中一个非常容易理解错，进而用错的特性。特别是对于接触静态语言比较久了的同志来说更是如此。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">示例说明<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
            我们先来看一个最简单的示例：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span style="font-size: 13px; "><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin&nbsp;Yang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;sayHi(){<br />
            alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">你好，我的名字叫</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;name);<br />
            }<br />
            sayHi();</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;这段代码很简单，我们定义了一个全局字符串对象name和函数对象sayHi。运行会弹出一个打招呼的对话框，&#8220;你好，我的名字叫Kevin Yang&#8221;。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">我们把这段代码稍微改一改：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp;&nbsp;<span style="font-size: 13px; "><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin&nbsp;Yang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;sayHi(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">你好，我的名字叫</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: #0000FF; ">this</span><span style="color: #000000; ">.name);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;sayHi();</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;这段代码和上段代码的区别就在于sayHi函数在使用name的时候加上了this.前缀。运行结果和上面一摸一样。<span style="color: red; ">这说明this.name引用的也还是全局的name对象。</span></p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">开头我们不是说了，函数也是普通的对象，可以将其当作一个普通变量使用。我们再把上面的代码改一改：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            </p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
            <br />
            Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
            http://www.CodeHighlighter.com/<br />
            <br />
            --><span style="color: #000000; ">&nbsp;&nbsp; &nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin&nbsp;Yang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;sayHi(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">你好，我的名字叫</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: #0000FF; ">this</span><span style="color: #000000; ">.name);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;person&nbsp;</span><span style="color: #000000; ">=</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;person.sayHello&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sayHi;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;person.sayHello();</span></div>
            <p>&nbsp;</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">这一次，我们又创建了一个全局对象person，并将sayHi函数对象赋给person对象的sayHello属性。运行结果如下：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><img src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/20100712073636966.jpg" width="244" height="149" alt="" /><br />
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; 这一次打招呼的内容就有点无厘头了，我们发现this.name已经变成undefined了<span style="color: red; ">。这说明，在sayHello函数内部执行时已经找不着this.name对象了(</span>person对象没有定义一个name属性)。如果我们重新定义person对象，在其上面加上一个name属性又会怎么样呢？</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">var person = {name:"Marry"};运行代码发现打招呼的&#8220;人&#8221;变了：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><img src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/20100712073656939.jpg" width="244" height="181" alt="" /><br />
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">是不是看出点道道了呢？</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span style="color: red; ">判别this指针的指导性原则</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
            <span style="color: red; ">在Javascript里面，this指针代表的是执行当前代码的对象的所有者。</span></p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">在上面的示例中我们可以看到，<span style="color: red; ">第一次，我们定义了一个全局函数对象sayHi并执行了这个函数，函数内部使用了this关键字，那么执行this这行代码的对象是sayHi（一切皆对象的体现），sayHi是被定义在全局作用域中。其实在Javascript中所谓的全局对象，无非是定义在window这个根对象下的一个属性而已。因此，sayHi的所有者是window对象。也就是说，在全局作用域下，你可以通过直接使用name去引用这个对象，你也可以通过window.name去引用同一个对象。因而this.name就可以翻译为window.name</span>了。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;再来看第二个this的示例。我们定义了一个person的对象，并定义了它的sayHello属性，使其指向sayHi全局对象。那么这个时候，当我们运行person.sayHello的时候，this所在的代码所属对象就是sayHello了（其实准确来说，sayHi和sayHello是只不过类似两个指针，指向的对象实际上是同一个），而sayHello对象的所有者就是person了。第一次，person里面没有name属性，因此弹出的对话框就是this.name引用的就是undefined对象（Javascript中所有只声明而没有定义的变量全都指向undefined对象）；而第二次我们在定义person的时候加了name属性了，那么this.name指向的自然就是我们定义的字符串了。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">理解了上面所说的之后，我们将上面最后一段示例改造成面向对象式的代码。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span style="font-size: 13px; "><font size="4"><span style="font-size: 14px;">&nbsp;&nbsp; &nbsp; &nbsp;</span></font><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin&nbsp;Yang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;sayHi(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">你好，我的名字叫</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: #0000FF; ">this</span><span style="color: #000000; ">.name);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;Person(name){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&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;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.sayHello&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sayHi;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;marry&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(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Marry</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;marry.sayHello();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;kevin&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(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;kevin.sayHello();</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;在上面这段代码中，我们<span style="color: red; ">定义了一个Person的&#8220;类&#8221;（实际上还是一个对象），然后在这个类的原型（类原型相当于C++中的静态成员变量的概念）中定义了sayHello属性，使其指向全局的sayHi对象</span>。运行代码我们可以看到，marry和kevin都成功的向我们打了声&#8220;招呼&#8221;。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;在这段代码中有两点需要思考的，一个是new我们很熟悉，但是在这里new到底做了什么操作呢？另外一个是，这里执行sayHello的时候，this指针为什么能够正确的指向marry和kevin对象呢？</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">我们来把上面定义&#8220;类&#8221;和实例化类对象的操作重新&#8220;翻译&#8221;一下：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            </p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
            <br />
            Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
            http://www.CodeHighlighter.com/<br />
            <br />
            --><span style="color: #000000; ">&nbsp;&nbsp; &nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin&nbsp;Yang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;sayHi(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">你好，我的名字叫</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: #0000FF; ">this</span><span style="color: #000000; ">.name);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;Person(name){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&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;&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 />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;Person.prototype.sayHello&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sayHi;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;marry&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Person(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Marry</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;marry.sayHello();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;kevin&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Person(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;kevin.sayHello();</span></div>
            <p>&nbsp;</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;当然这段代码并不能正确执行，但是它可以帮助你更好的理解这个过程。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;当我们使用new关键字实例化一个&#8220;类&#8221;对象的时候，Javascript引擎会在这个对象内部定义一个新的对象并将其存入this指针。所有此对象内部用到this的代码实际上都是指向这个新的对象。如this.name = name，实际上是将参数中的name对象赋值给了这个新创建的对象。函数对象执行完之后Javascript引擎会将此对象返回给你，于是就有marry变量得到的对象的name为&#8220;Marry&#8221;，而kevin变量得到的对象的name属性确实&#8220;Kevin&#8221;。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span style="color: red; ">容易误用的情况</span><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
            理解了this指针后，我们再来看看一些很容易误用this指针的情况。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span style="color: red; ">示例1——内联式绑定Dom元素的事件处理函数</span></p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span  style="font-size: 13px; "><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;sayHi(){</span></span>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">当前点击的元素是</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: #0000FF; ">this</span><span style="color: #000000; ">.tagName);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></div>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
            <br />
            Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
            http://www.CodeHighlighter.com/<br />
            <br />
            --><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">input&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="btnTest"</span><span style="color: #FF0000; ">&nbsp;type</span><span style="color: #0000FF; ">="button"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="点击我"</span><span style="color: #FF0000; ">&nbsp;onclick</span><span style="color: #0000FF; ">="sayHi()"</span><span style="color: #0000FF; ">&gt;</span></div>
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">在此例代码中，我们绑定了button的点击事件，期望在弹出的对话框中打印出点击元素的标签名。但运行结果却是：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><img src="http://www.blogjava.net/images/blogjava_net/jjshcc/20100712073718138.jpg" width="244" height="156" alt="" /><br />
            </p>
            <p>&nbsp;&nbsp; &nbsp; 也就是this指针并不是指向input元素。这是因为当使用内联式绑定Dom元素的事件处理函数时，实际上相当于执行了以下代码：</p>
            <p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
            <br />
            Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
            http://www.CodeHighlighter.com/<br />
            <br />
            --><span style="color: #000000; ">&nbsp;&nbsp; &nbsp; document.getElementById(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">btnTest</span><span style="color: #000000; ">"</span><span style="color: #000000; ">).onclick&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sayHi();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
            </p>
            <p>&nbsp;&nbsp; &nbsp; 在这种情况下sayHi函数对象的所有权并没有发生转移，还是属于window所有。用上面的指导原则一套我们就很好理解为什么this.tagName是undefined了。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">那么如果我们要引用元素本身怎么办呢？</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">我们知道，<span style="color: red; ">onclick函数是属于btnTest元素的，那么在此函数内部，this指针正是指向此Dom对象，于是我们只需要把this作为参数传入sayHi即可。</span></p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span  style="font-size: 13px; "><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;sayHi(el){</span></span>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">当前点击的元素是</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;el.tagName);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
            <br />
            Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
            http://www.CodeHighlighter.com/<br />
            <br />
            --><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">input&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="btnTest"</span><span style="color: #FF0000; ">&nbsp;type</span><span style="color: #0000FF; ">="button"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="点击我"</span><span style="color: #FF0000; ">&nbsp;onclick</span><span style="color: #0000FF; ">="sayHi(this)"</span><span style="color: #0000FF; ">&gt;</span></div>
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">等价代码如下：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span  style="font-size: 13px; "><span style="color: #000000; ">document.getElementById(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">btnTest</span><span style="color: #000000; ">"</span><span style="color: #000000; ">).onclick&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sayHi(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
            <p>&nbsp;<span style="color: red; ">示例2——临时变量导致的this指针丢失</span></p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span  style="font-size: 13px; "><span style="color: #000000; ">&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;Utility&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decode:</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(str){<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;unescape(str);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCookie:</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(key){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;省略提取cookie字符串的代码</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; ">var</span><span style="color: #000000; ">&nbsp;value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">i%27m%20a%20cookie</span><span style="color: #000000; ">"</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;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.decode(value);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;};<br />
            &nbsp;&nbsp;&nbsp;&nbsp;alert(Utility.getCookie(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">identity</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; 我们在写稍微有点规模的Js库的时候，一般都会自己封装一个Utility的类，然后将一些常用的函数作为Utility类的属性，如客户端经常会用到的getCookie函数和解码函数。如果每个函数都是彼此独立的，那么还好办，问题是，函数之间有时候会相互引用。例如上面的getCookie函数，会对从document.cookie中提取到的字符串进行decode之后再返回。如果我们通过Utility.getCookie去调用的话，那么没有问题，我们知道，getCookie内部的this指针指向的还是Utility对象，而Utility对象时包含decode属性的。代码可以成功执行。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">但是有个人不小心这样使用Utility对象呢？</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span  style="font-size: 13px; "><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;showUserIdentity(){</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;保存getCookie函数到一个局部变量，因为下面会经常用到</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;getCookie&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Utility.getCookie;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(getCookie(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">identity</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;showUserIdentity();</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;这个时候运行代码会抛出异常&#8220;this.decode is not a function&#8221;。运用上面我们讲到的指导原则，很好理解，因为<span style="color: red; ">此时Utility.getCookie对象被赋给了临时变量getCookie，而临时变量是属于window对象的——只不过外界不能直接引用，只对Javascript引擎可见——于是在getCookie函数内部的this指针指向的就是window对象了，而window对象没有定义一个decode的函数对象，因此就会抛出这样的异常来。</span></p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">这个问题是由于引入了临时变量导致的this指针的转移。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></p>
            <span style="color: red; ">
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">解决此问题的办法有几个：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&#8226;不引入临时变量，每次使用均使用Utility.getCookie进行调用&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
            &#8226;getCookie函数内部使用Utility.decode显式引用decode对象而不通过this指针隐式引用（如果Utility是一个实例化的对象，也即是通过new生成的，那么此法不可用）&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
            &#8226;使用Funtion.apply或者Function.call函数指定this指针</p>
            </span>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
            &nbsp;&nbsp; &nbsp; 前面两种都比较好理解，第三种需要提一下。正是因为this指针的指向很容易被转移丢失，因此Javascript提供了两个类似的函数apply和call来允许函数在调用时重新显式的指定this指针。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">修正代码如下：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span  style="font-size: 13px; "><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;showUserIdentity(){</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;保存getCookie函数到一个局部变量，因为下面会经常用到</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;getCookie&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Utility.getCookie;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(getCookie.call(Utility,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">identity</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(getCookie.apply(Utility,[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">identity</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;showUserIdentity();</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">call和apply只有语法上的差异，没有功能上的差别。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span style="color: red; ">示例3——函数传参时导致的this指针丢失</span></p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">我们先来看一段问题代码：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span  style="font-size: 13px; "><span style="color: #000000; ">&nbsp;&nbsp; &nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;person&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin&nbsp;Yang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sayHi:</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">你好，我是</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;setTimeout(person.sayHi,</span><span style="color: #000000; ">5000</span><span style="color: #000000; ">);</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">这段代码期望在访客进入页面5秒钟之后向访客打声招呼。setTimeout函数接收一个函数作为参数，并在指定的触发时刻执行这个函数。可是，当我们等了5秒钟之后，弹出的对话框显示的this.name却是undefined。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; &nbsp;其实这个问题和上一个示例中的问题是类似的，都是因为临时变量而导致的问题。<span style="color: red; ">当我们执行函数的时候，如果函数带有参数，那么这个时候Javascript引擎会创建一个临时变量，并将传入的参数复制（注意，Javascript里面都是值传递的，没有引用传递的概念）给此临时变量。也就是说，整个过程就跟上面我们定义了一个getCookie的临时变量，再将Utility.getCookie赋值给这个临时变量一样。只不过在这个示例中，容易忽视临时变量导致的bug。</span></p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">函数对象传参<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
            对于函数作为参数传递导致的this指针丢失的问题，目前很多框架都已经有方法解决了。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Prototype的解决方案——传参之前使用bind方法将函数封装起来，并返回封装后的对象</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;<span  style="font-size: 13px; "><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;person&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin&nbsp;Yang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sayHi:</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">你好，我是</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;boundFunc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;person.sayHi.bind(person,person.sayHi);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;setTimeout(boundFunc,</span><span style="color: #000000; ">5000</span><span style="color: #000000; ">);</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">bind方法的实现其实是用到了Javascript又一个高级特性——闭包。我们来看一下源代码：</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
            <br />
            Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
            http://www.CodeHighlighter.com/<br />
            <br />
            --><span style="color: #0000FF; ">function</span><span style="color: #000000; ">&nbsp;bind(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(arguments.length&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;arguments[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">===</span><span style="color: #000000; ">&nbsp;undefined)&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; ">;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;__method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">,&nbsp;args&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;$A(arguments),&nbsp;object&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;args.shift();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</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; ">return</span><span style="color: #000000; ">&nbsp;__method.apply(object,&nbsp;args.concat($A(arguments)));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            }</span></div>
            </p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp; 首先将this指针存入函数内部临时变量，然后在返回的函数对象中引用此临时变量从而形成闭包。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">微软的Ajax库提供的方案——构建委托对象</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp; &nbsp;&nbsp;<span  style="font-size: 13px; "><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;person&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span></span></p>
            <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Kevin&nbsp;Yang</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sayHi:</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">你好，我是</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;boundFunc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Function.createDelegate(person,person.sayHi);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;setTimeout(boundFunc,</span><span style="color: #000000; ">5000</span><span style="color: #000000; ">);</span></div>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">其实本质上和prototype的方式是一样的。</p>
            <p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">著名的Extjs库的解决方案采用的手法和微软是一样的。&nbsp;</p>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jjshcc/aggbug/327935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-08-04 15:40 <a href="http://www.blogjava.net/jjshcc/archive/2010/08/04/327935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（Javascript）prototype的一个优势也是缺点</title><link>http://www.blogjava.net/jjshcc/archive/2010/07/21/326733.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 21 Jul 2010 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/07/21/326733.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/326733.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/07/21/326733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/326733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/326733.html</trackback:ping><description><![CDATA[怎么在Javascript实现OO编程？恐怕最佳的方式就是充分利用prototype属性。关于prototype的介绍有非常多，我就不赘述了。比较基本的原理是，当你用prototype编写一个类后，当你new一个新的object，浏览器会自动把prototype中的内容替你附加在object上。这样，通过利用prototype，你也就实现了类似OO的Javascript。<br />
在Javascript中，object就是个associative array。一个function就是个类。当你编写如下function时，其实就是定义了一个类，该function就是他的构造函数。<br />
function MyObject(name, size)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.size = size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
之后，你能方便的通过MyObject类的prototype属性来方便的扩充他。比如，你能给他添加其他的属性和方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.tellSize = function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "size of "+this.name+" is "+this.size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.color = "red";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.tellColor = function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "color of "+this.name+" is "+this.color;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var myobj1 = new MyObject("tiddles", "7.5 meters");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domDiv.innerHTML += myobj1.tellColor()+"&lt;br /&gt;&lt;br /&gt;";<br />
你能想象，当你调用tellColor()方法后，结果是这样的：<br />
color of tiddles is red<br />
非常方便的是，prototype属性能动态添加。比如，你需要往MyObject中加入一个height属性，并希望其提供一个tellHeight()方法来获得height属性的值。你能在上面的代码后，继续添加如下的代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.height = "2.26 meters";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.tellHeight = function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "height of "+this.name+" is "+this.height;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
之后，你能访问一下myobj1的tellHeight()方法，你能得到如下的结果：<br />
height of tiddles is 2.26 meters<br />
prototype的这些动态的特性看起来有些迷人，不过我倒是反而觉得有些凉飕飕的。确实，这些特性给你非常大的灵活性，能给和你runtime改动类属性和方法的能力。不过，稍微发掘一下，会有些不良的习惯产生。<br />
首先，如果能动态添加属性和方法，那么非常容易让人想到，当我调用时，我想要调用的属性或方法存在不？这是个非常严肃的问题，如果当我们调用时根本没有该属性或方法，将可能导致我们的脚本down掉。<br />
不过也有解决办法。比如，在上面的代码中，当还没有tellHeight()方法时，我们能如下编写代码避免发生错误：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (myobj1.tellHeight)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domDiv.innerHTML += myobj1.tellHeight()+"&lt;br /&gt;&lt;br /&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
注意，一定要在if语句中，不要加方法后面的那对()，否则，直接就down掉了。有兴趣的读者能打印一下，看看分别访问myobj1.tellHeight和myobj1.tellHeight()时有什么差别。<br />
也许，你觉得这个是小意思。加个判断嘛，不就好了？<br />
对，不过下面一个问题更令人头痛。<br />
属性和方法在不在的问题简单，可是属性和方法变不变化的问题可就严重了。在不在我们能检测，变不变呢？比如，请看下面的代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function MyObject(name, size)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.size = size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.color = "red";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.tellColor = function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "color of "+this.name+" is "+this.color;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var myobj1 = new MyObject("tiddles", "7.5 meters");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domDiv.innerHTML += myobj1.tellColor()+"&lt;br /&gt;&lt;br /&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.color = "green";<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domDiv.innerHTML += myobj1.tellColor()+"&lt;br /&gt;&lt;br /&gt;";<br />
该代码将产生如下结果：<br />
color of tiddles is red<br />
color of tiddles is green<br />
请注意，你修改的是类MyObject的color属性。不过你惊奇的看到你之前实例化的对象myobj1的属性值竟然也变化了。天！如果你的项目代码是多人合作，那么，也许某个人会在编程时为了图一己之便，擅自修改你的类。于是，所有人的对象都变化了。于是，你们陷入了漫长的debug过程中。。。。。。（不要说我没有告诉你啊）<br />
上面是属性，更有方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function MyObject(name, size)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.size = size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.color = "red";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.tellColor = function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "color of "+this.name+" is "+this.color;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var myobj1 = new MyObject("tiddles", "7.5 meters");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domDiv.innerHTML += myobj1.tellColor()+"&lt;br /&gt;&lt;br /&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.color = "green";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyObject.prototype.tellColor = function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "your color of "+this.name+" is "+this.color;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domDiv.innerHTML += myobj1.tellColor()+"&lt;br /&gt;&lt;br /&gt;";<br />
这段代码的结果是：<br />
color of tiddles is red<br />
your color of tiddles is green<br />
哈？原来方法也能变，汗！<br />
&nbsp;&nbsp;&nbsp; 问题来了。Javascript太灵活的编程方式多少让人不适应。如果整个Team的水平都比较高还能，没人会犯这样的错误。不过，当有个毛头小伙子不知情，擅自修改类，将导致所有的人的对象都发生变化，无论是属性还是方法。在Javascript代码变得越来越多的Ajax时代，这是个严重的问题。<br />
这说明，编写Javascript时，好的编程风格更加重要。记得某人原来说过这样的话，想Java和C#这些比较严格的语言，虽然降低了灵活性，但也减少了犯错误的可能。这样，即使一个新手，他写出的代码也不会和高手差太多。不过，像Javascript这样的脚本语言，由于太灵活，所以，高手写出的是天使，而新手写的，可能是魔鬼！
<img src ="http://www.blogjava.net/jjshcc/aggbug/326733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-07-21 14:03 <a href="http://www.blogjava.net/jjshcc/archive/2010/07/21/326733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Edit Plus正确安装jslint插件</title><link>http://www.blogjava.net/jjshcc/archive/2010/07/14/326089.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 14 Jul 2010 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/07/14/326089.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/326089.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/07/14/326089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/326089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/326089.html</trackback:ping><description><![CDATA[<div>
<p>很早之前就听说有jslint这个东东，但是一直没有用过。说得简单点，这是一个js代码校验的工具。</p>
<p>官方网站：<a href="http://www.jslint.com/lint.html" target="blank">http://www.jslint.com/lint.html</a></p>
<p>在线校验地址：<a href="http://www.jslint.com/" target="blank">http://www.jslint.com/</a></p>
<p>用在线校验的校验有些不太方便，因为每次都要粘贴复制代码。如果能把jslint结合到EditPlus里面应该灰常方便。</p>
<p>找到如下解决方案</p>
<p>从<a href="http://www.jslint.com/fulljslint.js" target="blank">http://www.jslint.com/fulljslint.js</a>下载这个js文件，放到editplus的安装目录中，我的是C:"Program Files"EditPlus 3</p>
<p>菜单文本：javascript调试<br />
调试命令：cmd /c<br />
参数：cscript &#8220;$(FileName)&#8221;   <del datetime="2010-02-05T06:34:42+00:00">cscript &#8220;jslint的路径&#8221; &lt; "$(FileName)"</del>(被删除的部分是网上大部分的说法，但是我实际操作了一下，发现这段命令只会检测jslint这个文件，于是我尝试删除了&lt;前面的东东，发现就能校验当前文件了)<br />
初始目录：$(FileDir)<br />
钩选：捕捉输出<br />
在输出模式使用正则表达式：^Lint at line ([0-9]+) character ([0-9]+).*$&#8221;<br />
上面这行好像就是默认的，不用改。</p>
<div id="attachment_126" class="wp-caption alignnone" style="width: 491px;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/jslint.JPG" width="481" height="357" /><br />
<p>EditPlus里面配置jslint</p>
</div>
<p>存在问题：目前校验下来，一般的js代码如果有问题，会正常报错。但是对于我们的框架而言，只要检测到$符号，就会报错。<br />
我想这个应该在jslint.js文件中处理一下对应的逻辑。</p>
</div>
<img src ="http://www.blogjava.net/jjshcc/aggbug/326089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-07-14 15:52 <a href="http://www.blogjava.net/jjshcc/archive/2010/07/14/326089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>window.open()弹出居中的窗口</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/21/324058.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Mon, 21 Jun 2010 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/21/324058.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/324058.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/21/324058.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/324058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/324058.html</trackback:ping><description><![CDATA[<p>function openwindow(url,name,iWidth,iHeight)<br />
{<br />
var url;
//转向网页的地址;<br />
var name;
//网页名称，可为空;<br />
var iWidth;                          //弹出窗口的宽度;<br />
var iHeight;                        //弹出窗口的高度;<br />
var iTop =
(window.screen.availHeight-30-iHeight)/2;       //获得窗口的垂直位置;<br />
var
iLeft = (window.screen.availWidth-10-iWidth)/2;           //获得窗口的水平位置;<br />
window.open(url,name,'height='+iHeight+',,innerHeight='+iHeight+',width='+iWidth+',innerWidth='+iWidth+',top='+iTop+',left='+iLeft+',toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no');<br />
}</p>
<p>使用时调用这个函数即可。如：</p>
<p>&lt;a href="javascript:void(0);"
onclick="javascript:openwindow('a.html','',400,200);"&gt;转到a&lt;/a&gt;</p>
<p>缺点：与原窗口的大小，位置无关。</p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/324058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-21 13:39 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/21/324058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript中cookie的路径(path)和域(domain)</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/13/323517.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Sun, 13 Jun 2010 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/13/323517.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/323517.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/13/323517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/323517.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/323517.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<p>&nbsp;&nbsp;&nbsp; cookie虽然是由一个网页所创建，但并不只是创建cookie的网页才能读
取该cookie。在默认情况下，与创建cookie的网页在同一目录或子目录下的所有网页都可以读取该cookie。但如果在这个目录下还有子目录，要
使在子目录中也可以访问，则需要使用path参数设置cookie，语法如下：<br />
document.cookie="name=value; path=cookieDir";<br />
&nbsp;&nbsp;
如果要使cookie在整个网站下可用，可以将cookieDir指定为根目录，示例如下：<br />
document.cookie="userId=320; path=/";<br />
&nbsp;&nbsp;
上面所说都指的是在同一个目录中的访问，可是要想在不同虚拟目录中访问则要另外想办法来解决这个问题。但是path不能解决在不同域中访问cookie的
问题。在默认情况下，只有和设置cookie的网页在同一个Web服务器的网页才能访问该网页创建的cookie。但可以通过domain参数来实现对其
的控制，其语法格式如下：<br />
document.cookie="name=value; domain=cookieDomain";</p>
<p>具体代码如下，直接运行即可：</p>
<p>设置路径：</p>
<p>&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;  &lt;title&gt;设置cookie的路径&lt;/title&gt;<br />
&lt;script language="javascript" type="text/javascript"&gt;<br />
&nbsp;&nbsp;  &lt;!--<br />
<br />
&nbsp;&nbsp;&nbsp; var now=new Date();<br />
&nbsp;&nbsp; now.setDate(now.getDate()+1);<br />
&nbsp;&nbsp; var
cookies="userName="+escape("哈哈")+";expires="+now.toString()+";path=/";<br />
&nbsp;&nbsp; document.cookie=cookies;<br />
&nbsp;&nbsp; document.write("cookie文件中的内容为：&lt;br&gt;",unescape(document.cookie));<br />
&nbsp;&nbsp;  --&gt;<br />
&lt;/script&gt;<br />
<br />
&lt;/head&gt;<br />
&lt;body&gt;&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>设置域：</p>
<p>&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;  &lt;title&gt;设置cookie的路径&lt;/title&gt;<br />
&lt;script language="javascript" type="text/javascript"&gt;<br />
&nbsp;&nbsp;  &lt;!--<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
</p>
<p>&nbsp;&nbsp; var now=new Date();<br />
&nbsp;&nbsp; now.setDate(now.getDate()+1);<br />
&nbsp;&nbsp; var
cookies="userName="+escape("哈哈")+";expires="+now.toString()+";path=/;
domain=.baidu.com";<br />
&nbsp;&nbsp; document.cookie=cookies;<br />
&nbsp;&nbsp; document.write("cookie文件中的内容为：&lt;br&gt;",unescape(document.cookie));<br />
&nbsp;&nbsp;  --&gt;<br />
&lt;/script&gt;<br />
<br />
&lt;/head&gt;<br />
&lt;body&gt;&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
</div>
<img src ="http://www.blogjava.net/jjshcc/aggbug/323517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-13 15:02 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/13/323517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更新记录后关闭子窗口并刷新父窗口的Javascript </title><link>http://www.blogjava.net/jjshcc/archive/2010/06/10/323235.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 10 Jun 2010 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/10/323235.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/323235.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/10/323235.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/323235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/323235.html</trackback:ping><description><![CDATA[有时我们需要在新打开的窗口里面编辑信息,等编辑完了,需要将当前窗口关闭并且刷新父窗口,以使修改生效,本文就是介绍用 javascript 来实现"更新记录后关闭子窗口并刷新父窗口".<br />
<br />
&nbsp;<br />
<br />
<br />
父窗口代码:<br />
<br />
HTML:<br />
<br />
&nbsp;
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="javascript:void(0)"</span><span style="color: #ff0000;">&nbsp;onclick</span><span style="color: #0000ff;">="window.open('child.html','child','width=400,height=300,left=200,top=200');"</span><span style="color: #ff0000;">&amp;&nbsp;gt;打开子窗口&lt;/a</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
子窗口代码:<br />
<br />
HTML:<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #ff0000;">language</span><span style="color: #0000ff;">="JavaScript"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;</span><span style="background-color: #f5f5f5; color: #000000;"><br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">&lt;!--</span><span style="background-color: #f5f5f5; color: #000000;"><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;refreshParent()<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.opener.location.href&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;window.opener.location.href;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">if</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;(window.opener.progressWindow)<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.opener.progressWindow.close();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.close();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">--&gt;</span><span style="background-color: #f5f5f5; color: #008000;"><br />
</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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 />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="javascript:void(0)"</span><span style="color: #ff0000;">&nbsp;onclick</span><span style="color: #0000ff;">="refreshParent()"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">刷新父窗口并关闭当前窗口</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span></div>
<br />
&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/jjshcc/aggbug/323235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-10 14:59 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/10/323235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jquery radio取值，checkbox取值，select取值，radio选中，checkbox选中，select选中</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/08/323036.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 08 Jun 2010 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/08/323036.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/323036.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/08/323036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/323036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/323036.html</trackback:ping><description><![CDATA[获取一组radio被选中项的值
<br />
var item = $('input[@name=items][@checked]').val();
<br />
获取select被选中项的文本
<br />
var item = $("select[@name=items] option[@selected]").text();
<br />
select下拉框的第二个元素为当前选中值
<br />
$('#select_id')[0].selectedIndex = 1;
<br />
radio单选组的第二个元素为当前选中值
<br />
$('input[@name=items]').get(1).checked = true;
<br />
<br />
获取值：
<br />
<br />
文本框，文本区域：$("#txt").attr("value")；
<br />
多选框checkbox：$("#checkbox_id").attr("value")；
<br />
单选组radio：&nbsp;&nbsp; $("input[@type=radio][@checked]").val();
<br />
下拉框select： $('#sel').val();
<br />
<br />
控制表单元素：
<br />
文本框，文本区域：$("#txt").attr("value",'');//清空内容
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $("#txt").attr("value",'11');//填充内容
<br />
<br />
多选框checkbox： $("#chk1").attr("checked",'');//不打勾
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $("#chk2").attr("checked",true);//打勾
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($("#chk1").attr('checked')==undefined)
//判断是否已经打勾
<br />
<br />
单选组radio：&nbsp;&nbsp;&nbsp;
$("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
<br />
下拉框select：&nbsp;&nbsp;
$("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $("&lt;option
value='1'&gt;1111&lt;/option&gt;&lt;option
value='2'&gt;2222&lt;/option&gt;").appendTo("#sel")//添加下拉框的option
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $("#sel").empty()；//清空下拉框
<img src ="http://www.blogjava.net/jjshcc/aggbug/323036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-08 10:50 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/08/323036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Microsoft Ajax Minifier技术高效率压缩Js文件</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/05/322819.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Sat, 05 Jun 2010 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/05/322819.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322819.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/05/322819.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322819.html</trackback:ping><description><![CDATA[<p>现在越来越多的 <a title="访问[wordpress]" href="http://www.wordpress.org/" target="_blank" jquery1275701799673="86">WordPress</a> Themes使用了<a title="访问[jQuery]" href="http://jquery.com/" target="_blank" jquery1275701799673="87">jQuery</a>，已及其它使用了Js的插件，这些Js文件通常位于&lt;/head&gt;之前。我们知道网页加载的顺序是从上到下，从左到右，如果头部需加载的文件过多过大的话，会严重影响网页打开的时间。毕竟中国的网络环境还不成熟，所以要有一个折衷的方法来尽量缩小文件尤其是Js文件的大小。</p>
<p>微软曾出品了一款叫<a title="访问[微软]网站" href="http://www.microsoft.com/" target="_blank" jquery1275701799673="88">Microsoft</a> Ajax Minifier的Js压缩工具，适用于所有的Js文件，<a title="返回[精品免费资源]首页" href="http://www.canfree.com/" target="_top" jquery1275701799673="89">左手烟</a>@今天特地又拿出来研究一下，我是个完美主义者，对什么都讲求精益求精，所以下面的解说朋友们都应该能够理解与明白，我们只要会用即可，不必深究其技术层面的东西。</p>
<p><span style="color: #ff0000">优点：压缩率高、安全可靠、代码规范</span></p>
<p><span style="color: #ff0000">缺点：需要手动输入命令执行操作</span></p>
<p>第一步，下载最新版的 <a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34488#DownloadId=87862" jquery1275701799673="90">Microsoft Ajax Minifier 1.1</a>，点击 I Agree 按钮后下载文件并保存到桌面上，双击进行安装，之后在开始-程序-Microsoft Ajax Minifier文件夹中找到Microsoft Ajax Minifier Command Prompt，单击后弹出熟悉的CMD命令窗口，如图</p>
<p style="text-align: center"><a href="http://farm3.static.flickr.com/2575/4232497327_b577a3aa7a.jpg" jquery1275701799673="91"></a></p>
<p>第二步，将你需要压缩的Js文件复制到C盘以外的D或E等根目录，为什么要这么做？因为有使用Win 7的朋友对C盘的操作权限有限制，会导致文件不被生成，我们就放到D盘跟目录即可。下面先说说它的三种命令压缩方式：(举例：现在D盘有一个demo.js文件需要压缩)</p>
<ol>
    <li>普通压缩：<span style="color: #ff0000">ajaxmin d:\demo.js</span> 效果不大，不推荐使用，了解即可；
    <li>高级压缩：<span style="color: #ff0000">ajaxmin d:\demo.js -o d:\demo1.js</span> 将demo.js压缩后转换成demo1.js保存在D盘根目录，效果明显，推荐；
    <li>超级压缩：<span style="color: #ff0000">ajaxmin -h d:\demo.js -o d:\demo2.js</span> 将demo.js超级压缩后转换成demo2.js保存在D盘根目录，效果显著，强烈推荐；</li>
</ol>
<p>敲回车键执行命令，出现<strong>crunching file &#8216;demo.js&#8217;&#8230;done</strong>.字样说明成功，同时，D盘根目录会多出来demo1.js或demo2.js文件。</p>
<p style="text-align: center"><a href="http://farm3.static.flickr.com/2546/4232578335_90423b92c6.jpg" jquery1275701799673="92"></a></p>
<p>有朋友会发现后两种方式压缩后的文件大小区别不大，也就2k左右。这里要说明一下这是为什么。当使用了<strong>-h</strong>（hyper-crunching）的指令，你会发现一些区域指令被改名成比较简单的命名，例如：var exists&#8211;&gt;var a，因此字节数会再少一些，但是效果不打折，我们不必管它的原理，好用即可。</p>
<p>第三步，将压缩后的Js文件重命名后覆盖掉之前的，传至服务器。当然备份工作也是要做的，在测试没有问题时即可删掉原先臃肿的文件。</p>
<p>我们用最新的jQuery 1.3.2来做个试验。官方下载地址在<a href="http://docs.jquery.com/Downloading_jQuery" target="_blank" jquery1275701799673="93">这里</a>。官方提供了2个版本，一个迷你版，大小为57253字节；完整版，大小为120763字节。用 -h 参数后迷你版大小为55860字节；完整版大小为55863字节，一大半被压缩掉了，效果非常显著。</p>
<p><strong>引申阅读</strong>：玩WordPress的朋友都想尽办法让加载再快点，容量再小点，其它的Js压缩方法网上也很多，比如在线压缩。去<a href="http://i.zou.lu/jsmin/" target="_blank" jquery1275701799673="94">这里</a>试试效果吧。你会发现效率远没有Microsoft Ajax Minifier来得好，上面那个完整版在线进行超级压缩后为73285字节，这就是差距啊。微软毕竟是有一定技术含量的，不然也不会遛出来献丑了。:-)</p>
<p><span style="color: #ff0000">&nbsp;</span></p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/322819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-05 09:40 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/05/322819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>event is not defined 问题处理</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/04/322729.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Fri, 04 Jun 2010 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/04/322729.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322729.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/04/322729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322729.html</trackback:ping><description><![CDATA[FireFox 是遵守W3C, 沒有event<br />
&nbsp;<br />
<br />
所以可能会出现" event is not defined "<br />
<br />
而IE event给于window.event,<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
解决方法：<br />
<br />
&nbsp;&nbsp;&nbsp; funname( event,....)&nbsp; {<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp; var evt = event ? event : (window.event ? window.event : null);<br />
<br />
..........<br />
<br />
&nbsp; &nbsp;<br />
<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;<br />
<br />
调用时要加上event参数 onmouseover="javascript: funname(event, ....); "<br />
<br />
&nbsp;<br />
<br />
3.注意：<br />
<br />
&nbsp;<br />
<br />
IE 的 event.srcElement &lt;==&gt;&nbsp; Firefox 中的 event.target<br />
<br />
IE 的 a.innerText&nbsp; &lt;==&gt;&nbsp; Firefox 中的 a.textContent<br />
<br />
IE 的 document.all[obj].style &lt;==&gt;&nbsp; Firefox 中的 document.getElementById(obj).style <br />
<img src ="http://www.blogjava.net/jjshcc/aggbug/322729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-04 14:56 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/04/322729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript程序中出现多个同名函数</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/29/322192.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Sat, 29 May 2010 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/29/322192.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322192.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/29/322192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322192.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322192.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">当我们在<span>JavaScript</span>中，要执行一
个函数往往都是这样写</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: blue;">function</span><span style="font-size: 10pt;"> aa(){</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span>alert(<span style="color: #a31515;">"first function"</span>);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">};</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">aa();</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">有人会问能否再简化呢？答案是肯定的！只要你愿意我们还可以通过括号直
接调用函数</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">(<span style="color: blue;">function</span>
aa(){</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span>alert(<span style="color: #a31515;">"(function)();"</span>);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">})();</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">当然，也又别的方法，试试在函数前写上<span>+</span>或
者<span>-</span>吧！</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">+<span style="color: blue;">function</span>
aa(){</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span>alert(<span style="color: #a31515;">"+function();"</span>);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">}();</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">这是，我们浏览器中的代码应该是这样的：</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: blue;">&lt;</span><span style="font-size: 10pt; color: #a31515;">html</span><span style="font-size: 10pt; color: blue;">&gt;</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span><span style="color: blue;">&lt;</span><span style="color: #a31515;">head</span><span style="color: blue;">&gt;</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span><span style="color: blue;">&lt;</span><span style="color: #a31515;">title</span><span style="color: blue;">&gt;</span>JavaScript </span><span style="font-size: 10pt;">高级编程 之 同名函数的执行顺序<span style="color: blue;">&lt;/</span><span style="color: #a31515;">title</span><span style="color: blue;">&gt;</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span><span style="color: blue;">&lt;</span><span style="color: #a31515;">script</span> <span style="color: red;">language</span><span style="color: blue;">="javascript"</span>
<span style="color: red;">type</span><span style="color: blue;">="text/javascript"&gt;</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span><span style="color: blue;">function</span> aa(){</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>alert(<span style="color: #a31515;">"first function"</span>);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>};</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>aa();</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>(<span style="color: blue;">function</span> aa(){</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>alert(<span style="color: #a31515;">"(function)();"</span>);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>})();</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>+<span style="color: blue;">function</span> aa(){</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>alert(<span style="color: #a31515;">"+function();"</span>);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>}();</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span><span style="color: blue;">&lt;/</span><span style="color: #a31515;">script</span><span style="color: blue;">&gt;</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span><span style="color: blue;">&lt;/</span><span style="color: #a31515;">head</span><span style="color: blue;">&gt;</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span><span style="color: blue;">&lt;</span><span style="color: #a31515;">body</span><span style="color: blue;">&gt;</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span><span style="color: blue;">&lt;/</span><span style="color: #a31515;">body</span><span style="color: blue;">&gt;</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: blue;">&lt;/</span><span style="font-size: 10pt; color: #a31515;">html</span><span style="font-size: 10pt; color: blue;">&gt;</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">现在让我们来想一想浏览器会出现怎样的结果<span>?</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">坐在后排的那哥们儿举手了。听听他怎么说，他说<span>:</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">&#8220;</span><span style="font-size: 10pt; color: green;">浏览器会按照<span>1.first function 2.(function)();
3.+function(); </span>方式执行</span><span style="font-size: 10pt; color: green;">&#8221;</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">我肯定一定会有很多人这样回答。好的，你可以坐下了。还是让我们去看看
执行的结果吧！</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">浏览器结果<span>: 1.+function();
2.(function)(); 3.+function(); </span>真是不可思议，为什么呢<span>?</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">难道浏览器会认为在函数前面写<span>+</span>或者<span>-</span>会
让函数的执行级别更高？事实并非如此！下面我们再写一个函数，便可以证明这个结论是错误的。</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: blue;">function</span><span style="font-size: 10pt;"> aa(){</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span>alert(<span style="color: #a31515;">"last function"</span>);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">};</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">或许，我们还会有带参的函数需要执行。</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: blue;">function</span><span style="font-size: 10pt;"> aa(msg){</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"><span>&nbsp;&nbsp;&nbsp;  </span>alert(msg);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">}</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;">aa(<span style="color: #a31515;">"hello
topcss!"</span>);</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">好了，我们再去看看浏览器是否执行最后一个函数，也就是带参的函数呢。</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">的确，事实正是如此，她执行了最后一个函数。太棒了。</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;"> </span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: green;">现在，我们得出了一个结论：</span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left;" align="left"><span style="font-size: 10pt; color: green;">当我们在一个<span>JavaScript</span>程
序中，同时出现多个同名函数时，浏览器会去执行最后一个函数。</span></p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/322192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-29 10:44 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/29/322192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串转Javascript JSon数组</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/19/321402.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 19 May 2010 10:44:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/19/321402.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/321402.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/19/321402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/321402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/321402.html</trackback:ping><description><![CDATA[&lt;script type="text/javascript"&gt;<br />
&nbsp;var str&nbsp;&nbsp; = '[ {"green":10,"size":5,"strock":12},{"green":10,"size":2,"strock":20} ]';<br />
&nbsp;var json = eval(str); <br />
alert(json[1].size); <br />
&lt;/script&gt;
<img src ="http://www.blogjava.net/jjshcc/aggbug/321402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-19 18:44 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/19/321402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jQuery帮助之工具 数组和对象操作 （一） jQuery.each(obj,callback)</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/19/321349.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 19 May 2010 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/19/321349.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/321349.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/19/321349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/321349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/321349.html</trackback:ping><description><![CDATA[通用例遍方法，可用于例遍对象和数组。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>不同于例遍 jQuery 对象的 $().each() 方法，此方法可用于例遍任何对象。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回调函数拥有两个参数：第一个为对象的成员或数组的索引，第二个为对应变量或内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果需要退出 each 循环可使回调函数返回 false，其它返回值将被忽略。</strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回值：Object<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参数：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>object</strong>(Object) :需要例遍的对象或数组。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>callback</strong>(Function) :(可选) 每个成员/元素执行的回调函数。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例遍数组，同时使用元素索引和内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>jQuery 代码:</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img id="Codehighlighter1_31_69_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_69_Open_Text.style.display='none'; Codehighlighter1_31_69_Closed_Image.style.display='inline'; Codehighlighter1_31_69_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_31_69_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_31_69_Closed_Text.style.display='none'; Codehighlighter1_31_69_Open_Image.style.display='inline'; Codehighlighter1_31_69_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #000000">$.each(&nbsp;[</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">],&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(i,&nbsp;n)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_31_69_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_31_69_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;alert(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Item&nbsp;#</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;n&nbsp;);<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">);&nbsp;</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例遍对象，同时使用成员名称和变量内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>jQuery 代码:</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img id="Codehighlighter1_8_35_Open_Image" onclick="this.style.display='none'; Codehighlighter1_8_35_Open_Text.style.display='none'; Codehighlighter1_8_35_Closed_Image.style.display='inline'; Codehighlighter1_8_35_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_8_35_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_8_35_Closed_Text.style.display='none'; Codehighlighter1_8_35_Open_Image.style.display='inline'; Codehighlighter1_8_35_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #000000">$.each(&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_8_35_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_8_35_Open_Text"><span style="color: #000000">{&nbsp;name:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">John</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;lang:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">JS</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(i,&nbsp;n)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_52_97_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_52_97_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;alert(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Name:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;Value:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;n&nbsp;);<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">);&nbsp;</span></div>
<img src ="http://www.blogjava.net/jjshcc/aggbug/321349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-19 11:26 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/19/321349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解Javascript闭包(closure)</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/18/321262.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 18 May 2010 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/18/321262.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/321262.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/18/321262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/321262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/321262.html</trackback:ping><description><![CDATA[<div class="Content"><span class="t18">
<p>最近在网上查阅了不少Javascript闭包 (closure)相关的资料，写的大多是非常的学术和专业。对于初学者来说别说理解闭包了，就连文字叙述都很难看懂。撰写此文的目的就是用最通俗的文字揭开Javascript闭包的真实面目。</p>
<p>一、什么是闭包？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;官方&#8221;的解释是：所谓&#8220;闭包&#8221;，指的是一个拥有许多变量和绑定了这些变量的环境的表达式（通常是一个函数），因而这些变量也是该表达式的一部分。相信很少有人能直接看懂这句话，因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包，因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。看下面这段代码： <br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img id="Codehighlighter1_12_69_Open_Image" onclick="this.style.display='none'; Codehighlighter1_12_69_Open_Text.style.display='none'; Codehighlighter1_12_69_Closed_Image.style.display='inline'; Codehighlighter1_12_69_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_12_69_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_12_69_Closed_Text.style.display='none'; Codehighlighter1_12_69_Open_Image.style.display='inline'; Codehighlighter1_12_69_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;a()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_12_69_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_12_69_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_40_56_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_56_Open_Text.style.display='none'; Codehighlighter1_40_56_Closed_Image.style.display='inline'; Codehighlighter1_40_56_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="display: none" id="Codehighlighter1_40_56_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_40_56_Closed_Text.style.display='none'; Codehighlighter1_40_56_Open_Image.style.display='inline'; Codehighlighter1_40_56_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;b()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_40_56_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_40_56_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;alert(</span><span style="color: #000000">++</span><span style="color: #000000">i);<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b;<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a();<br />
</span><span style="color: #008080">9</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />c();</span></div>
<p><br />
这段代码有两个特点：<br />
1、函数b嵌套在函数a内部；<br />
2、函数a返回函数b。<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/20100512101803780.jpg" width="228" height="175" /><br />
这样在执行完var c=a()后，变量c实际上是指向了函数b，再执行c()后就会弹出一个窗口显示i的值(第一次为1)。<span style="color: red">这段代码其实就创建了一个闭包，为什么？因为函数 a外的变量c引用了函数a内的函数b，就是说：当函数a的内部函数b被函数a外的一个变量引用的时候，就创建了一个闭包。</span><br />
我猜想你一定还是不理解闭包，因为你不知道闭包有什么作用，下面让我们继续探索。</p>
<p>二、闭包有什么作用？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简而言之<span style="color: red">，闭包的作用就是在a执行完并返回后，闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源，因为a的内部函数b的执行需要依赖a中的变量</span>。这是对闭包作用的非常直白的描述，不专业也不严谨，但大概意思就是这样，理解闭包需要循序渐进的过程。<br />
在上面的例子中，由于闭包的存在使得函数a返回后，a中的i始终存在，这样每次执行c()，i都是自加1后alert出i的值。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么我们来想象另一种情况，如果a返回的不是函数b，情况就完全不同了。因为a执行完后，b没有被返回给a的外界，只是被a所引用，而此时a也只会被b引 用，因此函数a和b互相引用但又不被外界打扰(被外界引用)，函数a和b就会被GC回收。(关于Javascript的垃圾回收机制将在后面详细介绍)</p>
<p>三、闭包内的微观世界<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;如果要更加深入的了解闭包以及函数a和嵌套函数b的关系，我们需要引入另外几个概念：函数的执行环境(excution context)、活动对象(call object)、作用域(scope)、作用域链(scope chain)。以函数a从定义到执行的过程为例阐述这几个概念。</p>
<p>1、当定义函数a的时候，js解释器会将函数a的作用域链(scope chain)设置为定义a时a所在的&#8220;环境&#8221;，如果a是一个全局函数，则scope chain中只有window对象。<br />
2、当函数a执行的时候，a会进入相应的执行环境(excution context)。<br />
3、在创建执行环境的过程中，首先会为a添加一个scope属性，即a的作用域，其值就为第1步中的scope chain。即a.scope=a的作用域链。<br />
4、然后执行环境会创建一个活动对象(call object)。活动对象也是一个拥有属性的对象，但它不具有原型而且不能通过JavaScript代码直接访问。创建完活动对象后，把活动对象添加到a 的作用域链的最顶端。此时a的作用域链包含了两个对象：a的活动对象和window对象。<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/20100512101829182.jpg" width="500" height="180" /><br />
5、下一步是在活动对象上添加一个arguments属性，它保存着调用函数a时所传递的参数。<br />
6、最后把所有函数a的形参和内部的函数b的引用也添加到a的活动对象上。在这一步中，完成了函数b的的定义，因此如同第3步，函数b的作用域链被设置为b所被定义的环境，即a的作用域。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到此，整个函数a从定义到执行的步骤就完成了。此时a返回函数b的引用给c，又函数b的作用域链包含了对函数a的活动对象的引用，也就是说b可以访问到a中定义的所有变量和函数。函数b被c引用，函数b又依赖函数a，因此函数a在返回后不会被GC回收。当函数b执行的时候亦会像以上步骤一样。因此，执行时b的作用域链包含了3个对象：b的活动对象、a的活动对象和window对象，如下图所示：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如图所示，当在函数b中访问一个变量的时候，搜索顺序是先搜索自身的活动对象，如果存在则返回，如果不存在将继续搜索函数a的活动对象，依 次查找，直到找到为止。如果整个作用域链上都无法找到，则返回undefined。如果函数b存在prototype原型对象，则在查找完自身的活动对象 后先查找自身的原型对象，再继续查找。这就是Javascript中的变量查找机制。</p>
<p>四、闭包的应用场景<br />
<span style="color: red">1、保护函数内的变量安全。以最开始的例子为例，函数a中i只有函数b才能访问，而无法通过其他途径访问到，因此保护了 i的安全性。<br />
2、在内存中维持一个变量。依然如前例，由于闭包，函数a中i的一直存在于内存中，因此每次执行c()，都会给i自加1。<br />
</span>以上两点是闭包最基本的应用场景，很多经典案例都源于此。</p>
<p>五、Javascript的垃圾回收机制<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Javascript中，如果一个对象不再被引用，那么这个对象就会被GC回收。如果两个对象互相引用，而不再被第3者所引用，那么这两个互相引用的对象也会被回收。因为函数a被b引用，b又被a外的c引用，这就是为什么函数a执行后不会被回收的原因。</p>
</span></div>
<img src ="http://www.blogjava.net/jjshcc/aggbug/321262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-18 13:34 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/18/321262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript-变量与作用域链</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/18/321260.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 18 May 2010 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/18/321260.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/321260.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/18/321260.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/321260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/321260.html</trackback:ping><description><![CDATA[jQuery片段： <br />
<br />
&nbsp;<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Will&nbsp;speed&nbsp;up&nbsp;references&nbsp;to&nbsp;window,&nbsp;and&nbsp;allows&nbsp;munging&nbsp;its&nbsp;name.&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;window&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Will&nbsp;speed&nbsp;up&nbsp;references&nbsp;to&nbsp;undefined,&nbsp;and&nbsp;allows&nbsp;munging&nbsp;its&nbsp;name.&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;undefined,&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Map&nbsp;over&nbsp;jQuery&nbsp;in&nbsp;case&nbsp;of&nbsp;overwrite&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;_jQuery&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;window.jQuery,&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Map&nbsp;over&nbsp;the&nbsp;$&nbsp;in&nbsp;case&nbsp;of&nbsp;overwrite&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;_$&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;window.$,&nbsp;&nbsp;<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;jQuery&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;window.jQuery&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;window.$&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(&nbsp;selector,&nbsp;context&nbsp;)&nbsp;{&nbsp;&nbsp;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;The&nbsp;jQuery&nbsp;object&nbsp;is&nbsp;actually&nbsp;just&nbsp;the&nbsp;init&nbsp;constructor&nbsp;'enhanced'&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&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;">new</span><span style="color: #000000;">&nbsp;jQuery.fn.init(&nbsp;selector,&nbsp;context&nbsp;);&nbsp;&nbsp;<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;A&nbsp;simple&nbsp;way&nbsp;to&nbsp;check&nbsp;for&nbsp;HTML&nbsp;strings&nbsp;or&nbsp;ID&nbsp;strings&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;(both&nbsp;of&nbsp;which&nbsp;we&nbsp;optimize&nbsp;for)&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;quickExpr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/^</span><span style="color: #000000;">[</span><span style="color: #000000;">^&lt;</span><span style="color: #000000;">]</span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">(.</span><span style="color: #000000;">|</span><span style="color: #000000;">\s)</span><span style="color: #000000;">+&gt;</span><span style="color: #000000;">)[</span><span style="color: #000000;">^&gt;</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;">#([\w</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;">/</span><span style="color: #000000;">,&nbsp;&nbsp;<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Is&nbsp;it&nbsp;a&nbsp;simple&nbsp;selector&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;isSimple&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</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;">*</span><span style="color: #000000;">$</span><span style="color: #000000;">/</span><span style="color: #000000;">;&nbsp; <br />
</span></div>
<br />
从这一节开始，我们剥掉jQuery的外衣，看看里面藏着些什么。前一节中曾经提及，如果单看外层的匿名函数，不看里面的实现的话，这个实现肯定不是闭包。但是，如果把jQuery的实现加上的话，这个肯定就是一种闭包应用。万丈高楼平地起，要了解闭包应用，就首先要了解它的基础。而这一节，我们遇到的片段，就是这个基础的所在——变量。（虽然这个片段包含众多知识点，但请容许我一个个慢慢分说。）<br />
<br />
声明变量 <br />
变量的英文名为variable，其前三个字母正是我们在JS声明变量的关键字——var。那么，我们先来看一下如何去声明一个变量：<br />
<br />
&nbsp;
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;">&nbsp;*&nbsp;声明变量的格式为&nbsp;<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #008000;">&nbsp;*&nbsp;var&nbsp;变量名&nbsp;初始化变量表达式列表（可选）&nbsp;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;">&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;b,&nbsp;c</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">test</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;d</span><span style="color: #000000;">=</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">b;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;虽然b还没有初始化，但是声明是合法的&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">alert(a);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"1"&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">alert(b);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"undefined"&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">alert(c);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"test"&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">alert(d);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"NaN"&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">alert(e);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;这里将引发编译错误："e"未定义&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;同样地，如果在初始化中使用未定义的变量，也会引发编译错误。</span></div>
<br />
<br />
如上例所示，声明变量需要使用var关键字，然后在空格后紧跟变量的名字。在声明变量的同时，我们也可以选择帮变量初始化。初始化的值可以是任何类型的值或表达式，但是，如果你尝试使用未定义的变量名来初始化，JS的编译器将会判定发生编译错误，并阻止程序继续往下运行。无论你是否对声明的变量进行初始化，你都可以继续声明第二个变量而无须使用var关键字。你所需要的只是运算符&#8220;,&#8221;。（关于运算符将在稍后章节详细讨论。）但当你没有对声明的变量进行初始化时，变量将会被赋予值&#8220;undefined&#8221;——undefined也是JS的固有类型之一。PS：JS中使用的运算符必须是半角的英文字符，甚至空格也一样。<br />
<br />
重复声明的变量？！ <br />
当我们声明了一个变量，而又在后续的代码中再次对他进行声明，结果会怎么样呢？或许在很多其他语言中，这都会引起重复定义的错误，但在JS中，这完全是合法的。并且，由于JS是弱数据类型，所以变量能被赋予任何类型的值。请看以下例子：<br />
<br />
&nbsp;<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">alert(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">&nbsp;a);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"number"</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;a;<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">alert(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">&nbsp;a);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"number"</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">alert(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">&nbsp;a);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"string"</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">a</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String(</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;">alert(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">&nbsp;a);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"object" <br />
</span></div>
<br />
<br />
看完上面的例子，你可能会产生两个疑问：<br />
<br />
a)为什么第二个a还是number？<br />
<br />
b)为什么第四个a是object？<br />
<br />
为了解答第一个问题，我们首先要了解声明一个变量到底是怎么运作的。而第二个问题，我们将他放到下一节再讨论。<br />
<br />
var 变量声明的工作步骤 <br />
当我们使用var关键字去声明变量的时候，JS解释器将会进行如下操作：<br />
<br />
1）预编译javascript代码块中所有非函数块内的var关键字；<br />
<br />
2）生成变量名标识并在其所在作用域分配空间；<br />
<br />
3）按代码顺序运行至第一个var关键字所在行；<br />
<br />
4）按变量声明列表表达式次序计算初始化表达式的值；<br />
<br />
5）每计算完一条初始化表达式，就将其计算结果赋予给对应的声明变量；<br />
<br />
6）继续运行后续代码至下一var关键字；<br />
<br />
7）重复4-7步到代码块结束；<br />
<br />
8）继续编译运行下一个代码块。<br />
<br />
PS：JS将以一个代码块，也就是一个script标签为单位去运行一段JS代码。<br />
<br />
正是因为var的工作方式，实际上程序执行时，解释器是根本看不到var关键字的。他执行的只是初始化表达式的赋值语句而已——所以问题a的答案就是例子中的第三句实际上什么事也没有做。所以，你一点也不用为代码中会否出现重复定义的变量名而烦恼。你真正需要担心的是，初始化语句所产生的变量的值的变化是否如你预期。除此之外，请不要尝试使用保留字作为变量名。这几乎在所有语言中都必须遵循的规范。<br />
<br />
另外，在函数块中声明变量的工作步骤也是类似的，但不同的是，他们是在函数运行时才创建的。<br />
<br />
没有var的变量声明？！ <br />
很多朋友都应该有这个经验——&#8220;我们根本不需要使用var来声明变量也能直接赋值啊！&#8221;。这是因为JS解释器在遇到赋值表达式的时候，会先在作用域链中寻找这个变量是否已经声明。如果这个变量没有声明，则隐式强制为其在全局（Global）作用域中声明，并将表达式的值赋予给该变量。<br />
<br />
但究竟为什么会这样呢？其实一切都源自于变量的获取规则和作用域链的化合作用外加赋值运算符的催化作用。<br />
<br />
作用域链 <br />
每个运行时的上下文都有与其对应的一个作用域。而作用域链正是把这些作用域连接起来的桥梁。它的作用与程序寻找某一变量标识有关：<br />
<br />
1）JS解释器会按调用的顺序把作用域加进作用域链（像栈般早进入的作用域会在作用域链的底部）；<br />
<br />
2）然后在程序寻找某一变量标识时进入作用域链中的第一个索引，并在其中寻找该变量标识；<br />
<br />
3）如果没有找到该标识，则前往下一个索引继续寻找；<br />
<br />
4）如果已经找到该标识，则将该标识及其值返回；<br />
<br />
5）当搜索到最后一个索引仍未能找到该标识，则在最后的索引上创建该标识，并使其值为null，最后返回该标识与值。<br />
<br />
PS：而上述的第5步发生的前提是该标识处于赋值运算符表达式左侧。<br />
<br />
因此，当你没有使用var声明变量而直接使用对该变量作初始化操作（简单赋值）时，JS会自动为你创建该空值标识，并让它可以顺利执行赋值语句。<br />
<br />
变量与作用域链 <br />
从上面的描述，我们可以很轻易的看到变量与作用域链的关系。因为只要程序需要寻找变量，就必须通过作用域链。而前面所谈及的闭包问题正是由此而来的。回想一下我们前面的示例代码：<br />
<br />
&nbsp;<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;abc</span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(y){&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">y;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;这个是局部变量&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;alert(x</span><span style="color: #000000;">++</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;就是这里调用了闭包特性中的一级函数局部变量的x，并对它进行操作&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;alert(y</span><span style="color: #000000;">--</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;引用的参数变量也是自由变量&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">}}(</span><span style="color: #000000;">5</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;初始化&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">abc();</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"5"&nbsp;"5"&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">abc();</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"6"&nbsp;"4"&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">abc();</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;"7"&nbsp;"3"&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">alert(x);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;报错！&#8220;x&#8221;未定义！ <br />
</span></div>
&nbsp;<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/jjshcc/aggbug/321260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-18 13:22 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/18/321260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>