jQuery性能优化(1)


之前,我们减少字节数和请求次数以及加载顺序以使页面加载的更快。如今,我们越来越多的注意到另一个影响网站性能的部分--CPU利用率。使用 jQuery和其他JavaScript框架,使节点选择和DOM操作变得越来越容易,如果使用不当,有可能影响整个网页的响应速度,下面列举11个更有效的使用jQuery库的方法。


1、总是使用#id去寻找element.


在jQuery中最快的选择器是ID选择器 ($('#someid')). 这是因为它直接映射为JavaScript的getElementById()方法。

选择单个元素


  1. <div id="content">  
  2.     <form method="post" action="/">  
  3.         <h2>Traffic Light</h2>  
  4.         <ul id="traffic_light">  
  5.             <li><input type="radio" class="on" name="light" value="red" /> Red</li>  
  6.             <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>  
  7.             <li><input type="radio" class="off" name="light" value="green" /> Green</li>  
  8.         </ul>  
  9.         <input class="button" id="traffic_button" type="submit" value="Go" />  
  10.     </form>  
  11. </div> 


选择button的性能不好的一种方式:


  1. var traffic_button = $('#content .button'); 

取而代之的是直接选择button:


  1. var traffic_button = $('#traffic_button'); 

2、在Classes前面使用Tags


在jQuery中第二快的选择器就是Tag选择器 ($('head')). 而这是因为它直接映射到JavaScript的getElementsByTagName()方法。


  1. <div id="content">  
  2.     <form method="post" action="/">  
  3.         <h2>Traffic Light</h2>  
  4.         <ul id="traffic_light">  
  5.             <li><input type="radio" class="on" name="light" value="red" /> Red</li>  
  6.             <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>  
  7.             <li><input type="radio" class="off" name="light" value="green" /> Green</li>  
  8.         </ul>  
  9.         <input class="button" id="traffic_button" type="submit" value="Go" />  
  10.     </form>  
  11. </div> 

总是在一个Class前面加上一个tag名字(记得从一个ID传下来)


  1. var active_light = $('#traffic_light input.on'); 

注意:在jQuery里Class选择器是最慢的一个选择器;在IE中它循环整个DOM。可能的话尽量避免使用它。不要在ID前面加Tags。例如,它会因为去循环所有的<div>元素去寻找ID为content的<div>,而导致很慢。


  1. var content = $('div#content'); 

按照同样的思路,从多个ID传下来是冗余的。


  1. var traffic_light = $('#content #traffic_light'); 

3、缓存jQuery对象


养成保存jQuery对象到一个变量上(就像上面的例子)的习惯。例如,不要这样做:


$('#traffic_light input.on).bind('click', function(){...});

$('#traffic_light input.on).css('border', '3px dashed yellow');

$('#traffic_light input.on).css('background-color', 'orange');

$('#traffic_light input.on).fadeIn('slow');


取而代之,首现保存jQuery变量到一个本地变量后,再继续你的操作。


var $active_light = $('#traffic_light input.on');

$active_light.bind('click', function(){...});

$active_light.css('border', '3px dashed yellow');

$active_light.css('background-color', 'orange');

$active_light.fadeIn('slow');


提示:使用$前辍表示我们的本地变量是一个jQuery包集。记住,不要在你的应该程序里出现一次以上的jQuery重复的选择操作。 额外提示:延迟存储jQuery对象结果。


如果你想在你的程序的其它地方使用jQuery结果对象(result object(s)),或者你的函数要执行多次,要把它缓存在一个全局范围的对象里。通过定义一个全局容器保存jQuery结果对象,就可以在其它的函数里引用它。


  1. // Define an object in the global scope (i.e. the window object)  
  2. window.$my =  
  3. {  
  4.     // Initialize all the queries you want to use more than once  
  5.     head : $('head'),  
  6.     traffic_light : $('#traffic_light'),  
  7.     traffic_button : $('#traffic_button')  
  8. };  
  9.  
  10. function do_something()  
  11. {  
  12.     // Now you can reference the stored results and manipulate them  
  13.     var script = document.createElement('script');  
  14.     $my.head.append(script);  
  15.  
  16.     // When working inside functions, continue to save jQuery results  
  17.     // to your global container.  
  18.     $my.cool_results = $('#some_ul li');  
  19.     $my.other_results = $('#some_table td');  
  20.  
  21.     // Use the global functions as you would a normal jQuery result  
  22.     $my.other_results.css('border-color''red');  
  23.     $my.traffic_light.css('border-color''green');  

4、更好的利用链


前面的例子也可以这样写:


  1. var $active_light = $('#traffic_light input.on');$active_light.bind('click'function(){...})  
  2.     .css('border''3px dashed yellow')  
  3.     .css('background-color''orange')  
  4.     .fadeIn('slow'); 

这样可以让我们写更少的代码,使JavaScript更轻量。


5、使用子查询


jQuery允许我们在一个包集上附加其它的选择器。因为我们已经在本地变量里保存了父对象这样会减少以后在选择器上的性能开销。


  1. <div id="content">  
  2.     <form method="post" action="/">  
  3.         <h2>Traffic Light</h2>  
  4.         <ul id="traffic_light">  
  5.             <li><input type="radio" class="on" name="light" value="red" /> Red</li>  
  6.             <li><input type="radio" class="off" name="light" value="yellow" /> Yellow</li>  
  7.             <li><input type="radio" class="off" name="light" value="green" /> Green</li>  
  8.         </ul>  
  9.         <input class="button" id="traffic_button" type="submit" value="Go" />  
  10.     </form>  
  11. </div> 

例如,我们可以利用子查询缓存active和inactive lights以便后面的操作。


  1. var $traffic_light = $('#traffic_light'),  
  2.     $active_light = $traffic_light.find('input.on'),  
  3.     $inactive_lights = $traffic_light.find('input.off'); 

提示:可以用逗号隔开一次定义多个本地变量,这样可以节省一些字节。





标签:
Warning: Invalid argument supplied for foreach() in C:\zl\webjia\view.php on line 50

友情链接
轻松育儿世界奇观
苏ICP备16066217号-2