做好七件事幫你提升jQuery的性能
1. Append Outside of Loops
凡是觸及到DOM都是有代價(jià)的。如果你向DOM當(dāng)中附加大量的元素,你會(huì)想一次性將它們?nèi)扛郊舆M(jìn)來(lái),而不是分多次進(jìn)行。當(dāng)在循環(huán)當(dāng)中附加元素就會(huì)產(chǎn)生一個(gè)常見的問題。
$.each( myArray, function( i, item ) {
var newListItem = "<li>" + item + "</li>";
$( "#ballers" ).append( newListItem );
});
一個(gè)常用的技巧是利用文檔片段(document fragment)。在循環(huán)的每一次迭代當(dāng)中,將元素附加到片段而不是DOM元素當(dāng)中。當(dāng)循環(huán)結(jié)束后,將片段附加到DOM元素當(dāng)中即可。
var frag = document.createDocumentFragment();
$.each( myArray, function( i, item ) {
var newListItem = document.createElement( "li" );
var itemText = document.createTextNode( item );
newListItem.appendChild( itemText );
frag.appendChild( newListItem );
});
$( "#ballers" )[ 0 ].appendChild( frag );
另一個(gè)簡(jiǎn)單的技巧是在循環(huán)的每次迭代當(dāng)中,持續(xù)構(gòu)建一個(gè)字符串。當(dāng)循環(huán)結(jié)束后,將DOM元素的HTML設(shè)置成該字符串。
var myHtml = "";
$.each( myArray, function( i, item ) {
myHtml += "<li>" + item + "</li>";
});
$( "#ballers" ).html( myHtml );
當(dāng)然還有其它一些技巧可以供你嘗試。一個(gè)名為 jsperf 的站點(diǎn)為測(cè)試這些性能提供了一條好的出路。該網(wǎng)站允許你使用基準(zhǔn)測(cè)試每一個(gè)技巧,并將其跨平臺(tái)的性能測(cè)試結(jié)果可視化的展現(xiàn)出來(lái)。
2. Cache Length During Loops
在for循環(huán)當(dāng)中,不要每次都訪問數(shù)組的 length 屬性;應(yīng)當(dāng)事先將其緩存起來(lái)。
var myLength = myArray.length;
for ( var i = 0; i < myLength; i++ ) {
// do stuff
}
3. Detach Elements to Work with Them
操作DOM是緩慢的,因此你想盡可能減少對(duì)齊進(jìn)行操作。jQuery在1.4版本當(dāng)中引入了名為 detach() 的方法來(lái)幫助解決這一問題,它允許你在對(duì)元素進(jìn)行操作時(shí),將它們從DOM當(dāng)中分離出來(lái)。
var $table = $( "#myTable" );
var $parent = $table.parent();
$table.detach();
// ... add lots and lots of rows to table
$parent.append( $table );
4. Don't Act on Absent Elements
如果你正打算在一個(gè)空的選擇器上運(yùn)行大量的代碼,jQuery并不會(huì)給予任何的提示 -- 它將會(huì)繼續(xù)的執(zhí)行,就像是沒有發(fā)生任何的錯(cuò)誤。必須由你來(lái)驗(yàn)證選擇器包含了多少元素。
// Bad: This runs three functions before it
// realizes there's nothing in the selection
$( "#nosuchthing" ).slideUp();
// 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/
});
本指南特別適用于那些當(dāng)選擇器不包含元素時(shí)還需要大量的開銷的 jQuery UI 部件。
5. Optimize Selectors
選擇器的優(yōu)化和過去比起來(lái)并不是那么的重要,因?yàn)楹芏酁g覽器都實(shí)現(xiàn)了 document.querySelectorAll() 方法并且jQuery將選擇器的負(fù)擔(dān)轉(zhuǎn)移到了瀏覽器上面。但是仍然有一些技巧需要銘記在心。
基于ID的選擇器
以一個(gè)ID作為選擇器的開始總是最好的。
// Fast:
$( "#container div.robotarm" );
// Super-fast:
$( "#container" ).find( "div.robotarm" );
采用 .find() 方法的方式將更加的快速,因?yàn)榈谝粋€(gè)選擇器已經(jīng)過處理,而無(wú)需通過嘈雜的選擇器引擎 -- ID-Only的選擇器已使用 document.getElementById() 方法進(jìn)行處理,之所以快速,是因?yàn)樗菫g覽器的原生方法。
特異性
盡量詳細(xì)的描述選擇器的右側(cè),對(duì)于左側(cè)則應(yīng)反其道而行之。
// Unoptimized:
$( "div.data .gonzalez" );
// Optimized:
$( ".data td.gonzalez" );
盡量在選擇器的最右側(cè)使用 tag.class 的形式來(lái)描述選擇器,而在左側(cè)則盡量只使用 tag 或者 .class 。
避免過度使用特異性
$( ".data table.attendees td.gonzalez" );
// Better: Drop the middle if possible.
$( ".data td.gonzalez" );
去討好“DOM”總是有利于提升選擇器的性能,因?yàn)檫x擇器引擎在搜尋元素時(shí)無(wú)需進(jìn)行太多的遍歷。
避免使用通用選擇器
如果一個(gè)選擇器明確或暗示它能在不確定的范圍內(nèi)進(jìn)行匹配將會(huì)大大影響性能。
$( ".buttons > *" ); // Extremely expensive.
$( ".buttons" ).children(); // Much better.
$( ".category :radio" ); // Implied universal selection.
$( ".category *:radio" ); // Same thing, explicit now.
$( ".category input:radio" ); // Much better.
Use Stylesheets for Changing CSS on Many Elements
假如你使用 .css() 方法來(lái)改變超過20個(gè)元素的CSS,應(yīng)當(dāng)考慮為頁(yè)面添加一個(gè)樣式標(biāo)簽作為替代,這樣做可以提升將近60%的速度。
// Fine for up to 20 elements, slow after that:
$( "a.swedberg" ).css( "color", "#0769ad" );
// Much faster:
$( "<style type=\"text/css\">a.swedberg { color: #0769ad }</style>")
.appendTo( "head" );
Don't Treat jQuery as a Black Box
把jQuery的源碼當(dāng)成文檔,可以把它(http://bit.ly/jqsource)保存在你的收藏夾內(nèi),經(jīng)常的查閱參考。
相關(guān)文章
使用jquery模擬a標(biāo)簽的click事件無(wú)法實(shí)現(xiàn)跳轉(zhuǎn)的解決
這篇文章主要給大家介紹了關(guān)于使用jquery模擬a標(biāo)簽的click事件無(wú)法實(shí)現(xiàn)跳轉(zhuǎn)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
基于jQuery和Bootstrap框架實(shí)現(xiàn)仿知乎前端動(dòng)態(tài)列表效果
最近基于jQuery和Bootstrap框架實(shí)現(xiàn)了一個(gè)仿知乎動(dòng)態(tài)列表的前端效果,基本實(shí)現(xiàn)了和知乎動(dòng)態(tài)列表相同的效果,下面小編通過本文給大家分享實(shí)現(xiàn)思路及代碼,對(duì)bootstrap 實(shí)現(xiàn)仿知乎前端動(dòng)態(tài)列表效果感興趣的朋友一起看看吧2016-11-11
JQuery擴(kuò)展插件Validate 5添加自定義驗(yàn)證方法
從前面的示例中不難看出validate中自帶的驗(yàn)證方法足以滿足一般的要求,對(duì)于特別的要求可以使用addMethod(name,method,message)添加自定義的驗(yàn)證規(guī)則,下面的示例中添加了一個(gè)用于正則表達(dá)式驗(yàn)證的擴(kuò)展驗(yàn)證的方法2011-09-09
使用jQuery的attr方法來(lái)修改onclick值
這篇文章主要介紹了通過jQuery的attr修改onclick值的解決方法 ,需要的朋友可以參考下2014-07-07
jQuery在ie6下無(wú)法設(shè)置select選中的解決方法詳解
這篇文章主要介紹了jQuery在ie6下無(wú)法設(shè)置select選中的解決方法,結(jié)合實(shí)例分析了jQuery在ie6下無(wú)法設(shè)置select選中的原因與相關(guān)處理技巧,需要的朋友可以參考下2016-09-09
jquery ajax傳遞中文參數(shù)亂碼問題及解決方法說(shuō)明
本篇文章主要是對(duì)jquery ajax傳遞中文參數(shù)亂碼問題及解決方法進(jìn)行了介紹,需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
多種JQuery循環(huán)滾動(dòng)文字圖片效果代碼
這篇文章主要為大家提供了多種JQuery循環(huán)滾動(dòng)文字圖片效果代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02

