jQuery 做好七件事幫你提升jQuery的性能

来源:http://www.cnblogs.com/shouce/archive/2016/01/11/5120120.html
-Advertisement-
Play Games

1. Append Outside of Loops凡是觸及到DOM都是有代價的。如果你向DOM當中附加大量的元素,你會想一次性將它們全部附加進來,而不是分多次進行。當在迴圈當中附加元素就會產生一個常見的問題。1 $.each( myArray, function( i, item ) {2 3 ....


1. Append Outside of Loops

凡是觸及到DOM都是有代價的。如果你向DOM當中附加大量的元素,你會想一次性將它們全部附加進來,而不是分多次進行。當在迴圈當中附加元素就會產生一個常見的問題。

複製代碼
1 $.each( myArray, function( i, item ) {
2 
3     var newListItem = "<li>" + item + "</li>";
4 
5     $( "#ballers" ).append( newListItem );
6 
7 });
複製代碼

一個常用的技巧是利用文檔片段(document fragment)。在迴圈的每一次迭代當中,將元素附加到片段而不是DOM元素當中。當迴圈結束後,將片段附加到DOM元素當中即可。

複製代碼
 1 var frag = document.createDocumentFragment();
 2 
 3 $.each( myArray, function( i, item ) {
 4 
 5     var newListItem = document.createElement( "li" );
 6     var itemText = document.createTextNode( item );
 7 
 8     newListItem.appendChild( itemText );
 9 
10     frag.appendChild( newListItem );
11 
12 });
13 
14 $( "#ballers" )[ 0 ].appendChild( frag );
複製代碼

另一個簡單的技巧是在迴圈的每次迭代當中,持續構建一個字元串。當迴圈結束後,將DOM元素的HTML設置成該字元串。

複製代碼
1 var myHtml = "";
2 
3 $.each( myArray, function( i, item ) {
4 
5     myHtml += "<li>" + item + "</li>";
6 
7 });
8 
9 $( "#ballers" ).html( myHtml );
複製代碼

當然還有其它一些技巧可以供你嘗試。一個名為 jsperf 的站點為測試這些性能提供了一條好的出路。該網站允許你使用基準測試每一個技巧,並將其跨平臺的性能測試結果可視化的展現出來。

2. Cache Length During Loops

在for迴圈當中,不要每次都訪問數組的 length 屬性;應當事先將其緩存起來。

複製代碼
1 var myLength = myArray.length;
2 
3 for ( var i = 0; i < myLength; i++ ) {
4 
5     // do stuff
6 
7 }
複製代碼

3. Detach Elements to Work with Them

操作DOM是緩慢的,因此你想儘可能減少對齊進行操作。jQuery在1.4版本當中引入了名為 detach() 的方法來幫助解決這一問題,它允許你在對元素進行操作時,將它們從DOM當中分離出來。

複製代碼
1 var $table = $( "#myTable" );
2 var $parent = $table.parent();
3 
4 $table.detach();
5 
6 // ... add lots and lots of rows to table
7 
8 $parent.append( $table );
複製代碼

4. Don’t Act on Absent Elements

如果你正打算在一個空的選擇器上運行大量的代碼,jQuery並不會給予任何的提示 -- 它將會繼續的執行,就像是沒有發生任何的錯誤。必須由你來驗證選擇器包含了多少元素。

複製代碼
 1 // Bad: This runs three functions before it
 2 // realizes there's nothing in the selection
 3 $( "#nosuchthing" ).slideUp();
 4 
 5 // Better:
 6 var $mySelection = $( "#nosuchthing" );
 7 
 8 if ( $mySelection.length ) {
 9 
10     $mySelection.slideUp();
11 
12 }
13 
14 // Best: Add a doOnce plugin.
15 jQuery.fn.doOnce = function( func ) {
16 
17     this.length && func.apply( this );
18 
19     return this;
20 
21 }
22 
23 $( "li.cartitems" ).doOnce(function() {

24 
25     // make it ajax! \o/

26 
27 });
複製代碼

本指南特別適用於那些當選擇器不包含元素時還需要大量的開銷的 jQuery UI 部件。

5. Optimize Selectors

選擇器的優化和過去比起來並不是那麼的重要,因為很多瀏覽器都實現了 document.querySelectorAll() 方法並且jQuery將選擇器的負擔轉移到了瀏覽器上面。但是仍然有一些技巧需要銘記在心。

基於ID的選擇器

以一個ID作為選擇器的開始總是最好的。

1 // Fast:
2 $( "#container div.robotarm" );
3 
4 // Super-fast:
5 $( "#container" ).find( "div.robotarm" );

採用 .find() 方法的方式將更加的快速,因為第一個選擇器已經過處理,而無需通過嘈雜的選擇器引擎 -- ID-Only的選擇器已使用 document.getElementById() 方法進行處理,之所以快速,是因為它是瀏覽器的原生方法。

特異性

儘量詳細的描述選擇器的右側,對於左側則應反其道而行之。

1 // Unoptimized:
2 $( "div.data .gonzalez" );
3 
4 // Optimized:
5 $( ".data td.gonzalez" );

儘量在選擇器的最右側使用 tag.class 的形式來描述選擇器,而在左側則儘量只使用 tag 或者 .class 。

避免過度使用特異性

1 $( ".data table.attendees td.gonzalez" );
2 
3 // Better: Drop the middle if possible.
4 $( ".data td.gonzalez" );

去討好“DOM”總是有利於提升選擇器的性能,因為選擇器引擎在搜尋元素時無需進行太多的遍歷。

避免使用通用選擇器

如果一個選擇器明確或暗示它能在不確定的範圍內進行匹配將會大大影響性能。

1 $( ".buttons > *" ); // Extremely expensive.
2 $( ".buttons" ).children(); // Much better.
3 
4 $( ".category :radio" ); // Implied universal selection.
5 $( ".category *:radio" ); // Same thing, explicit now.
6 $( ".category input:radio" ); // Much better.

6. Use Stylesheets for Changing CSS on Many Elements

假如你使用 .css() 方法來改變超過20個元素的CSS,應當考慮為頁面添加一個樣式標簽作為替代,這樣做可以提升將近60%的速度。

1 // Fine for up to 20 elements, slow after that:
2 $( "a.swedberg" ).css( "color", "#0769ad" );
3 
4 // Much faster:
5 $( "<style type=\"text/css\">a.swedberg { color: #0769ad }</style>")
6     .appendTo( "head" );

7. Don’t Treat jQuery as a Black Box

把jQuery的源碼當成文檔,可以把它(http://bit.ly/jqsource)保存在你的收藏夾內,經常的查閱參考。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 色溫色溫是表示光源光譜質量最通用的指標。 GPUImage中我們通過GPUImageWhiteBalanceFilter來實現 頂點著色uniform sampler2D inputImageTexture;varying highp vec2 textureCoordinate; unif...
  • 寫界面可以說是每位移動應用開發者的基本功,也是一位合格移動應用開發者繞不過去的坎。但就如不是每一位開發者都能夠成為合格的開發者一樣,本人在 不同的團隊中發現,甚少有人能夠編寫出合格的UI代碼;而非常奇怪的是,在很多的開發者論壇上看到我們移動開發者更多關註於某個控制項或者是動畫,但卻很少 看到深入剖析U...
  • 一、圖片預覽:一、實現功能:需求要實現佈局中為圓形圖片,圖片背景與圖標分開且合併到一個ImageView。二、具體實現: XML中佈局中定義ImageView,關健設置兩個參數 Android:backgroup(設置背景),Android:src(設置ImageVIew中圖片),圓形圖片製作Dra...
  • 對比度指的是一幅圖像中明暗區域最亮的白和最暗的黑之間不同亮度層級的測量,即指一幅圖像灰度反差的大小。 在GPUImage中通過GPUImageContrastFilter來實現 片段著色器 varying highp vec2 textureCoordinate; uniform samp...
  • 這兩天好好的研究了下推送這功能,關於它我將分成兩部分來講,一、IOS手機端,二、Servlet服務端,今天先講下IOS端一、感受下麵講下我對推送這個功能在IOS下的感受,這個算是我做了服務端的功能和手機端的功能後的一個體會吧, 這功能在IOS上是多少給我帶來了點雞肋的感覺,首先很多時候收到推送有延時...
  • 剛開始android編程的時候, 關於ImageView.ScaleType網路上好多, 說實話沒看懂. 本文就是為了講清楚這個, 有用的話轉走, 請註明原地址和作者.
  • 終於學到事件了,不知道為何聽到“事件”就有一種莫名的興奮。可能是之前的那些知識點過於枯燥無味吧,說起事件感覺頓時高大上了。今天我們就來好好分析下這個高大上的東西。 可以說,如果沒有事件我們的頁面就只能閱讀了。有了事件,我們可以通過鍵盤或是滑鼠和頁面交互了,通過我們不同的操作頁面給出不同的響應。 ...
  • 前幾年,我有機會能參與一些有趣的項目,並且獨立完成開發、升級、重構以及新功能的開發等工作。 本文總結了一些PHP程式員在Web開發中經常 忽略的關鍵錯誤,尤其是在處理中大型的項目上問題更為突出。典型的錯誤表現在不能很好區分各種開發環境和沒有使用緩存和備份等。 下麵以PHP為例,但是其核心思想對每.....
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...