提升jQuery的性能需要做好七件事
做好七件事幫你提升jQuery的性能,想知道哪幾件事情嗎?
1. Append Outside of Loops
凡是觸及到DOM都是有代價的。如果你向DOM當(dāng)中附加大量的元素,你會想一次性將它們?nèi)扛郊舆M(jìn)來,而不是分多次進(jìn)行。當(dāng)在循環(huán)當(dāng)中附加元素就會產(chǎn)生一個常見的問題。
$.each( myArray, function( i, item ) { var newListItem = "<li>" + item + "</li>"; $( "#ballers" ).append( newListItem ); });
一個常用的技巧是利用文檔片段(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 );
另一個簡單的技巧是在循環(huán)的每次迭代當(dāng)中,持續(xù)構(gòu)建一個字符串。當(dāng)循環(huán)結(jié)束后,將DOM元素的HTML設(shè)置成該字符串。
var myHtml = ""; $.each( myArray, function( i, item ) { myHtml += "<li>" + item + "</li>"; }); $( "#ballers" ).html( myHtml );
當(dāng)然還有其它一些技巧可以供你嘗試。一個名為 jsperf 的站點為測試這些性能提供了一條好的出路。該網(wǎng)站允許你使用基準(zhǔn)測試每一個技巧,并將其跨平臺的性能測試結(jié)果可視化的展現(xiàn)出來。
2. Cache Length During Loops
在for循環(huán)當(dāng)中,不要每次都訪問數(shù)組的 length 屬性;應(yīng)當(dāng)事先將其緩存起來。
var myLength = myArray.length; for ( var i = 0; i < myLength; i++ ) { // do stuff }
3. Detach Elements to Work with Them
操作DOM是緩慢的,因此你想盡可能減少對齊進(jìn)行操作。jQuery在1.4版本當(dāng)中引入了名為 detach() 的方法來幫助解決這一問題,它允許你在對元素進(jìn)行操作時,將它們從DOM當(dāng)中分離出來。
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
如果你正打算在一個空的選擇器上運行大量的代碼,jQuery并不會給予任何的提示 -- 它將會繼續(xù)的執(zhí)行,就像是沒有發(fā)生任何的錯誤。必須由你來驗證選擇器包含了多少元素。
// 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)選擇器不包含元素時還需要大量的開銷的 jQuery UI 部件。
5. Optimize Selectors
選擇器的優(yōu)化和過去比起來并不是那么的重要,因為很多瀏覽器都實現(xiàn)了 document.querySelectorAll() 方法并且jQuery將選擇器的負(fù)擔(dān)轉(zhuǎn)移到了瀏覽器上面。但是仍然有一些技巧需要銘記在心。
基于ID的選擇器
以一個ID作為選擇器的開始總是最好的。
// Fast: $( "#container div.robotarm" ); // Super-fast: $( "#container" ).find( "div.robotarm" );
采用 .find() 方法的方式將更加的快速,因為第一個選擇器已經(jīng)過處理,而無需通過嘈雜的選擇器引擎 -- ID-Only的選擇器已使用 document.getElementById() 方法進(jìn)行處理,之所以快速,是因為它是瀏覽器的原生方法。
特異性
盡量詳細(xì)的描述選擇器的右側(cè),對于左側(cè)則應(yīng)反其道而行之。
// Unoptimized: $( "div.data .gonzalez" ); // Optimized: $( ".data td.gonzalez" );
盡量在選擇器的最右側(cè)使用 tag.class 的形式來描述選擇器,而在左側(cè)則盡量只使用 tag 或者 .class 。
避免過度使用特異性
$( ".data table.attendees td.gonzalez" ); // Better: Drop the middle if possible. $( ".data td.gonzalez" );
去討好“DOM”總是有利于提升選擇器的性能,因為選擇器引擎在搜尋元素時無需進(jìn)行太多的遍歷。
避免使用通用選擇器
如果一個選擇器明確或暗示它能在不確定的范圍內(nèi)進(jìn)行匹配將會大大影響性能。
$( ".buttons > *" ); // Extremely expensive. $( ".buttons" ).children(); // Much better. $( ".category :radio" ); // Implied universal selection. $( ".category *:radio" ); // Same thing, explicit now. $( ".category input:radio" ); // Much better. 復(fù)制代碼 6. Use Stylesheets for Changing CSS on Many Elements
假如你使用 .css() 方法來改變超過20個元素的CSS,應(yīng)當(dāng)考慮為頁面添加一個樣式標(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" );
7. Don't Treat jQuery as a Black Box
以上就是提升jQuery的性能需要做好的七件事,清楚了吧!
相關(guān)文章
jquery?ajax實現(xiàn)文件上傳提交的實戰(zhàn)步驟
今天項目中加了一個上傳文件的需求,我就搞了一下,下面這篇文章主要給大家介紹了關(guān)于jquery?ajax實現(xiàn)文件上傳提交的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11js實現(xiàn)圖片放大縮小功能后進(jìn)行復(fù)雜排序的方法
這是一個基于jquery的圖片效果,它的作用是:當(dāng)圖片點擊變大(變小)時,其它圖片按照一定的規(guī)則進(jìn)行排序運動2012-11-11JQuery對表格進(jìn)行操作的常用技巧總結(jié)
這篇文章主要介紹了JQuery對表格進(jìn)行操作的常用技巧,需要的朋友可以參考下2014-04-04jQuery+json實現(xiàn)的簡易Ajax調(diào)用實例
這篇文章主要介紹了jQuery+json實現(xiàn)的簡易Ajax調(diào)用,結(jié)合實例形式分析了jQuery基于ajax實現(xiàn)json傳參調(diào)用的技巧,需要的朋友可以參考下2015-12-12