【JQuery】性能优化方法

尽管JavaScript比JAVA C++慢很多,JQuery比原生Js还慢很多,但是我们通过良好的编程习惯还是能提高代码执行的效率。

一.选择器的使用

选择同一个元素,各种方法之间的性能是不一样的,有时候差异会特别大。通常比较常用的选择器有以下几个:

ID选择器 $("#id")

标签选择器 $("td")

类选择器 $(".target")

属性选择器 $("td[target='target']")

伪类选择器 $("td:hidden")

这5种选择器的性能是依次下降的:

性能顺序:ID选择器 > 标签选择器 > 类选择器 > 属性选择器 > 伪类选择器

二.避免执行全局查找

//错误的
$("div.bizHelp"); 

//正确的
$("bizHelp"); 
$("#container").find(".bizHelp"); 

保证查询的路径最短,性能最优  

三.缓存对象

//错误的
$(window).bind('click',function(){
  //do someing...    
});

$(window).css('width','1000px');

$(window).bind('load',function(){
  //do someing...    
});
//优化的
var $win = $(window);

$win.bind('click',function(){
  //do someing...    
});

$win.css('width','1000px');

$win.bind('load',function(){
  //do someing...    
});

 

四.采用样式表 避免多次DOM style样式

var obj=$("#obj"); 

//A:
obj.css("width",200);  
obj.css("height",200);  
obj.css("background":"#eee"); 

//B:
obj.attr("style","width:200px;height:200px;background:#eee;");  

//C:
//加个css .operation{width:200px;height:200px;background:#eee;}  
obj.addClass("operation") 

性能排序:C>B>A

五.减少对DOM元素的操作次数

//不好的
$.each(arr,function(i){
   $(window).append('<li>'+arr[i]+'</li>')
});


//优化的
var _html=[];
$.each(arr,function(i){
   _html.push('<li>'+arr[i]+'</li>')
});
$(window).append(_html.join(''));

六.优化事件冒泡

//不好的
$('a').click(function(){
    //do someing...
});
 
 
//推荐的
$(document.body).click(function(event){
    if(event.target.tagName=='A'){
        //do someing...
    }
});

//JQuery的方法
$(document.body).delegate("a","click",function(){
 //do someing...
});

  

 

七.更高效的遍历方式

var list=ul.find("li"),
      e; 

//A:
var i=list.length;  
while(i--){  
    e=$(list[i])  
} 

//B:
list.each(function(){  
  e=$(this);  
}); 
 
//C:
$.each(list,function(){  
  e=$(this);  
});  

JQuery提供了$.fn.each()和$.each()两个方法来实现对集合的遍历,除此之外,还可以采用JS原生的for循环、while等来实现迭代,应该了解一下他们之间的性能差异:

测试说明:1w次执行耗时,单位毫秒/ms,统计三次运行的平均值

方案IE6IE7IE8IE9chromefirefoxoperasafari
A172219157303546
B219234203414658
C219234187523457

结论

    1. 总体上来说A>C>B

    2. 方案A有大约25%的性能提升,但是不稳定。追求极致性能,用方案A;

    3. 循环数量少的话,建议使用方案C,比较稳定;

八.优先使用原生属性

$.each(list,function(){  
  //A  
  var id");
  
  //B  
  var id=this.id;  
})  

很多常用的属性,比如id、name等都被浏览器原生实现,在JQuery中我们有时会用$(this).attr("id")的方式来获取id,这种方法的效率相比原生属性的获取效率而言,非常慢。

使用原生的API,可以极大的提高性能

测试说明:10w次执行耗时,单位毫秒/ms,统计三次运行的平均值

方案IE6IE7IE8IE9chromefirefoxoperasafari
A6880703042201188157244133135
B3103101502745173

九.可能的话,使用最新版本的JQuery

新版本总会对性能进行改进,还会提供一些新的方法。

如果可以的话,应该尽量选用最新的版本;