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文件加載速度。當然,整合時碰到的第一個問題可能會是對象不存在之類的,這就需要我們使用對象時,對它是否存在做個判斷。