jQuery性能提升方法

jQuery性能的方法提升

1.用對選擇器

最快的選擇器:id選擇器和元素標籤選擇器, jQuery內部會自動調用瀏覽器的原生方 法(比如getElementById()),所以它們的執行速度快。

較慢的選擇器:class選擇器; 大部分都有原生方法getElementByClassName(),速度不慢。IE5-IE8都沒有部署這個方法,相當慢。

最慢的選擇器:僞類選擇器和屬性選擇器; 最慢的,因爲瀏覽器沒有針對它們的原生方法。一些瀏覽器的新版本,增加了querySelector()和querySelectorAll()方法,因此會使這類選擇器的性能有大幅提高。

2.使用jQuery最新版本。因爲新版本會改進性能,還有很多新功能。

3. 理解子元素和父元素的關係

1、$parent.find('.child')

這條是最快的語句。.find()方法會調用瀏覽器的原生方法(getElementById,getElementByName,getElementByTagName等等),所以速度較快。`

2、$(‘.child’, $parent)

這條語句的意思是,給定一個DOM對象,然後從中選擇一個子元素。jQuery會自動把這條語句轉成$.parent.find(‘child’),這會導致一定的性能損失。它比最快的形式慢了5%-10%。

3、 $parent.children('.child')

這條語句在jQuery內部,會使用$.sibling()和javascript的nextSibling()方法,一個個遍歷節點。它比最快的形式大約慢50%。

4、$('#parent > .child')

jQuery內部使用Sizzle引擎,處理各種選擇器。Sizzle引擎的選擇順序是從右到左,所以這條語句是先選.child,然後再一個個過濾出父元素#parent,這導致它比最快的形式大約慢70%。

5、$(‘#parent .child')

這條語句與上一條是同樣的情況。但是,上一條只選擇直接的子元素,這一條可以於選擇多級子元素,所以它的速度更慢,大概比最快的形式慢了77%。

6、$('.child', $('#parent'))

jQuery內部會將這條語句轉成$('#parent').find('.child'),比最快的形式慢了23%。所以,最佳選擇是$parent.find('.child')。而且,由於$parent往往在前面的操作已經生成,jQuery會進行緩存,所以進一步加快了執行速度。

4、不要過度使用jQuery

jQuery速度再快,也無法與原生的javascript方法相比。所以有原生方法可以使用的場合,儘量避免使用jQuery。

$('a').click(function(){
    alert($(this).attr(‘id'));
});

//這段代碼的意思是,點擊a元素後,彈出該元素的id屬性。
//爲了獲取這個屬性,必須連續兩次調用jQuery,第一次是$(this),第二次是attr(‘id')。

//事實上,這種處理完全不必要。更正確的寫法是,直接採用javascript原生方法,調用this.id:

$('a').click(function(){
    alert(this.id);
});

//根據測試,this.id的速度比$(this).attr(‘id')快了20多倍。

5、緩存jquery dom對象

選中某一個網頁元素,是開銷很大的步驟。所以,使用選擇器的次數應該越少越好,並且儘可能緩存選中的結果,便於以後反覆使用。

//糟糕的寫法:
$('#demo').find('.p1');
$('#demo').find('.p2');

//良好的寫法是:
var $demo= $('#demo');
demo.find('.p1');
demo.find('.p2');

//根據測試,緩存比不緩存,快了2-3倍。

6、使用鏈式寫法

jQuery的一大特點,就是允許使用鏈式寫法。


$('div').find('p').eq(2).html('Hello');


採用鏈式寫法時,jQuery自動緩存每一步的結果,因此比非鏈式寫法要快。根據測試,鏈式寫法比(不使用緩存的)非鏈式寫法,大約快了25%。

7、事件的委託處理(Event Delegation)

javascript的事件模型,採用”冒泡”模式,子元素的事件會逐級向上”冒泡”,成爲父元素的事件。

利用這一點,可以大大簡化事件的綁定。比如,一個table,有100個td,點擊td時toggleClass,我們只要把這個事件綁定在table元素上面就可以了,因爲td元素髮生點擊事件之後,這個事件會”冒泡”到父元素table上面,從而被監聽到。

因此,這個事件只需要在父元素綁定1次即可,而不需要在子元素上綁定100次,從而大大提高性能。這就叫事件的”委託處理”,也就是子元素”委託”父元素處理這個事件。

$("table").delegate("td", "click", function(){
    $(this).toggleClass("click");
});

or

$("table").on("click", "td", function(){
    $(this).toggleClass("click");
});

8、減少DOM重排重繪

1、改動DOM結構開銷很大,因此不要頻繁使用.append()、.insertBefore()和.insetAfter()這樣的方法。如果要插入多個元素,就先把它們合併,然後再一次性插入。根據測試,合併插入比不合並插入,快了將近10倍。

2、如果你要對一個DOM元素進行大量處理,應該先用.detach()方法,把這個元素從DOM中取出來,處理完畢以後,再重新插回文檔。根據測試,使用.detach()方法比不使用時,快了60%。

3、如果你要在DOM元素上儲存數據:

//不要寫成下面這樣
var $elem = $('#elem'); 
$elem.data(key,value);

//而要寫成:
var $elem = $('#elem');
$.data($elem, key, value);

根據測試,後一種寫法要比前一種寫法,快了將近10倍。因爲elem.data()方法是定義在jQuery函數的prototype對象上面的,而$.data()方法是定義jQuery函數上面的,調用的時候不從複雜的jQuery對象上調用,所以速度快得多。

9、正確處理循環

循環總是一種比較耗時的操作,如果可以使用複雜的選擇器直接選中元素,就不要使用循環,去一個個辨認元素。javascript原生循環方法for和while,要比jQuery的.each()方法快,應該優先使用原生方法。

10、整合js文件
將多個js文件整合在一起可以減小對服務器請求次數,同時提高js文件加載速度。當然,整合時碰到的第一個問題可能會是對象不存在之類的,這就需要我們使用對象時,對它是否存在做個判斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章