<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_BeiYuu - 前端实验室</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/62434/rss</id><updated>2011-07-29T15:02:47Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/62434/rss"/><entry><id>http://www.cnblogs.com/beiyuu/archive/2011/07/29/install-nodejs.html</id><title type="text">windows下部署安装nodejs</title><summary type="text">nodejs作为一个新兴的后台语言，有很多吸引人的地方：RESTful API单线程非阻塞IOGoogle V8事件驱动Node的处理模型和现在常用的使用操作系统线程的并发模型不同。基于线程的网络相对效率低并且难以使用。与传统线程模型对每个新连接都要申请2M的线程堆栈相比，Node在高负载下表现出更好的内存效率。而且，Node用户不必关心进程死锁，因为Node里根本没有锁的概念。Node几乎没有直接执行IO操作的函数，进程也就永不阻塞，因为没有阻塞，即使不是专家也能编写快速的系统。Node在设计上受Ruby的Event Machine和Python的Twisted影响并且和它们有些像。Node</summary><published>2011-07-29T14:59:00Z</published><updated>2011-07-29T14:59:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2011/07/29/install-nodejs.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2011/07/29/install-nodejs.html"/><content type="html">&lt;p&gt;nodejs作为一个新兴的后台语言，有很多吸引人的地方：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;RESTful API&lt;/li&gt;&lt;li&gt;单线程&lt;/li&gt;&lt;li&gt;非阻塞IO&lt;/li&gt;&lt;li&gt;Google V8&lt;/li&gt;&lt;li&gt;事件驱动&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Node的处理模型和现在常用的使用操作系统线程的并发模型不同。基于线程的网络相对效率低并且难以使用。与传统线程模型对每个新连接都要申请2M的线程堆栈相比，Node在高负载下表现出更好的内存效率。而且，Node用户不必关心进程死锁，因为Node里根本没有锁的概念。Node几乎没有直接执行IO操作的函数，进程也就永不阻塞，因为没有阻塞，即使不是专家也能编写快速的系统。&lt;/p&gt;&lt;p&gt;Node在设计上受Ruby的Event Machine和Python的Twisted影响并且和它们有些像。Node更注重事件模型，它将事件循环作为语言结构而不是类库。在其它的系统中，一般会有一个阻塞的调用来开始事件循环，在脚本的开始使用回调函数定义一个行为，然后在最后通过调用阻塞的调用(例如EventMachine::run())来启动服务。Node没有这样的启动事件循环的函数调用，它执行完输入脚本后自动进入事件循环，这有点像浏览器的JavaScript，事件循环对用户隐藏了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在Linux上安装部署nodejs，相关的文档之类很完整，整个过程也比较简单，但是在windows上要部署nodejs，在之前还是要费点力气的，现在好了，有了官方的支持，一切就变的很简单了：&lt;/p&gt;&lt;p&gt;首先：下载这个nodejs的exe文件：http://nodejs.org/dist/v0.5.2/node.exe （目前还是不稳定版）&lt;/p&gt;&lt;p&gt;接着：进入node.exe的文件目录，然后新建一个hello.js文件，内容如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; http &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; require(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;http&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;http.createServer(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(req, res) {&lt;br /&gt;    res.writeHead(&lt;/span&gt;&lt;span style="color: #000000;"&gt;200&lt;/span&gt;&lt;span style="color: #000000;"&gt;, {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;Content-Type&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;: &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;text/plain&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    });&lt;br /&gt;    res.end(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;Hello World\n&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}).listen(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1337&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;127.0.0.1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;console.log(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;Server running at http://127.0.0.1:1337/&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后：打开cmd命令行，进入到node.exe的存放目录，或者可以把node.exe加入系统path中，这样就可以在任意地方执行了，执行上面这个文件&lt;/p&gt;&lt;p&gt;node hello.js&lt;/p&gt;&lt;p&gt;这个时候就可以看到：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/96117/2011072922565659.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;打开浏览器：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/96117/2011072922575448.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;恩，一切就绪了，可以开始了！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beiyuu/aggbug/2121557.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beiyuu/archive/2011/07/29/install-nodejs.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2011/07/20/js-localstorage-userdata.html</id><title type="text">js本地存储解决方案(localStorage与userData)</title><summary type="text">WEB应用的快速发展，是的本地存储一些数据也成为一种重要的需求，实现的方案也有很多，最普通的就是cookie了，大家也经常都用，但是cookie的缺点是显而易见的，其他的方案比如：IE6以上的userData，Firefox下面的globalStorage，以及Flash的本地存储，除了Flash之外，其他的几个都有一些兼容性的问题。sessionStorage与localStorageWeb Storage实际上由两部分组成：sessionStorage与localStorage。sessionStorage用于本地存储一个会话（session）中的数据，这些数据只有在同一个会话中的页面才能</summary><published>2011-07-19T17:02:00Z</published><updated>2011-07-19T17:02:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2011/07/20/js-localstorage-userdata.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2011/07/20/js-localstorage-userdata.html"/><content type="html">&lt;p&gt;WEB应用的快速发展，是的本地存储一些数据也成为一种重要的需求，实现的方案也有很多，最普通的就是cookie了，大家也经常都用，但是cookie的缺点是显而易见的，其他的方案比如：IE6以上的userData，Firefox下面的globalStorage，以及Flash的本地存储，除了Flash之外，其他的几个都有一些兼容性的问题。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;sessionStorage与localStorage&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Web Storage实际上由两部分组成：sessionStorage与localStorage。&lt;/p&gt;&lt;p&gt;sessionStorage用于本地存储一个会话（session）中的数据，这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储，仅仅是会话级别的存储。&lt;/p&gt;&lt;p&gt;localStorage用于持久化的本地存储，除非主动删除数据，否则数据是永远不会过期的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;userData&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;XML&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt; &amp;lt;Prefix: CustomTag ID=sID STYLE="behavior:url('#default#userData')" /&amp;gt;&lt;/p&gt;&lt;p&gt;HTML&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt; &amp;lt;ELEMENT STYLE="behavior:url('#default#userData')" ID=sID&amp;gt;&lt;/p&gt;&lt;p&gt;Scripting&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt; object .style.behavior = "url('#default#userData')"&lt;/p&gt;&lt;p&gt;object .addBehavior ("#default#userData")&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;属性:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;expires 设置或者获取 userData behavior 保存数据的失效日期。&lt;/p&gt;&lt;p&gt;XMLDocument 获取 XML 的引用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方法:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;getAttribute() 获取指定的属性值。&lt;/p&gt;&lt;p&gt;load(object) 从 userData 存储区载入存储的对象数据。&lt;/p&gt;&lt;p&gt;removeAttribute() 移除对象的指定属性。&lt;/p&gt;&lt;p&gt;save(object) 将对象数据存储到一个 userData 存储区。&lt;/p&gt;&lt;p&gt;setAttribute() 设置指定的属性值。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style="font-size: 1.5em;"&gt;localStorage&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方法：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;localStorage.getItem(key):获取指定key本地存储的值&lt;/p&gt;&lt;p&gt;localStorage.setItem(key,value)：将value存储到key字段&lt;/p&gt;&lt;p&gt;localStorage.removeItem(key):删除指定key本地存储的值&lt;/p&gt;&lt;p&gt;&lt;strong&gt;封装&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;localData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;        hname:location.hostname&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt;location.hostname:&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;localStatus&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;        isLocalStorage:window.localStorage&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;        dataDom:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;        initDom:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){ //初始化userData&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; document.createElement(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;input&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);//这里使用hidden的&lt;i&gt;input元素&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.type &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;hidden&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.style.display &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;none&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.addBehavior(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;#default#userData&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);//这是userData的语法&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    document.body.appendChild(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; exDate &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Date();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    exDate &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; exDate.getDate()&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;30&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.expires &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; exDate.toUTCString();//设定过期时间&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;(ex){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;        },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;        set:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(key,value){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.isLocalStorage){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;                window.localStorage.setItem(key,value);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.initDom()){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.load(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.hname);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.setAttribute(key,value);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.save(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.hname)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;        },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;        get:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(key){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.isLocalStorage){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; window.localStorage.getItem(key);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.initDom()){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.load(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.hname);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.getAttribute(key);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt; &lt;span style="color: #000000;"&gt;        },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt; &lt;span style="color: #000000;"&gt;        remove:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(key){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.isLocalStorage){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt; &lt;span style="color: #000000;"&gt;                localStorage.removeItem(key);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.initDom()){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.load(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.hname);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.removeAttribute(key);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.dataDom.save(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.hname)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;使用方法就很简单了，这节set,get,remove就好了。&lt;/p&gt;&lt;p&gt;下面这个例子，在你输入之后，然后刷新页面，也会保留相应的值。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;input id="localDataHook" type="text" /&gt;&lt;input type="button" id="clearBtnHook" value="清除" /&gt;&lt;/p&gt;&lt;script type="text/javascript"&gt;// &lt;![CDATA[(function(){window.localData = {        hname:location.hostname?location.hostname:'localStatus',        isLocalStorage:window.localStorage?true:false,        dataDom:null,        initDom:function(){            if(!this.dataDom){                try{                    this.dataDom = document.createElement('input');                    this.dataDom.type = 'hidden';                    this.dataDom.style.display = "none";                    this.dataDom.addBehavior('#default#userData');                    document.body.appendChild(this.dataDom);                    var exDate = new Date();                    exDate = exDate.getDate()+30;                    this.dataDom.expires = exDate.toUTCString();                }catch(ex){                    return false;                }            }            return true;        },        set:function(key,value){            if(this.isLocalStorage){                window.localStorage.setItem(key,value);            }else{                if(this.initDom()){                    this.dataDom.load(this.hname);                    this.dataDom.setAttribute(key,value);                    this.dataDom.save(this.hname)                }            }        },        get:function(key){            if(this.isLocalStorage){                return window.localStorage.getItem(key);            }else{                if(this.initDom()){                    this.dataDom.load(this.hname);                    return this.dataDom.getAttribute(key);                }            }        },        remove:function(key){            if(this.isLocalStorage){                localStorage.removeItem(key);            }else{                if(this.initDom()){                    this.dataDom.load(this.hname);                    this.dataDom.removeAttribute(key);                    this.dataDom.save(this.hname)                }            }        }    }    var text = document.getElementById('localDataHook');    var btn = document.getElementById('clearBtnHook');    window.onbeforeunload = function(){        localData.set('beiyuuData',text.value);    }    btn.onclick = function(){localData.remove('beiyuuData');text.value=''};    if(localData.get('beiyuuData')){        text.value = localData.get('beiyuuData');    }})()// ]]&gt;&lt;/script&gt;&lt;img src="http://www.cnblogs.com/beiyuu/aggbug/2111032.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beiyuu/archive/2011/07/20/js-localstorage-userdata.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2011/07/18/iframe-tech-performance.html</id><title type="text">iframe异步加载技术及性能</title><summary type="text">这是一篇原创翻译文章。原文地址。我们会经常使用iframes来加载第三方的内容、广告或者插件。使用iframe是因为他可以和主页面并行加载，不会阻塞主页面。当然使用iframe也是有利有弊的：Steve Souders在他的blog里面有阐述：Using Iframes Sparingly:iframe会阻塞主页面的onload事件主页面和iframe共享同一个连接池阻塞主页面的onload是这两个问题中最影响性能的方面。一般都是想让onload时间越早触发越好，一方面是用户体验过更重要的是google给网站的加载速度的打分：用户可以用IE和FF中Google工具栏来计时。那么为了提高页面性能</summary><published>2011-07-18T13:21:00Z</published><updated>2011-07-18T13:21:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2011/07/18/iframe-tech-performance.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2011/07/18/iframe-tech-performance.html"/><content type="html">&lt;p&gt;这是一篇原创翻译文章。&lt;a href="http://www.aaronpeters.nl/blog/iframe-loading-techniques-performance?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+aaronpeters+(Aaron+Peters)" target="_blank"&gt;原文地址&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我们会经常使用iframes来加载第三方的内容、广告或者插件。使用iframe是因为他可以和主页面并行加载，不会阻塞主页面。当然使用iframe也是有利有弊的：Steve Souders在他的blog里面有阐述：&lt;a href="http://www.stevesouders.com/blog/2009/06/03/using-iframes-sparingly/" target="_blank"&gt;Using Iframes Sparingly&lt;/a&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;iframe会阻塞主页面的onload事件&lt;/li&gt;&lt;li&gt;主页面和iframe共享同一个连接池&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;阻塞主页面的onload是这两个问题中最影响性能的方面。一般都是想让onload时间越早触发越好，一方面是用户体验过更重要的是google给网站的加载速度的打分：用户可以用IE和FF中Google工具栏来计时。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;那么为了提高页面性能，怎样才能不阻塞主页面的onload事件的来加载iframe呢？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这篇讲了四种加载iframe的方法：普通iframe，onload之后加载iframe，setTimeout() iframe和异步加载iframe。每种方法的加载结果我都用IE8的时间线来展示。我建议多注意下动态异步加载这个方法，因为这是性能表现最佳的。另外，还有一种友好iframe(friendly iframe)技术。他可能算不上是iframe加载的技术，但是必须使用iframe，他是无阻塞加载的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;普通方法加载iframe&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这是一种人尽皆知的普通加载方法，它没有浏览器的兼容性问题。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;iframe &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="/path/to/file"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; frameborder&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="728"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="90"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; scrolling&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="auto"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;iframe&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;使用这种加载方法会在各浏览器中有如下表现：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;iframe会在主页面的onload之前加载&lt;/li&gt;&lt;li&gt;iframe会在所有iframe的内容都加载完毕之后触发iframe的onload&lt;/li&gt;&lt;li&gt;主页面的onload会在iframes的onload触发之后触发，所以iframe会阻塞主页面的加载&lt;/li&gt;&lt;li&gt;当iframe在加载的过程中，浏览器的会标识正在加载东西，处于忙碌状态。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.aaronpeters.nl/sandbox/wpo/iframe-normal.html" target="_blank"&gt;这里&lt;/a&gt;是一个演示页面，时间线图显示出iframe会阻塞主页面的加载。&lt;/p&gt;&lt;div&gt;&lt;img src="http://www.aaronpeters.nl/blog/images/iframe/normal-iframe-IE8-waterfall-big.png" width="960" height="121" /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;我的建议：注意onload阻塞。如果iframe的内容只需要很短的时间来加载和执行，那么也不是个大问题，而且使用这种方法还有个好处是可以和主页面并行加载。但是如果加载这个iframe需要很长时间，用户体验就很差了。你得自己测试一下然后在http://www.webpagetest.org/也做些测试，根据onload的时间看看是否需要其他加载方法。&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;在onload之后加载iframe&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;如果你想在iframe中加载一些内容，但是这些内容对于页面来说不是那么的重要。或者这些内容不需要马上展现给用户的，需要点击触发之类的。那么可以考虑在主页面载入之后加载iframe。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;doesn't block the load event&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; createIframe() {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; document.createElement(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;iframe&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    i.src &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;path/to/file&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    i.scrolling &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;auto&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;    i.frameborder &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;    i.width &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;200px&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;    i.height &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;100px&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;    document.getElementById(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;div-that-holds-the-iframe&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).appendChild(i);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Check for browser support of event handling capability&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (window.addEventListener) window.addEventListener(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;load&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, createIframe, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (window.attachEvent) window.attachEvent(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;onload&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, createIframe);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; window.onload &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; createIframe;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这种加载方法也是没有浏览器的兼容性问题的：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;iframe会在主页面onload之后开始加载&lt;/li&gt;&lt;li&gt;主页面的onload事件触发与iframe无关，所以iframe不会阻塞加载&lt;/li&gt;&lt;li&gt;当iframe加载的时候，浏览器会标识正在加载&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.aaronpeters.nl/sandbox/wpo/iframe-dynamic-after-onload.html" target="_blank"&gt;这是&lt;/a&gt;是一个测试页面，时间线图如下&lt;/p&gt;&lt;div&gt;&lt;img src="http://s1.aaronpeters.nl/blog/images/iframe/iframe-after-onload-IE8-waterfall-small.png" /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;这种方法比普通方法有什么好处呢？load事件会马上触发，有两个好处：&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;其他等待主页面onload事件的代码可以尽早执行&lt;/li&gt;&lt;li&gt;Google Toolbar计算你页面加载的时间会大大减少&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;但是，当iframe加载的时候，还是会看到浏览器的忙碌状态，相对于普通加载方法，用户看到忙碌状态的时间更长。还有就是用户还没等到页面完全加载完的时候就已经离开了。有些情况下这是个问题，比如广告。&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;setTimeout()来加载iframe&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;这种方法的目的是不阻塞onload事件。&lt;/div&gt;&lt;div&gt;Steve Souders(又是他？)有一个这种方法的测试页面(http://stevesouders.com/efws/iframe-onload-nonblocking.php)。他写道：&amp;ldquo;src通过setTimeout动态的设置，这种方法可以再所有的浏览器中避免阻塞&amp;rdquo;。&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;iframe id&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;iframe1&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; src&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt; width&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;200&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; height&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; border&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;iframe&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; setIframeSrc() {&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; s &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;path/to/file&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; iframe1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; document.getElementById(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;iframe1&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ( &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; navigator.userAgent.indexOf(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;MSIE&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)) {&lt;br /&gt;        iframe1.src &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; s;&lt;br /&gt;    } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;        iframe1.location &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; s;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;setTimeout(setIframeSrc, &lt;/span&gt;&lt;span style="color: #000000;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;在除了IE8以外的所有浏览器中会有如下表现：&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;iframe会在主页面onload之前开始加载&lt;/li&gt;&lt;li&gt;iframe的onload事件会在iframe的内容都加载完毕之后触发&lt;/li&gt;&lt;li&gt;iframe不会阻塞主页面的onload事件(IE8除外)&lt;/li&gt;&lt;li&gt;为什么不会阻塞主页面的onload呢(IE8除外)？因为setTimeout()&lt;/li&gt;&lt;li&gt;当iframe加载的时候，浏览器会显示忙碌状态&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;下面是时间线图&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://s1.aaronpeters.nl/blog/images/iframe/iframe-settimeout-IE8-waterfall-small.png" /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;因为IE8的问题，这种技术就不适合很多网站了。如果有超过10%的用户使用IE8,十分之一的用户体验就会差。你会说那也只是比普通加载差一点点，其实普通加载性能上也不差。onload事件对于10%的用户来说都更长。。。。额，你自己考虑吧。但是最好在看了下面这个很赞的异步加载方法之后再决定吧。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;我在参加Velocity 2010的时候，Meebo的两个工程师(@marcuswestin and Martin Hunt)做了一个关于他们的Meebo Bar的演讲。他们使用iframe来加载一些插件，并且真正做到了无阻塞加载。对于有的开发者来说，他们的做法还比较新鲜。很赞，超级赞。但是一些原因导致这种技术没有得到相应的关注，我希望这篇blog能把它发扬光大。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(d) {&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; iframe &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; d.body.appendChild(d.createElement(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;iframe&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)),&lt;br /&gt;    doc &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; iframe.contentWindow.document;&lt;br /&gt; &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; style the iframe with some CSS&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    iframe.style.cssText &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;position:absolute;width:200px;height:100px;left:0px;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt; &lt;br /&gt;    doc.open().write(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;body onload="&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;var d = document;d.getElementsByTagName(\'head\')[0].&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;appendChild(d.createElement(\'script\')).src&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;=\'\/path\/to\/file\'"&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &lt;br /&gt;    doc.close(); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;iframe onload event happens&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;})(document);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;神奇的地方就在&amp;lt;body onload=&amp;rdquo;"&amp;gt;:这个iframe一开始没有内容，所以onload会立即触发。然后你创建一个script元素，用他来加载内容、广告、插件什么的，然后再把这个script添加到HEAD中去，这样iframe内容的加载就不会阻塞主页面的onload！你应该看看他在个浏览器中的表现：&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;iframe会在主页面onload之前开始加载&lt;/li&gt;&lt;li&gt;iframe的onload会立即触发，因为iframe的内容一开始为空&lt;/li&gt;&lt;li&gt;主页面的onload不会被阻塞&lt;/li&gt;&lt;li&gt;为什么这个iframe不会阻塞主页面的onload？因为&amp;lt;body onload=&amp;rdquo;"&amp;gt;&lt;/li&gt;&lt;li&gt;如果你不在iframe使用onload监听，那么iframe的加载就会阻塞主页面的onload&lt;/li&gt;&lt;li&gt;当iframe加载的时候，浏览器终于不显示忙碌状态了（非常好）&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.aaronpeters.nl/sandbox/wpo/iframe-dynamic-asynch.html" target="_blank"&gt;我的测试页&lt;/a&gt;给出下面的时间线：&lt;/div&gt;&lt;div&gt;&lt;img src="http://s1.aaronpeters.nl/blog/images/iframe/iframe-dynamic-asynch-IE8-waterfall-small.png" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;转义字符让代码看着有些难受，这都不是问题。试试吧。&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;友好型iframe加载&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;这是用来加载广告的。虽然这不是一种iframe的加载技术，但是是用iframe来盛放广告的。他的亮点不在于iframe如何加载，而是主页面、iframe、广告如何协同工作的。如下：&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;先创建一个iframe。设置他的src为一个相同域名下的静态html文件&lt;/li&gt;&lt;li&gt;在这个iframe里面，设置js变量inDapIF=true来告诉广告它已经加载在这个iframe里面了&lt;/li&gt;&lt;li&gt;在这个iframe里面，创建一个script元素加上广告的url作为src，然后像普通广告代码一样加载&lt;/li&gt;&lt;li&gt;当广告加载完成，重置iframe大小来适应广告&lt;/li&gt;&lt;li&gt;这种方法也没有浏览器的兼容性问题。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.iab.net/media/file/rich_media_ajax_best_practices.pdf" target="_blank"&gt;Ad Ops Council在推荐过这个方法&lt;/a&gt;，AOL也是用这种方法。想看看源码：&lt;a href="http://www.artzstudio.com/files/fif-demo/" target="_blank"&gt;这里有一个&lt;/a&gt;。一家瑞典的出版社Aftonbladet对于这种加载有很不错的结论：在他们的主页上，加载时间减少30%，用户每周增加7%，新闻部分的点击量增加35%。我建议可以看看他们的资料：&lt;a href="http://www.slideshare.net/jarlund/hign-performance-web-sites-with-ads-dont-let-third-parties-make-you-slow" target="_blank"&gt;High Performance Web Sites, With Ads: Don&amp;rsquo;t let third parties make you slow&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;我没有创建相关的测试页，所以也没有第一首的资料。从我调研的结果来说：&lt;/div&gt;&lt;div&gt;如果你只想在你的网页上调用一个确定的src地址的iframe的话这个方法不是很有用。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;如果你想在网页上展示多个广告，比较灵活的方法的是：加载一个广告，然后更新iframe加载另一个主页面的DOMContentLoaded时间不会被阻塞，页面渲染也不会被阻塞，当然，主页面的onload事件还是会被阻塞。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/beiyuu/aggbug/2109979.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beiyuu/archive/2011/07/18/iframe-tech-performance.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2011/07/17/cnblogs-weibo.html</id><title type="text">给博客园加上新浪微薄的挂件</title><summary type="text">很多博客都可以自己添加修改一些代码，但是作为博客平台来说，可能为了安全考虑，很多时候要过滤一些特性，比如：新浪微博的挂件是iframe形式的，但是博客园不支持iframe。经过一些尝试，最终有了下面两种解决办法：首先先在公告中写一个空div，方便我们插入新建的iframe，省的用class选来选去的麻烦：&lt;div id="weiboIframe"&gt;&lt;/div&gt;1、在公告中直接用innerHTML插入iframe代码：innerHTML是很很简单的，从新浪微博的配置中，配好你自己想要的样式，然后他会自动生成一段html代码，类似下面这样的：&lt;if</summary><published>2011-07-17T04:18:00Z</published><updated>2011-07-17T04:18:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2011/07/17/cnblogs-weibo.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2011/07/17/cnblogs-weibo.html"/><content type="html">&lt;p&gt;很多博客都可以自己添加修改一些代码，但是作为博客平台来说，可能为了安全考虑，很多时候要过滤一些特性，比如：新浪微博的挂件是iframe形式的，但是博客园不支持iframe。经过一些尝试，最终有了下面两种解决办法：&lt;/p&gt;&lt;p&gt;首先先在公告中写一个空div，方便我们插入新建的iframe，省的用class选来选去的麻烦：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="weiboIframe"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;1、在公告中直接用innerHTML插入iframe代码：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;innerHTML是很很简单的，从新浪微博的配置中，配好你自己想要的样式，然后他会自动生成一段html代码，类似下面这样的：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;iframe &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="100%"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="100"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="share_self"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;  frameborder&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="0"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; scrolling&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="no"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://widget.weibo.com/weiboshow/index.php?width=0&amp;amp;height=100&amp;amp;fansRow=1&amp;amp;ptype=1&amp;amp;speed=0&amp;amp;skin=1&amp;amp;isTitle=1&amp;amp;noborder=0&amp;amp;isWeibo=0&amp;amp;isFans=0&amp;amp;uid=1855270953&amp;amp;verifier=375b89d6"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;iframe&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="text-decoration: line-through;"&gt;但是如果你直接写成下面这个样子的话，不会生效的：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; ifr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;iframe width="100%" height="100" class="share_self"  frameborder="0" scrolling="no" src="http://widget.weibo.com/weiboshow/index.php?width=0&amp;amp;height=100&amp;amp;fansRow=1&amp;amp;ptype=1&amp;amp;speed=0&amp;amp;skin=1&amp;amp;isTitle=1&amp;amp;noborder=0&amp;amp;isWeibo=0&amp;amp;isFans=0&amp;amp;uid=1855270953&amp;amp;verifier=375b89d6"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;document.getElementById(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;weiboIframe&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).innerHTML &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ifr;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;估计博客园后台直接去匹配iframe文本，所以我们把这个打乱，这样，他应该不会去检测逻辑，改成这样就成功了：&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;script type&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; ifr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;ifra&lt;/span&gt;&lt;span style="color: #000000;"&gt;';&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;ifr &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;me width="100%" height="115" class="share_self"  frameborder="0" scrolling="no" src="http://widget.weibo.com/weiboshow/index.php?width=0&amp;amp;height=100&amp;amp;fansRow=1&amp;amp;ptype=1&amp;amp;speed=0&amp;amp;skin=1&amp;amp;isTitle=1&amp;amp;noborder=0&amp;amp;isWeibo=0&amp;amp;isFans=0&amp;amp;uid=1855270953&amp;amp;verifier=375b89d6"&amp;gt;&amp;lt;/ifr&lt;/span&gt;&lt;span style="color: #000000;"&gt;';&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;ifr &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;ame&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;document.getElementById('weiboIframe').innerHTML = ifr;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、还可以使用createElement方法：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;因为这里有人用过Google Adsense的代码，所以猜测这个方法是可以使用的，经过测试，确实可用，就是比上面那个要多写一些东西：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;script type&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;text/javascript&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; iii &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; document.createElement(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;iframe&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;iii.src &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;http://widget.weibo.com/weiboshow/index.php?width=0&amp;amp;height=100&amp;amp;fansRow=1&amp;amp;ptype=1&amp;amp;speed=0&amp;amp;skin=1&amp;amp;isTitle=1&amp;amp;noborder=0&amp;amp;isWeibo=0&amp;amp;isFans=0&amp;amp;uid=1855270953&amp;amp;verifier=375b89d6&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;iii.height &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;115&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;iii.width &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;100%&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;iii.className &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;share_self&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;iii.scrolling &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;no&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;document.getElementById(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;weiboIframe&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;).appendChild(iii);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;把上面这些弄到公告里面去，就可以显示你的新浪微博的挂件了，很简单了，&lt;strong&gt;&lt;span style="font-size: 15px;"&gt;可以在微薄关注我：&lt;a href="http://weibo.com/beiyuu" target="_blank"&gt;http://weibo.com/beiyuu&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beiyuu/aggbug/2108657.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beiyuu/archive/2011/07/17/cnblogs-weibo.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2011/03/21/process-large-volumes-javascript.html</id><title type="text">如何在JavaScript中处理大量数据</title><summary type="text">在之前的文章中，我们讲了浏览器对于JavaScript代码执行的限制和基于计时器的伪线程机制。这里，我们再看看如何在JavaScript中处理大量数据。在几年之前，开发人员不会去考虑在服务端之外处理大量的数据。现在这种观念已经改变了，很多Ajax程序需要在客户端和服务器端传输大量的数据。此外，更新DOM节点的处理在浏览器端来看也是一个很耗时的工作。而且，需要对这些信息进行分析处理的时候也很可能导致程序无响应，浏览器抛出错误。将需要大量处理数据的过程分割成很多小段，然后通过JavaScript的计时器来分别执行，就可以防止浏览器假死。先看看怎么开始：1 function ProcessArray</summary><published>2011-03-21T02:23:00Z</published><updated>2011-03-21T02:23:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2011/03/21/process-large-volumes-javascript.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2011/03/21/process-large-volumes-javascript.html"/><content type="html">&lt;p&gt;在之前的文章中，我们讲了&lt;a title="浏览器对JavaScript代码执行的限制" href="http://rockux.com/archives/%e6%b5%8f%e8%a7%88%e5%99%a8%e5%af%b9javascript%e4%bb%a3%e7%a0%81%e6%89%a7%e8%a1%8c%e7%9a%84%e9%99%90%e5%88%b6" target="_blank"&gt;浏览器对于JavaScript代码执行的限制&lt;/a&gt;和&lt;a title="JavaScript基于计时器的伪线程机制" href="http://rockux.com/archives/javascript%e5%9f%ba%e4%ba%8e%e8%ae%a1%e6%97%b6%e5%99%a8%e7%9a%84%e4%bc%aa%e7%ba%bf%e7%a8%8b%e6%9c%ba%e5%88%b6" target="_blank"&gt;基于计时器的伪线程机制&lt;/a&gt;。这里，我们再看看如何在JavaScript中处理大量数据。&lt;/p&gt;&lt;p&gt;在几年之前，开发人员不会去考虑在服务端之外处理大量的数据。现在这种观念已经改变了，很多Ajax程序需要在客户端和服务器端传输大量的数据。此外，更新DOM节点的处理在浏览器端来看也是一个&lt;a title="维护和加速WordPress的必备技巧" href="http://rockux.com/archives/%e7%bb%b4%e6%8a%a4%e5%92%8c%e5%8a%a0%e9%80%9fwordpress%e7%9a%84%e5%bf%85%e5%a4%87%e6%8a%80%e5%b7%a7" target="_blank"&gt;很耗时的工作&lt;/a&gt;。而且，需要对这些信息进行分析处理的时候也很可能导致程序无响应，&lt;a title="浏览器对JavaScript代码执行的限制" href="http://rockux.com/archives/%e6%b5%8f%e8%a7%88%e5%99%a8%e5%af%b9javascript%e4%bb%a3%e7%a0%81%e6%89%a7%e8%a1%8c%e7%9a%84%e9%99%90%e5%88%b6" target="_blank"&gt;浏览器抛出错误&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;将需要大量处理数据的过程分割成很多小段，然后通过JavaScript的计时器来分别执行，就可以防止浏览器假死。先看看怎么开始：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; ProcessArray(data,handler,callback){&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;ProcessArray()方法支持三个参数：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;data:需要处理的数据&lt;/li&gt;&lt;li&gt;handler:处理每条数据的函数&lt;/li&gt;&lt;li&gt;callback:回调函数&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;然后定义一些变量：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; maxtime &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; delay &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;20&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; queue &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; data.concat();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;maxtime表示每个处理进程的最大毫秒数。delay表示每个程序块之间的毫秒数。queue是源数据的复制，虽然不是在所有情景下都必要，但是我们是通过传递引用修改的，所以最好还是备份一下。&lt;/p&gt;&lt;p&gt;然后就可以使用setTimeout()方法来处理了：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;setTimeout(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; endtime &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Date()  &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; maxtime;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;          hanler(queue.shift());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;     }&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;(queue.length&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; endtime &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Date());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;首先，先计算endtime，这是程序处理的最大时间。do.while 循环用来处理每一个小块的数据，直到循环全部完成或者超时。&lt;/p&gt;&lt;p&gt;为什么使用do..while循环呢？&lt;br /&gt;JavaScript支持while和do&amp;hellip;while循环。不同之处在于do..while循环回至少执行一次。如果使用while循环，那么当开发者设置一个很小或者很低的endtime值的时候，那么处理就根本不会执行了。&lt;/p&gt;&lt;p&gt;最后，我们再决定是否需要处理其他的数据，如果需要，那么就再调用一次：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (queue.length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;      setTimeout(arguments.callee, delay);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (callback) callback();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;  }, delay);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;8&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样回调函数会在每一个数据都处理结束的时候执行。我们可以通过ProcessArray()来测试一小组数据：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; process an individual data item&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; Process(dataitem) {&lt;br /&gt;  console.log(dataitem);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; processing is complete&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; Done() {&lt;br /&gt;  console.log(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Done&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; test data&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; data &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;500&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;) data[i] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; i;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; process all items&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ProcessArray(data, Process, Done);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这个方法在任何浏览器中都可以执行，不过HTML5提供了更好的办法，Rockux在以后的文章中会提到。（&lt;a target="_blank" href="http://blogs.sitepoint.com/2010/12/08/javascript-large-data-processing/"&gt;英文&lt;/a&gt;）&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beiyuu/aggbug/1989974.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beiyuu/archive/2011/03/21/process-large-volumes-javascript.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2011/02/26/functional-vs-oo-js-program.html</id><title type="text">函数型 VS 面向对象型的javascript程序设计</title><summary type="text">原文点击这里灵活的js语言可以轻易的就完成截然相反的两种编程模式–函数型程序设计和面向对象的程序设计。js原生的支持将函数当做变量来处理。你可以将一个函数赋值给一个变量，然后把他传给其他的变量。抽象的说，我们可以认为js的函数是一个特殊的变量：只不过他的形式是“函数”。js原生的也提供对象。在js中，对象可以认为是一系列平面化的属性值和方法。他们看起来像是一个数据字典，而不像你在其他诸如java、c++、c#中看到的对象那样。在经典的面向对象编程中，类表示可以通过new操作符来生成一个实例的模板。但是在js中，没有可以当做蓝本来生成对象的。在js中，一个对象的蓝本更像是一个数据字典。所以在js</summary><published>2011-02-26T11:21:00Z</published><updated>2011-02-26T11:21:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2011/02/26/functional-vs-oo-js-program.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2011/02/26/functional-vs-oo-js-program.html"/><content type="html">&lt;p&gt;&lt;a target="_blank" href="http://rockux.com/archives/函数型-vs-面向对象型的javascript程序设计"&gt;原文点击这里&lt;/a&gt;&lt;/p&gt;&lt;p&gt;灵活的js语言可以轻易的就完成截然相反的两种编程模式&amp;ndash;函数型程序设计和面向对象的程序设计。&lt;/p&gt;&lt;p&gt;js原生的支持将函数当做变量来处理。你可以将一个函数赋值给一个变量，然后把他传给其他的变量。抽象的说，我们可以认为js的函数是一个特殊的变量：只不过他的形式是&amp;ldquo;函数&amp;rdquo;。&lt;/p&gt;&lt;p&gt;js原生的也提供对象。在js中，对象可以认为是一系列平面化的属性值和方法。他们看起来像是一个数据字典，而不像你在其他诸如java、c++、c#中看到的对象那样。在经典的面向对象编程中，类表示可以通过new操作符来生成一个实例的模板。但是在js中，没有可以当做蓝本来生成对象的。在js中，一个对象的蓝本更像是一个数据字典。所以在js中，你可以创建对象，然后可以在对象中存储数据。当然，js的对象也提供一定程度的面向对象的特性，比如封装和继承。&lt;/p&gt;&lt;p&gt;js开发越来越热，两种模式的优劣是什么？js对两种模式都支持，但是问题的答案得你自己来弄清楚。它两种都支持，但并不是某一种特别的合适。OOP的js框架和函数型的js都同时存在。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;函数型程序设计简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;函数型程序设计中，每个代码段都是在&amp;rdquo;function&amp;rdquo;之上建立的，这与传统的OOP建立在&amp;rdquo;class&amp;rdquo;之上是不同的。一个函数只是对输入的展现的一种操作。一个函数只是接收一些输入，然后返回一些输出，其他的都是隐藏起来的。&lt;/p&gt;&lt;p&gt;在函数型程序设计中，你通过在一个函数中调用其他的函数来完成程序的输入与输出。这通常都没有可以处理输入、存储数据以及一系列的状态更新的那一层。函数就像一个数值一样，可以作为参数传递给其他函数。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;javascript与函数型程序设计&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需要明确的一个事实是：js并不是像F#那样真正的函数型程序设计语言，虽然他有一些函数型程序设计模式的特性。利用这些特性，你也可以用js做很好的工作。到今天为止，使用jQuery就是这种模式最广泛的应用了。&lt;/p&gt;&lt;p&gt;匿名函数是函数型程序设计的精华之所在。匿名函数是lambda计算式的另一种形式，一种可以适配经流行的编码风格。&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;3&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;x&lt;span&gt;,&lt;/span&gt;y&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;return&lt;/span&gt; x &lt;span&gt;+&lt;/span&gt; y&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;普通函数和匿名的函数的唯一区别就在于名字。在函数的上下文中，当你只是需要函数的返回值作为参数来使用的时候，并不是非得要给他一个函数名。通过下面这个例子我们来看看：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;3&lt;br/&gt;4&lt;br/&gt;5&lt;br/&gt;6&lt;br/&gt;7&lt;br/&gt;8&lt;br/&gt;9&lt;br/&gt;10&lt;br/&gt;11&lt;br/&gt;12&lt;br/&gt;13&lt;br/&gt;14&lt;br/&gt;15&lt;br/&gt;16&lt;br/&gt;17&lt;br/&gt;18&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;span&gt;// 一个用来计算和的函数&lt;/span&gt;&lt;br/&gt;&lt;span&gt;var&lt;/span&gt; CalcTotal &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;x&lt;span&gt;,&lt;/span&gt; y&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br/&gt;   &lt;span&gt;return&lt;/span&gt; x &lt;span&gt;+&lt;/span&gt; y&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&lt;span&gt;// 增加税率&lt;/span&gt;&lt;br/&gt;&lt;span&gt;var&lt;/span&gt; AddTaxes &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;x&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;return&lt;/span&gt; x &lt;span&gt;*&lt;/span&gt; &lt;span&gt;1.2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&lt;span&gt;// 最终的计算函数&lt;/span&gt;&lt;br/&gt;&lt;span&gt;var&lt;/span&gt; CalcTotalPlusTaxes &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;fnCalcTotal&lt;span&gt;,&lt;/span&gt; fnAddTaxes&lt;span&gt;,&lt;/span&gt; x&lt;span&gt;,&lt;/span&gt; y&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;return&lt;/span&gt; fnAddTaxes&lt;span&gt;(&lt;/span&gt;fnCalcTotal&lt;span&gt;(&lt;/span&gt;x&lt;span&gt;,&lt;/span&gt; y&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&lt;span&gt;// 执行&lt;/span&gt;&lt;br/&gt;&lt;span&gt;var&lt;/span&gt; result &lt;span&gt;=&lt;/span&gt; CalcTotalPlusTaxes&lt;span&gt;(&lt;/span&gt;CalcTotal&lt;span&gt;,&lt;/span&gt; AddTaxes&lt;span&gt;,&lt;/span&gt; &lt;span&gt;40&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;60&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;alert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;result&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;需要注意的是，你也可以使用匿名函数，而不是非得通过一个中间变量来传递给最终的计算式。&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;3&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;span&gt;alert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;(&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;x&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;return&lt;/span&gt; x &lt;span&gt;*&lt;/span&gt; &lt;span&gt;1.2&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;将匿名函数看做一个变量，可以很轻松的将数据和特性合并在一起。这也给你了一个机会去试验一些其他的设计原则。当高一级的模块（无论对象还是函数）需要低一级的模块提供的返回值的时候，就可以将低一级的模块直接当做参数传过去。很多情况下，这会提高函数参数的可读性，并且让代码更优雅一些，当然，也会让你在处理复杂事物的时候更加得心应手。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;jQuery和函数型程序设计&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;jQuery在函数型程序设计方面吸引了人们极大的关注。整个jQuery库都是基于jquery对象或者说$。$是DOM元素的一个封装，DOM元素也可以通过$()表达式传递进去。另外，jQuery支持链式操作，每一个函数运行之后都会返回同一个jquery对象。&lt;/p&gt;&lt;p&gt;jQuery非常高效，因为你可以在主要工作是操作DOM元素的WEB编程环境下最大限度的发挥出函数型程序设计的威力。你也许是jQuery的粉丝，并且觉得这种函数式的操作非常赞。但是，这不是需要完全把这种编程模式到处使用的理由。我们通过下面这个jQuery源码来看个例子：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;3&lt;br/&gt;4&lt;br/&gt;5&lt;br/&gt;6&lt;br/&gt;7&lt;br/&gt;8&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;jQuery.&lt;span&gt;fn&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; jQuery.&lt;span&gt;prototype&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br/&gt;    init&lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt; selector&lt;span&gt;,&lt;/span&gt; context &lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; ... &lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br/&gt;       size&lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;length&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br/&gt;       each&lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt; callback&lt;span&gt;,&lt;/span&gt; args &lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span&gt;return&lt;/span&gt; jQuery.&lt;span&gt;each&lt;/span&gt;&lt;span&gt;(&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; callback&lt;span&gt;,&lt;/span&gt; args &lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;  &lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br/&gt;       ready&lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt; fn &lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt; ... &lt;span&gt;}&lt;/span&gt;&lt;br/&gt;       &lt;span&gt;:&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;可以看到，jQuery对象有他自己的原型，也有一些自有的方法：比如size和each。更有意思的是，当你写jQuery的插件的时候，你只是给通过添加一个函数扩展了原型方法。至此，所有高效的js编程，都是两种模式混合的结果。当然jQuery中函数型的模式更加明显一些。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;javascript中的对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;真正面向对象编程中的对象与javascript中的对象有一个很明显的不同。在面向对象的语言中，类是你要使用的对象的蓝本。在javascript中，你所使用的对象的蓝本是一个数据字典或者一个函数。当你在js中创建了一个对象，你就拥有一个你可以填进去任何数据的空的数据字典。&lt;/p&gt;&lt;p&gt;之前说过，通过一些方法，你可以创建一些自定义的对象或者继承自现有的对象。这只在js中有效。&lt;/p&gt;&lt;p&gt;当你需要通过添加中间的转化来接近真正的面向对象语言的时候，在js中有两种办法：闭包和原型。&lt;/p&gt;&lt;p&gt;在讲述那两种办法之前，我们先来讲讲js中的对象类型和他的用法。&lt;/p&gt;&lt;p&gt;你可以通过new关键字来创建一个空的对象，然后你可以给这个对象添加进去你想要的内容：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;3&lt;br/&gt;4&lt;br/&gt;5&lt;br/&gt;6&lt;br/&gt;7&lt;br/&gt;8&lt;br/&gt;9&lt;br/&gt;10&lt;br/&gt;11&lt;br/&gt;12&lt;br/&gt;13&lt;br/&gt;14&lt;br/&gt;15&lt;br/&gt;16&lt;br/&gt;17&lt;br/&gt;18&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;span&gt;var&lt;/span&gt; person &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; Object&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;person.&lt;span&gt;Name&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"Dino"&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;person.&lt;span&gt;LastName&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;"Esposito"&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;person.&lt;span&gt;BirthDate&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; Date&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1979&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;17&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;person.&lt;span&gt;getAge&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;var&lt;/span&gt; today &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; Date&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;var&lt;/span&gt; thisDay &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;var&lt;/span&gt; thisMonth &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;var&lt;/span&gt; thisYear &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getFullYear&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;var&lt;/span&gt; age &lt;span&gt;=&lt;/span&gt; thisYear&lt;span&gt;-&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getFullYear&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;thisMonth &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;      age &lt;span&gt;=&lt;/span&gt; age &lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;else&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;thisMonth &lt;span&gt;==&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br/&gt;      thisDay &lt;span&gt;&amp;gt;=&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;      age &lt;span&gt;=&lt;/span&gt; age &lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;  &lt;span&gt;return&lt;/span&gt; age&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;我们现在拥有一个名为person的对象，但是没有Person对象。在js中，所有的原声对象都有一个只读的prototype属性。通过这个属性，你可以用来提供一些函数，这些函数在使用new关键字的时候，新生成的对象可以与原对象共享这些方法。下面有两种方法可以在js中实现面向对象编程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;通过闭包实现面向对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;闭包是编程语言中的一个基本概念。在js中，闭包是指那些拥有同样上下文的变量和方法的一个函数。下面这个例子就是使用闭包来模拟一个Person类：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;3&lt;br/&gt;4&lt;br/&gt;5&lt;br/&gt;6&lt;br/&gt;7&lt;br/&gt;8&lt;br/&gt;9&lt;br/&gt;10&lt;br/&gt;11&lt;br/&gt;12&lt;br/&gt;13&lt;br/&gt;14&lt;br/&gt;15&lt;br/&gt;16&lt;br/&gt;17&lt;br/&gt;18&lt;br/&gt;19&lt;br/&gt;20&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;span&gt;var&lt;/span&gt; Person &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; lastname&lt;span&gt;,&lt;/span&gt; birthdate&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br/&gt;   &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;Name&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;   &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;LastName&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; lastname&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;   &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; birthdate&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;   &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;getAge&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&lt;br/&gt;      &lt;span&gt;var&lt;/span&gt; today &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; Date&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;      &lt;span&gt;var&lt;/span&gt; thisDay &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;      &lt;span&gt;var&lt;/span&gt; thisMonth &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;      &lt;span&gt;var&lt;/span&gt; thisYear &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getFullYear&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;      &lt;span&gt;var&lt;/span&gt; age &lt;span&gt;=&lt;/span&gt; thisYear&lt;span&gt;-&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getFullYear&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;      &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;thisMonth &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;          age &lt;span&gt;=&lt;/span&gt; age &lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;      &lt;span&gt;else&lt;/span&gt;&lt;br/&gt;         &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;thisMonth &lt;span&gt;==&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br/&gt;             thisDay &lt;span&gt;&amp;gt;=&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;             age &lt;span&gt;=&lt;/span&gt; age &lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;      &lt;span&gt;return&lt;/span&gt; age&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;   &lt;span&gt;}&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;可以看出，闭包就是父类的构造函数。在闭包模式中，构造器包含类成员的声明，并且这些成员都是封装起来的。另外，成员都是基于实例的，所以会消耗内存。如何使用呢：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;span&gt;var&lt;/span&gt; p &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; Person&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'Rock'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;'ux'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; Date&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;alert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;p.&lt;span&gt;name&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; &lt;span&gt;'is'&lt;/span&gt; &lt;span&gt;+&lt;/span&gt; p.&lt;span&gt;getAge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;闭包模式是完全封装的，仅此而已。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原型模式的面向对象方法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;通过js中prototype对象，你可以定义一个类的结构。下面这个例子用来说明怎样避免使用闭包来重写Person类。&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;3&lt;br/&gt;4&lt;br/&gt;5&lt;br/&gt;6&lt;br/&gt;7&lt;br/&gt;8&lt;br/&gt;9&lt;br/&gt;10&lt;br/&gt;11&lt;br/&gt;12&lt;br/&gt;13&lt;br/&gt;14&lt;br/&gt;15&lt;br/&gt;16&lt;br/&gt;17&lt;br/&gt;18&lt;br/&gt;19&lt;br/&gt;20&lt;br/&gt;21&lt;br/&gt;22&lt;br/&gt;23&lt;br/&gt;24&lt;br/&gt;25&lt;br/&gt;26&lt;br/&gt;27&lt;br/&gt;28&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;span&gt;// 构造器&lt;/span&gt;&lt;br/&gt;&lt;span&gt;var&lt;/span&gt; Person &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; lastname&lt;span&gt;,&lt;/span&gt; birthdate&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;&lt;span&gt;{&lt;/span&gt;&lt;br/&gt;    &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;initialize&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; lastname&lt;span&gt;,&lt;/span&gt; birthdate&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&lt;span&gt;// 成员&lt;/span&gt;&lt;br/&gt;Person.&lt;span&gt;prototype&lt;/span&gt;.&lt;span&gt;initialize&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; lastname&lt;span&gt;,&lt;/span&gt; birthdate&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;&lt;span&gt;{&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;Name&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;LastName&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; lastname&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; birthdate&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;br/&gt;Person.&lt;span&gt;prototype&lt;/span&gt;.&lt;span&gt;getAge&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;&lt;span&gt;{&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;var&lt;/span&gt; today &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; Date&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;var&lt;/span&gt; thisDay &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;var&lt;/span&gt; thisMonth &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;var&lt;/span&gt; thisYear &lt;span&gt;=&lt;/span&gt; today.&lt;span&gt;getFullYear&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;var&lt;/span&gt; age &lt;span&gt;=&lt;/span&gt; thisYear&lt;span&gt;-&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getFullYear&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;thisMonth &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;         age &lt;span&gt;=&lt;/span&gt; age &lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;else&lt;/span&gt;&lt;br/&gt;        &lt;span&gt;if&lt;/span&gt; &lt;span&gt;(&lt;/span&gt;thisMonth &lt;span&gt;==&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getMonth&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; &lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br/&gt;            thisDay &lt;span&gt;&amp;gt;=&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;BirthDate&lt;/span&gt;.&lt;span&gt;getDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;            age &lt;span&gt;=&lt;/span&gt; age &lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;     &lt;span&gt;return&lt;/span&gt; age&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;在原型模式下面，构造器和成员之间结构清晰，但是构造函数是必须的。这里并没有私有成员，var关键字可以让其只在闭包中有效。你可以通过定义setter/getter来操作你需要的属性，但是这些属性在类外面也是可以直接访问修改的。你可以通过一些特殊的操作（比如添加前缀）来定义私有变量。只是一种办法而已。&lt;/p&gt;&lt;p&gt;原型模式可以很简单的实现继承：&lt;/p&gt;&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;1&lt;br/&gt;2&lt;br/&gt;3&lt;br/&gt;4&lt;br/&gt;5&lt;br/&gt;&lt;/td&gt;&lt;td class="code"&gt;Developer &lt;span&gt;=&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; Developer&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; lastname&lt;span&gt;,&lt;/span&gt; birthdate&lt;span&gt;)&lt;/span&gt;&lt;br/&gt;&lt;span&gt;{&lt;/span&gt;&lt;br/&gt;   &lt;span&gt;this&lt;/span&gt;.&lt;span&gt;initialize&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; lastname&lt;span&gt;,&lt;/span&gt; birthdate&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br/&gt;&lt;span&gt;}&lt;/span&gt;&lt;br/&gt;Developer.&lt;span&gt;prototype&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; Person&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;需要注意的是，你必须通过使用this关键字来访问原型中的相关成员方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;闭包还是原型？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在原型模式中，所有的成员都是共享的。所以，相比而言，内存的开销要小一些。除去语法方面的不同，通过原型模式定义的类更加接近经典意义上的面向对象语言。&lt;/p&gt;&lt;p&gt;闭包还是原型的选择还要从性能和浏览器的兼容性来考虑。原型模式的加载速度不错，而且在Firefox中性能也很好。（相比而言，闭包模式在IE下面的加载更快一些。）原型模式对于智能感知支持不错，这样在一些IDE中（比如VS）就能得到很好的工具支持。原型模式下，你不必通过创建一个实例来查看类型信息，闭包模式下就不行。最后，调试的时候，原型模式可以方便的访问私有成员，闭包模式下面得多几步操作才行。&lt;/p&gt;&lt;p&gt;举个例子，微软的ajax库使用的就是原型模式（闭包模式从未被考虑）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Javascript并不是纯粹的函数型或者面向对象的语言。但是他从两种语言都有借鉴，所以你需要做好一些准备。&lt;/p&gt;&lt;p&gt;如今，Javascript对于编写客户端的网页和移动应用程序来说必不可少。而且现在的脚本编写也不像当初这个语言开始使用的时候了。现在我们经常使用js来做客户端的表单验证等程序。为了让开发进程更加的平稳，我们也需要一些js库。jQuery就是最好的例证。&lt;/p&gt;&lt;p&gt;随着jQuery大放光芒，函数型变成再次在js语言中相对于面向对象得到了更多的关注。最终，选择什么还是在你。你也不必像选择一种信仰似的选择一种开发模式，开发中，两者混合使用是非常常见的事情。&lt;/p&gt;&lt;p&gt;如前所述，如果我是前端开发，我可能会使用jQuery，然后使用一些匿名函数，不去关心什么自定义的对象。如果我是要自己写一个js的库，那么我肯定会选择面向对象开发，或者使用闭包模式或者使用原型模式。&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 15px; color: #0000ff;"&gt;点击查看&lt;a href="http://rockux.com/archives/函数型-vs-面向对象型的javascript程序设计" target="_blank"&gt;原文&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beiyuu/aggbug/1965890.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beiyuu/archive/2011/02/26/functional-vs-oo-js-program.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2011/02/23/Bookmarklets.html</id><title type="text">创建书签小工具之理论</title><summary type="text">书签小工具（Bookmarklets）是一个非常棒的javascript代码小片断伪装成的小应用，它驻留在你的浏览器里并为网页提供额外的功能。这里我们将研究如何从头开始创建一个书签小工具及一些最佳实践的建议</summary><published>2011-02-23T14:36:00Z</published><updated>2011-02-23T14:36:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2011/02/23/Bookmarklets.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2011/02/23/Bookmarklets.html"/><content type="html">&lt;p&gt;书签小工具（Bookmarklets）是一个非常棒的javascript代码小片断伪装成的小应用，它驻留在你的浏览器里并为网页提供额外的功能。这里我们将研究如何从头开始创建一个书签小工具及一些最佳实践的建议。&lt;/p&gt;&lt;p&gt;我们一直在寻找增加浏览体验的方法，有的方法众所周知，有的则鲜为人知。我原本认为书签小工具属于后者，非常令人讨厌的东西。令我非常懊恼的是我发现在这个问题上我完全是错误的。它并不是令人厌烦的，而是以用户为中心的，能实现很多出色的功能，而且就像人们所预期的一样，它成为了我与浏览者以及网络交互的核心部分。&lt;br /&gt;这里我想向你介绍开发书签小工具以实现一些精妙的书签的全过程。是的，书签，我们将创建不只一个书签，即使是非常小的书签。很好奇吗？我们开始吧！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;究竟什么是书签小工具呢？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;引用前文的话：&lt;br /&gt;&lt;em&gt;书签小工具是一个非常棒的javascript代码小片断伪装成的小应用，它驻留在你的浏览器里并为网页提供额外的功能，仅仅只需要点击一下。&lt;/em&gt;&lt;/p&gt;&lt;p&gt;这个词是bookmark和applet的合成词，也叫做收藏小工具（favelets），这个小的javascript片断让你可以在浏览任何页面时召唤出额外的功能。因为它们只有javascript构成，所以它们是可移动的，可以支持所有的浏览器，甚至是移动设备和平板设备的。安装它们也相当简单，只需要将它们拖到收藏夹就行了！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;那么，什么是关键呢？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关键之处在于书签小工具认你可以做很多原本要以开发人员为中心才能做的事情。任何通过书签小工具能获得的功能你都可以使用浏览器的控制台花费很少的时间而获得。书签小工具简化了这个过程，将实现一些功能的代码打包在一个小小的按钮里。书签小工具大体上来说可以分为以下几类：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;用于传输数据。它用于将页面提交到特定的服务。处理社交媒体，查字典，搜索都属于这一类。我们将创建一个提交信息到Reddit（一个新闻网站）的书签小工具。&lt;/li&gt;&lt;li&gt;用于获取信息或修改当前页面的。我们将创建一个设置网页背景色的小工具。&lt;/li&gt;&lt;li&gt;用于后台运作。清除当前网站cookie的书签小工具是一个主要的例子，我们将下面创建一个。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;1、开始&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你需要记住的第一点就是在所有javascript代码前缀上&amp;ldquo;javascript&amp;rdquo;URI。浏览器实现了特定的前缀因此前缀后面的内容可以被当作javascript代码正确的处理，解析。&lt;br /&gt;例如，点击&amp;ldquo;&lt;a href="http://rockux.com/archives/%e5%88%9b%e5%bb%ba%e4%b9%a6%e7%ad%be%e5%b0%8f%e5%b7%a5%e5%85%b7%e4%b9%8b%e7%90%86%e8%ae%ba"&gt;这个链接&lt;/a&gt;&amp;rdquo;（代码如下）将会强出一个对话框。&lt;/p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;a &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="javascript: alert('文字链接');"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;这个链接&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;2、包装成匿名函数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;记住你的代码将运行于当前加载的页面，它可能会拥有自己的javascript代码，这意味着可能和书签小工具的代码存在冲突。最后你需要做的是让你的小工具中止当前页面。&lt;br /&gt;将你的代码包装在一个匿名函数里可以保证没有名称冲突。此外，javascript新手将会被搞混并认为你是上帝，如果你这样做的话。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;javascript:(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; your code here })();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;当你在其它地方使用javascript代码时这也是适当，时刻注意保持自己的代码隔离。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、按需外部化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;书签小工具不一定要很小，你可以需要多大就写多大。在这种些情况下，为了发布方便并在不让用户手动干预的情况下保持代码为最新，最好是创建一个获取需要的代码的封装。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;javascript: (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; () {  &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; jsCode &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; document.createElement(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);  &lt;br /&gt; jsCode.setAttribute(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;src&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;http://path/to/external/file.js&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);  &lt;br /&gt; document.body.appendChild(jsCode);  &lt;br /&gt; }());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面的代码变得美化了许多，它创建了一个script标签，将src属性设置成其它地方的一个文件，然后最终将它附加到文档中。通过这种方法，无论你哪上部分代码发生变化，你可以部署你修改后的文件并立刻传播到每一个用户。&lt;/p&gt;&lt;p&gt;注意：这不仅限于javascript。如果你的书签小工具使用前端，你也可以自由地引入外部HTML和CSS，使得你的小工具真正的自动更新。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、谨慎地添加类库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你要创建一个大型的书签工具，你可能需要一个javascript类库。但是在你的页面里使用它们不仅仅只是将它们包含进来那么简单，你需要保证这个库不是已经存在了的。像jQuery和MooTools这样占有很大市场的类库你得仔细的处理来确保它预先没有被载入。&lt;br /&gt;另一方面网页可能已经载入了其它类库，可能会导致&amp;ldquo;$&amp;rdquo;符号组件冲突。版本冲突在一些情况下也会出现，所以也要注意。&lt;/p&gt;&lt;p&gt;这里是一段我代码中使用的脚本。注意，在你的代码中你需要注意我上面说的几点。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;($ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; window.jQuery)) { &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; typeof jQuery=='undefined' works too  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; script &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; document.createElement( &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;script&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; );  &lt;br /&gt; script.src &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;;  &lt;br /&gt; script.onload&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;releasetheKraken;  &lt;br /&gt; document.body.appendChild(script);  &lt;br /&gt; }&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {  &lt;br /&gt; releasetheKraken();  &lt;br /&gt; }  &lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; releasetheKraken() {  &lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; The Kraken has been released, master!  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Yes, I'm being childish. Place your code here  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; }  &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这段代码的含义应该很明确了，我们简单地过一下。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;首先我们通过判断jQuery对象是不是存在于名称空间里来确定jQuery是不是已经被加载了。&lt;/li&gt;&lt;li&gt;如果不存在，我们引入它。我们根据最佳实践能过CDN来载入它。最后我们确保指向包含要执行的代码的程序主函数。&lt;/li&gt;&lt;li&gt;如果已存在，直接运行主函数。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如果你觉得解决这个问题很麻烦，我强烈推荐Ben Alman的&amp;ldquo;&lt;a target="_blank" href="http://benalman.com/projects/run-jquery-code-bookmarklet/"&gt;书签小工具生成器&lt;/a&gt;&amp;rdquo;。它用一种很完全的方法解决全称空间和版本冲突。好东西！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5、非不得已不要搞乱母页&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这一点太重要了。如果不小心破坏了母页，书签小工具就是毫无用处的。请注意javascript并不是你唯一需要处理的东西。如果你有一个前端，HTML和CSS也会在页面中运行。不要给你的容器和类取非常普通的名字，比如你把它叫做&amp;ldquo;container&amp;rdquo;，我会永远讨厌你。一种简单的方法就是给所有名字添加具有工具特色的特别前缀（或者是后缀）字符串。当你写CSS的时候，需要特别特别的特殊。使用样式很不错，但请使用最高的精度。如果有样式泄漏到主页面上是不合规范的，且会引发不信任。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6、测试，测试，再测试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你正创建一个较小的书签小工具，它引用了脆弱的第三方的类库，你可能会碰到永远的噩梦&amp;mdash;&amp;mdash;跨浏览器兼容性问题。看起来很明显但是这是很多人很多时候都会忘记的一点。&lt;br /&gt;另一个陷阱是希望能工作在所有网站上的小工具只工作在几个网站上。网页可以有不同的层次，使用不同的方法论。有些网站可能包含了HTML5并且使用了相关的容器而其它的可能安全起见使用了通用的div标签。在收集信息的时候确保考虑了每一种情况。&lt;/p&gt;&lt;p&gt;接下来请阅读&amp;ldquo;&lt;a target="_self" href="http://rockux.com/archives/%E5%88%9B%E5%BB%BA%E4%B9%A6%E7%AD%BE%E5%B0%8F%E5%B7%A5%E5%85%B7%E4%B9%8B%E5%AE%9E%E4%BE%8B" title="创建书签小工具之实例"&gt;创建书签小工具之实例&lt;/a&gt;&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://rockux.com/archives/%E5%88%9B%E5%BB%BA%E4%B9%A6%E7%AD%BE%E5%B0%8F%E5%B7%A5%E5%85%B7%E4%B9%8B%E7%90%86%E8%AE%BA"&gt;源文&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beiyuu/aggbug/1963273.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beiyuu/archive/2011/02/23/Bookmarklets.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2011/01/09/1931021.html</id><title type="text">你也应该用VIM，不仅仅只是酷</title><summary type="text">为什么要用VIM？1、他是一个文本编辑器，不是IDE，所以他很快、很轻、很高效。2、不想动鼠标，因为它离键盘实在太远了。3、看看电影里那些个黑客，不都是噼里啪啦的敲键盘，哪有弄个鼠标点来点去的？4、自己捣鼓一些脚本，一句顶五句，腿不疼了，腰也不酸了，吃嘛嘛香了。5、这样的年代，没有整过linux简直不好意思说自己是搞网络的，linux必须得用用vim吧6、一个编辑器不同插件就能搞定所有语言，搞定所有你想要的。7、完全跨平台，一个伟大的人绝对没有种族歧视，你应该被这种伟大所感染。8、商业化产品可能是有用的， 但最好的东西往往是免费的， 空气，水，Vim。9、周围同事不是用 Vim 就是 Emac</summary><published>2011-01-09T04:09:00Z</published><updated>2011-01-09T04:09:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2011/01/09/1931021.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2011/01/09/1931021.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: 微软雅黑; font-size: small;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;为什么要用VIM？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;1、他是一个文本编辑器，不是IDE，所以他很快、很轻、很高效。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;2、不想动鼠标，因为它离键盘实在太远了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;3、看看电影里那些个黑客，不都是噼里啪啦的敲键盘，哪有弄个鼠标点来点去的？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;4、自己捣鼓一些脚本，一句顶五句，腿不疼了，腰也不酸了，吃嘛嘛香了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;5、这样的年代，没有整过linux简直不好意思说自己是搞网络的，linux必须得用用vim吧&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;6、一个编辑器不同插件就能搞定所有语言，搞定所有你想要的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;7、完全跨平台，一个伟大的人绝对没有种族歧视，你应该被这种伟大所感染。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;8、商业化产品可能是有用的， 但最好的东西往往是免费的， 空气，水，Vim。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;9、周围同事不是用 Vim 就是 Emacs , 你要是用一 EditPlus，你都不好意思跟人家打招呼&amp;hellip; 什么插件呀，语法高亮呀，拼写检查呀，能给它开的都给它开着，就是一个字儿：酷。 你说这么牛B一东西，怎么着学会也得小半年吧。 半年！入门都远着呢，能学会移动光标就不错了，你还别说耗不起，就这还只是左右移动。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;10、谁用谁知道。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: normal;"&gt;如果你没有用过VIM，建议参考下面的初级入门教程，可以帮你快速进阶。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://rockux.com/archives/vim%e6%9c%89%e7%94%a8%e5%91%bd%e4%bb%a4"&gt;【VIM基本用法（七）】更多有用的命令&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://rockux.com/archives/vim%e6%96%87%e7%ab%a0%e4%b8%ad%e5%ae%9a%e4%bd%8d"&gt;【VIM基本用法（六）】在文章中移动、定位&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://rockux.com/archives/vim%e6%a0%87%e8%ae%b0%e4%b8%8e%e5%ae%8f"&gt;【VIM基本用法（五）】标记与宏&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://rockux.com/archives/vim%e6%90%9c%e7%b4%a2%e6%9f%a5%e6%89%be%e6%9b%bf%e6%8d%a2"&gt;【VIM基本用法（四）】搜索查找替换&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://rockux.com/archives/vim%e5%a4%8d%e5%88%b6%e7%b2%98%e8%b4%b4%e5%89%aa%e8%b4%b4%e6%9d%bf"&gt;【VIM基本用法（三）】复制、粘贴、剪贴板&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://rockux.com/archives/vim%e4%bf%ae%e6%94%b9%e5%88%a0%e9%99%a4"&gt;【VIM基本用法（二）】修改、删除&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://rockux.com/archives/vim-basic-edit"&gt;【VIM基本用法（一）】移动、编辑&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;转载注明:&lt;a href="http://rockux.com/archives/%E4%BD%BF%E7%94%A8vim%E7%9A%84%E5%8D%81%E5%A4%A7%E7%90%86%E7%94%B1"&gt;http://rockux.com/archives/%E4%BD%BF%E7%94%A8vim%E7%9A%84%E5%8D%81%E5%A4%A7%E7%90%86%E7%94%B1&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beiyuu/aggbug/1931021.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beiyuu/archive/2011/01/09/1931021.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2010/04/20/jcutter.html</id><title type="text">jCutter，一个图片hover的jQuery插件</title><summary type="text">效果演示看这里。先来看看使用方法。HTML文件中这样写：[代码]调用的话需要这样写：[代码]当然要引用这个插件才行。下面我们来讲解这个插件的编写。一、jQuery插件编写的方法写一个jQuery插件，首先需要一些必要的结构，如下所示：代码这个结构和我们最终的结果有些出入，但是大体上jQuery插件的结构就是如此。首先要写成一个闭包的形式，不污染命名空间，然后根据jQuery提供的接口来编写，这里的...</summary><published>2010-04-20T13:00:00Z</published><updated>2010-04-20T13:00:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2010/04/20/jcutter.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2010/04/20/jcutter.html"/><content type="text">效果演示看这里。先来看看使用方法。HTML文件中这样写：[代码]调用的话需要这样写：[代码]当然要引用这个插件才行。下面我们来讲解这个插件的编写。一、jQuery插件编写的方法写一个jQuery插件，首先需要一些必要的结构，如下所示：代码这个结构和我们最终的结果有些出入，但是大体上jQuery插件的结构就是如此。首先要写成一个闭包的形式，不污染命名空间，然后根据jQuery提供的接口来编写，这里的...</content></entry><entry><id>http://www.cnblogs.com/beiyuu/archive/2010/04/12/getmouseposition.html</id><title type="text">jQuery与YUI中鼠标位置检测比较学习(document.documentElement document.body与pageX pageY以及clientX clientY)</title><summary type="text">关于鼠标位置的检测，我们先来看看jQuery和YUI中的实现jQuery中：[代码]YUI中：[代码]YUI的写法比起jQuery来确是“工程化”了很多，如果是按照代码行数发工资的话，推荐YUI，哈哈。之前翻译PPK的作品的是提到了无论如何都不要检测浏览器的类型，因为没必要，而且浏览器的UA都在胡言乱语。关于document.documentElement和document...</summary><published>2010-04-12T07:15:00Z</published><updated>2010-04-12T07:15:00Z</updated><author><name>BeiYuu</name><uri>http://www.cnblogs.com/beiyuu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beiyuu/archive/2010/04/12/getmouseposition.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beiyuu/archive/2010/04/12/getmouseposition.html"/><content type="text">关于鼠标位置的检测，我们先来看看jQuery和YUI中的实现jQuery中：[代码]YUI中：[代码]YUI的写法比起jQuery来确是“工程化”了很多，如果是按照代码行数发工资的话，推荐YUI，哈哈。之前翻译PPK的作品的是提到了无论如何都不要检测浏览器的类型，因为没必要，而且浏览器的UA都在胡言乱语。关于document.documentElement和document...</content></entry></feed>
