昨天发布了自己整理的 jQuery 1.2 文档(Visual jQuery 1.2),但由于文档的页面实在太大(6000 多行),从开始加载到完全显示的过程,所花费的时间太长,单 javascript 的处理时间就差不多用了10 多秒,虽然作了优化,但还会偶尔出现浏览器 javascript 调试停止响应的情况:(于是,今天决定将该庞大的页面进行较彻底的优化,主要是针对 jQuery 的代码。
在 jQuery 的 API 当中,$(selector)是最核心的,它可以搜索页面的元素。但对于不同的 selector,其搜索速度会有不同。当中,$(’#id‘) 的搜索速度是最快的,基本不用1 毫秒即可完成(视具体的 CPU 而定),次之就是 $(‘tagName’) ,最慢的就是 $(‘.class’):( 所以,在使用 $(selector) 应尽可能使用最有效的 selector !
其次,就是找捷径,或者说是最小路径。以仅能使用 $(‘.class’) 的情况(这是最常见的情况:()为例,可以查看其父辈元素能否快速搜索到,这样可以缩窄搜索的范围。例如:
<div>
<div id=”div1″><div class=”class1″>search1</div></div>
<div id=”div2″><div class=”class2″>search2</div></div>
</div>
要搜索 .class2 元素,可以这样:
$(‘#div2 > .class2’)
这是比较理想的情况,有可能其父辈元素也是不能快速搜索的,这就只能从 ‘body’元素开始,往下一层一层的去搜索子元素: $(‘body > .class1 > .class2 >…’)
最后的一个优化方法就是推迟代码的执行。尤其对页面元素的事件绑定。例如,页面当中某些元素的事件只会在其它元素的事件发生后才会执行的,那么,就可以对 后执行的元素事件进行推迟绑定,这样,就可以在页面加载完成时,减少执行 javascript 代码。在推迟执行事件绑定的应用中,jQuery 提供了一个非常有用的 API:one(),其作用是为元素的特定事件(如click)绑定一个事件处理器函数, 而这个事件处理函数只会被执行一次。看看下面的例子吧:
<button id=”bn1″>Button</button>
<button id=”bn2″ style=”display:none”>Button2</button>
Button2 默认是隐藏的,而在 Button1 的单击后才会显示。那么,这就可以将 Button2 的事件绑定推迟:
$(function(){
// 对 Button1 的单击事件绑定
$(‘#bn1’).click(function(){
$(‘#bn2’).show();
}).one(‘click’, function(){
//利用 one() 对 Button2 的单击事件作推迟绑定
$(‘#bn2’).click(function(){
/* do something */
}
});
})
这样,在 Button1 首次被单击时,Button2 的单击事件才被绑定。
基本的优化就这些了,当然还有其它重要的方式,例如对算法的优化,这就高深许多了:)用上面的方法进行优化后,jQuery 1.2 API Reference 大功告成:)
- jQuery 1.2 API Reference:http://wstudio.web.fc2.com/jqueryapi/index.html