jQuery性能優化

cru1se 9年前發布 | 37K 次閱讀 jQuery 性能優化 Ajax框架

1.盡量使用最新版本的jQuery 類庫。

jQuery 每一個新的版本都會較上一版本進行bug修復和一些優化,同時也會包含一些創新,所以建議使用最新版本的jQuery來提高性能。不過更換新版本之后,不要忘記測試代碼的兼容性。

2. 使用合適的選擇器

1.$(“#id”) 使用id來定位DOM元素無疑是最佳提高性能的方式,因為jQuery 底層將直接調用javascript的原生方法document.getElementById()。此外選擇元素時,應該盡量縮小DOM的查找范圍。例如在某個id下查找 div.$("#id").find("div"); 這樣也能提高查找效率。

2.使用標簽選擇器 $("div") $("input")
使用標簽選擇器將會直接調用javascript的document.getElementsByTagName()方法來定位DOM元素。

3.使用類選擇器 $(".class")。
使用類選擇器,如果瀏覽器支持javascript的document.getElementsByClassName()方法,則直接使用該方法,否則就逐個遍歷DOM元素。

4.使用屬性選擇器 $("[attribute=value]")
較新的瀏覽器可能支持document.querySelectorAll()方法,但是有的瀏覽器可能不支持,這在于他們的內核不一樣。使用這種方式來查找DOM元素,性能并不理想,在開發中應該盡量避免使用。

5.使用偽選擇器 $(":hidden")
和上面的屬性選擇器是同一類,javascript并沒有對這類的實現,只有通過逐個遍歷DOM元素來查找滿足要求的元素,這個盡量不要使用。如果必須查找,則盡量縮小范圍,從其父元素來進行搜索。例如: $("#id").find(":hidden");$("div.div").filter(":hidden") 等。

上面的選擇器性能自上而下依次下降,如果對上面有所疑問,可以自己在頁面上進行測試。

3.緩存對象

如果在jQuery開發中經常使用一個對象,建議進行對其緩存,否則你每次使用$()這種方式都會創建一個jQuery對象。
例如有的人喜歡這樣寫:

$("#btn").bind("click",function(){});
$("#btn").css("border","1px");
$("#btn").css("backgroud-color","red");
$("#btn")....

這樣最終會使jQuery創建很多的$(“#btn”)對象,而且在創建之前都必須進行DOM 查找一次。所以建議使用緩存對象或者鏈式的方式。

//緩存對象
$btn=$("#btn");
$btn.bind("click",function(){});
btn.css("border","1px");
btn.css("backgroud-color","red");
btn....
//鏈式操作
$("#btn").bind("click",function(){})
         .css("border","1px")
         .css("backgroud-color","red")
         ....;
 //如果像上面有相同的方法可以進行合并
 $("#btn").bind("click",function(){})
         .css({"border":"1px"},
              {"backgroud-color":"red"})
         ....;

如果某個對象經常使用也可以添加到全局函數中
window.myCustomGlob={
head: ( “ h e a ” ) , t i t l e :

(“title”),
btn:$(“#btn”)
};

記住:永遠不要讓相同的選擇器在代碼里面出現多次。

4.循環時的DOM操作

例如:

$ulList=$("#ulList");//ul列表集合
for(var i=0;i<10;i++)
{
$ulList.append("<li>"+i+"</li>");
}

上面代碼將每一個新的li元素添加到ul中,實際上jQuery操作消耗的性能也不低,因為上面對DOM操作了10次,最好是在插入之前把li創建好。

$ulList=$("#ulList");//ul列表集合
var li="";
for(var i=0;i<10;i++)
{
li+="<li>"+i+"</li>";
}
$ulList.append(li);

5.使用js數組的join()方法來拼接字符串

上面使用+號拼接的li字符串,但是現在可以使用數組來轉換字符串,性能比+號拼接微好些了,尤其是處理長字符串。

$ulList=$("#ulList");//ul列表集合
var liArr=[];
for(var i=0;i<10;i++)
{
liArr[i]="<li>"+i+"</li>";
}
$ulList.append(liArr.join(''));

我自己大概測試了一下,

數量 + 數組
100 1 0
1000 7 4
10000 53 49

但是在循環100000的情況下,+號大部分比數組的時間稍微小一些。這兩個性能可以自行選擇。

6.數組方式使用jQuery對象

使用jQuery選擇器獲取的結果是一個jQuery對象。jQuery類庫會讓你感覺正在使用一個定義了索引和長度數組。在性能方面,建議使用for或者while循環處理,而不是使用$.each()。這樣使你的代碼更快。

$.each(array,function(i){

});</code></pre>

可以使用for代替each方法,代碼如下:

for(var i=0,len=array.length;i<len;i++)
{
}

另外,檢查長度也是檢查一個jQuery對象是否存在的方式。

var $btn=$("#btn");
if($btn)//總是true
{};
if($btn.length)//元素存在才返回true
{}

7.事件代理

每一個JavaScript事件(click,mousedown)都會冒泡到父級節點。當我們需要給多個元素調用同個函數時這點會很有用。比如,給一個表格綁定點擊td后,背景色設置為紅色。代碼如下:

$("#table td").click(function(){
    $(this).css("background","red");
});

如果table中有100個td,在使用上面的方式時,就綁定了100個事件,這將帶來負面的性能影響。代替這種效率很差的多元素事件監聽的方法是,只需要向它們的父節點綁定一次事件,然后通過event.target獲取當前點擊的元素即可。

$("#table").click(function (event) {
                    var $td = $(event.target);//捕捉觸發的目標元素
                    if ($td[0].nodeName == "TD") {
                        $td.css("background", "red");
                    }
                });

在改進的代碼中,你只為一個元素綁定了1個事件,這種方式的性能要優于之前那種。
在jQuery1.7以后的版本中提供了一個新的方式on(),來幫助將整個事件監聽封裝到一個更加便利的方法中,如下:

$("#table").on("click",'td',function(){
    $(this).css("background","red");
});

 

 

來自:http://blog.csdn.net/u010533180/article/details/53816040

 

 本文由用戶 cru1se 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!