Ross Wan's World!

Python, Ajax, PHP and Linux.

Archive for 2007年10月9日

对 jQuery 代码作简单的优化

Posted by Ross Wan 于 2007/10/09

       昨天发布了自己整理的 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 大功告成:)

Posted in Javascript | Leave a Comment »