1. Append Outside of Loops
凡是觸及DOM都是有代價的。如果你在DOM當中附加大量的元素,你會想一次將它們全部附加進來,而不是分多次進行。當在循環當中附加元素就會產生一個常見的問題。
一個常用的技巧是利用文件片段(document fragment)。在循環的每一次迭代當中,將元素附加到片段而不是DOM元素當中。當循環結束後,將片段附加到DOM元素當中即可。
var newListItem = document.createElement( "li" );
var itemText = document.createTextNode( item );
frag.appendChild( newListItem );
});
$( "#ballers" )[ 0 ].appendChild( frag );
var myHml = "";
$.each( myArray, function( i, item ) {
myHtml = "
});
當然還有其它一些技巧可以供你嘗試。一個名為 jsperf 的網站為測試這些效能提供了一個好的出路。該網站允許你使用基準測試每一個技巧,並將其跨平台的效能測試結果視覺化的展現出來。
2. Cache Length During Loops
在for迴圈當中,不要每次都存取陣列的 length 屬性;應事先將其快取起來。
var myLength = myAr.
for ( var i = 0; i // do stuff
}
3. Detach Elements to Work with Them
操作DOM是緩慢的,因此你想盡可能減少對齊進行操作。 jQuery在1.4版本當中引入了名為 detach() 的方法來幫助解決這個問題,它允許你在對元素進行操作時,將它們從DOM當中分離出來。
程式碼如下:
$table.detach();
// ... add lots and lots of rows to table
$parent.append( $table );
4. Don't Act on Absent Elements
如果你正打算在一個空的選擇器上運行大量的程式碼,jQuery並不會給予任何的提示 -- 它將繼續的執行,就像是沒有發生任何的錯誤。必須由你來驗證選擇器包含了多少元素。
程式碼如下:
// Better:
var $mySelection = $( "#nosuchthing" );
if ( $mySelection.length ) {
$mySelection.slideUp();
}
// Best: Add a doOnce plugin.
jQuery.fn.doOnce = function( func ) {
this.length && func.apply( this );
return this;
}
$( "li.cartitems" ).doOnce(function() {
// make it ajax! o/
});
本指南特別適用於那些當選擇器不包含元素時還需要大量的開銷的 jQuery UI 部件。
5. Optimize Selectors
選擇器的最佳化和過去比起來並不是那麼的重要,因為許多瀏覽器都實作了 document.querySelectorAll() 方法並且jQuery將選擇器的負擔轉移到了瀏覽器上面。但仍然有一些技巧需要銘記在心。
基於ID的選擇器
以一個ID作為選擇器的開始總是最好的。
採用.find() 方法的方式將更加的快速,因為第一個選擇器已經過處理,而無需通過嘈雜的選擇器引擎-- ID-Only的選擇器已使用document.getElementById() 方法進行處理,之所以快速,是因為它是瀏覽器的原生方法。
特異性
盡量在選擇器的最右側使用 tag.class 的形式來描述選擇器,而在左側則盡量只使用 tag 或 .class 。
避免過度使用特異性
$( ".data td.gonzalez" );
去討好「DOM」總是有利於提升選擇器的效能,因為選擇器引擎在搜尋元素時無需進行太多的遍歷。
避免使用通用選擇器
複製程式碼Use Stylesheets for Changing CSS on Many Elements
Use Stylesheets for Changing CSS on Many ElementsUse Stylesheets for Changing CSS on Many Elements