首頁 web前端 js教程 jQuery效能優化28個建議你值得借鏡_jquery

jQuery效能優化28個建議你值得借鏡_jquery

May 16, 2016 pm 05:41 PM
最佳化 效能

jQuery效能優化28個建議 一直在尋找有關jQuery效能最佳化方面的小竅門,能讓我那臃腫的動態網頁應用變得輕便些。找了很多文章後,我決定將最好最常用的一些優化效能的建議列出來。我也做了一個jQuery效能優化的簡潔樣式表,你可以列印出來或設為桌面背景。
一、選擇器效能最佳化建議
1. 總是從#id選擇器來繼承
這是jQuery選擇器的一條黃金法則。 jQuery選擇一個元素最快的方法就是用ID來選擇了。

複製程式碼 程式碼如下:

$('#content').hide(3();

或從ID選擇器繼承來選擇多個元素:
複製程式碼 程式碼如下:

$('#content p').hide();

2. class前面使用tag
jQuery中第二快的選擇器就是tag選擇器(如$('head')),因為它和直接來自於原生的Javascript方法getElementByTagName()。所以最好總是用tag來修飾class(並且不要忘了就近的ID)
複製程式碼 程式碼如下:

var receiveNewsletter = $('#nslForm input.on');

jQuery中class選擇器是最慢的,因為在IE瀏覽器下它會遍歷所有的DOM節點。盡量避免使用class選擇器。也不要用tag來修飾ID。下面的範例會遍歷所有的div元素來找出id為'content'的那個節點:
複製程式碼 程式碼如下:

var content = $('div#content'); // 很慢,不要用

用ID來修飾ID也是畫蛇添足:
複製程式碼 程式碼如下:

var traffic_light = $('#content #traffic_light'); // 很慢,不要使用

3. 使用子查詢
將父物件快取起來以備將來的使用
複製程式碼



複製程式碼


複製程式碼

複製程式碼 程式碼如下:
var header = $('#header');
var menu = header.find('.menu');
// 或
var menu = $('.menu', header);


4. 最佳化選擇器以適用Sizzle的「從右至左」模型
自版本1.3之後,jQuery採用了Sizzle函式庫,與之前的版本在選擇器引擎上的表現形式有很大的不同。它用“從左到右”的模型代替了“從右至左”的模型。確保最右邊的選擇器具體些,而左邊的選擇器選擇範圍較寬泛些: 複製代碼
代碼如下:

var linkContacts = $('.contact-links div.side-wrapper');


而不要使用 程式碼如下:


var linkContacts = $('a.contact-links .side-wrapper');


5. 採用find(),而不使用上下文來找出
.find()函數的確快些。但如果一個頁面有許多DOM節點時,需要來回尋找時,可能需要更多時間:
複製程式碼 程式碼如下:
var divs = $('.testdiv', '#pageBody'); // 2353 on Firebug 3.6 var divs = $('#pageBody').find('.testdiv '); // 2324 on Firebug 3.6 - The best time var divs = $('#pageBody .testdiv'); // 2469 on Firebug 3.6 6. 利用強大的鏈式操作採用jQuery的鍊式操作比快取選擇器更有效: 複製程式碼 程式碼如下:

$('li.menu-item').click(function () {alert('test click');})
.css('display', 'block')
.css('color', 'red')
fadeTo(2, 0.7);

7. 寫屬於你的選擇器
如果你經常在程式碼中使用選擇器,那麼擴展jQuery的$.expr[':']物件吧,編寫你自己的選擇器。在下面的範例中,我建立了一個abovethefold選擇器,用來選擇看不見的元素:
複製程式碼 程式碼如下:

$.extend($.expr[':'], {
abovethefold: function(el) {
return $(el).offset().top }
});
var nonVisibleElements = $('div:abovethefold'); // 選擇元素

二、最佳化DOM操作建議
8. 快取jQuery物件
將你常用的元素快取起來:
複製程式碼 程式碼如下:

var header = $('#header');
var divs = header.find('div');
var forms = header.find('form');

9. 當要進行DOM插入時,將所有元素封裝成一個元素
直接的DOM操作很慢。盡可能少的去更改HTML結構。
複製程式碼 程式碼如下:

var menu = '';
$('#header').prepend(menu);
// 千萬不要這樣做:
$('#header').prepend('');
for (var i = 1; i $('#menu').append('
  • ' i '
  • ');
    }

    10. 儘管jQuery不會拋出異常,但開發者也應該檢查對象
    儘管jQuery不會拋出大量的異常給用戶,但是開發者也不要依賴於此。 jQuery通常會執行了一大堆沒用的函數之後才確定一個物件是否存在。所以在對一個作一系列引用之前,應先檢查一下這個物件存不存在。
    11. 使用直接函數,而不要使用與與之等同的函數
    為了獲得更好的性能,你應該使用直接函數如$.ajax(),而不要使用$.get(),$ .getJSON(),$.post(),因為後面的幾個將會呼叫$.ajax()。
    12. 快取jQuery結果,以備後來使用
    你經常會獲得一個javasript應用對象-你可以用App.來保存你經常選擇的對象,以備將來使用:
    複製程式碼 程式碼如下:

    App.hiddenDivs = $('div.hidden');
    App.hiddenDivs = $('div.hidden');
    ///之後在你的應用程式中呼叫:
    App.hiddenDivs.find('span');


    13. 採用jQuery的內部函數data()來儲存狀態
    不要忘了採用.data()函數來儲存資訊: 程式碼如下:


    $( '#head').data('name', 'value');
    // 之後在你的應用程式中呼叫:
    $('#head').data('name');


    14. 使用jQuery utility函數
    不要忘了簡單實用的jQuery的utility函數。我最喜歡的是$.isFunction(), $isArray()和$.each()。
    15. 為HTML區塊新增「JS」的class
    當jQuery載入之後,先將一個叫」JS」的class 程式碼如下:


    $('HTML').addClass('JS');


    只有當使用者啟用JavaScript的時候,你才能加入CSS樣式。例如: 程式碼如下:


    /* 在css*/
    /* 在css中*/ .JS #myDiv{display:none;}
    所以當JavaScript啟用的時候,你可以將整個HTML內容隱藏起來,用jQuery來實現你想實現的(譬如:收起某些面板或當使用者點擊它們時展開)。而當Javascript沒有啟用的時候,瀏覽器呈現所有的內容,搜尋引擎爬蟲也會勾去所有內容。我將來會更多的使用這個技巧。
    三、關於最佳化事件效能的建議
    16. 延後到$(window).load
    有時候採用$(window).load()比$(document). ready()更快,因為後者不等所有的DOM元素都下載完之前執行。你應該在使用它之前測試它。
    17. 使用Event Delegation
    當你在一個容器中有許多節點,你想對所有的節點都綁定一個事件,delegation很適合這樣的應用場景。使用Delegation,我們只需要在父級綁定事件,然後查看哪個子節點(目標節點)觸發了事件。當你有一個很多資料的table的時候,你想對td節點設定事件,這就變得很方便。先取得table,再為所有的td節點設定delegation事件:
    複製程式碼 程式碼如下:

    $("table").delegate("td", "hover", function(){
    $(this).toggleClass("hover");
    });

    18. 使用ready事件的簡稱
    如果你想壓縮js插件,節約每一個字節,你應該避免使用$(document).onready()
    複製程式碼 程式碼如下:

    // 也不要使用
    $(document).ready(function (){
    //程式碼
    });
    // 你可以如此簡寫:
    $(function (){
    // 程式碼
    });

    四、測試jQuery
    19. jQuery單元測試
    測試JavaSript程式碼最好的方法就是人來測試。但你可以使用一些自動化的工具如Selenium,Funcunit,QUit,QMock來測試你的程式碼(尤其是插件)。我想在另外一個專題來討論這個話題因為實在有太多要說的了。
    20. 標準化你的jQuery程式碼
    常常標準化你的程式碼,看看哪個查詢比較慢,然後取代它。你可以用Firebug控制台。你也可以使用jQuery的快速函數來讓測試變得更容易:
    複製程式碼 程式碼如下:

    // 在Firebug控制台記錄資料的捷徑
    $.l($('div'));

    複製程式碼 程式碼如下:

    // 取得UNIX時間戳
    $.time();

    複製程式碼
    程式碼如下:


    // 在Firebug記錄執行程式碼時間
    $.lt() ;
    $('div');
    $.lt();
    複製代碼
    程式碼如下:


    // 將程式碼區塊放在一個for迴圈中測試執行時間
    $.bm("var divs = $('.testdiv', '#pageBody' );"); // 2353 on Firebug 3.6

    五、其他常用jQuery效能最佳化建議

    21. 使用最新版本的jQuery
    最新的版本往往是最好的。更換了版本後,不要忘記測試你的程式碼。有時候也不是完全向後相容的。
    22. 使用HMTL5
    新的HTML5標準帶來的是更輕巧的DOM結構。更輕巧的結構意味著使用jQuery需要更少的遍歷,以及更優良的載入效能。所以如果可能的話請使用HTML5。
    23. 如果為15個以上的元素加樣式時,直接為DOM元素加上style標籤
    要給少數的元素加樣式,最好的方法就是使用jQuey的css()函數。然而更15個以上的較多的元素添加樣式時,直接給DOM添加style 標籤更有效些。這個方法可以避免在程式碼中使用硬編碼(hard code)。 複製程式碼
    程式碼如下:


    $('')
    .appendTo('head');
    24. 避免載入多餘的程式碼
    將Javascript程式碼放在不同的檔案中是個好的方法,僅在需要的時候載入它們。這樣你不會載入不必要的程式碼和選擇器。也便於管理程式碼。
    25. 壓縮成一個主JS文件,將下載次數保持到最少
    當你已經確定了哪些文件是應該被載入的,那麼將它們打包成一個文件。用一些開源的工具可以自動幫你完成,例如使用Minify(和你的後端程式碼整合)或使用JSCompressor,YUI Compressor 或 Dean Edwards JS packer等線上工具可以為你壓縮檔案。我最喜歡的是JSCompressor。
    26. 需要的時候使用原生的Javasript
    使用jQuery是個很棒的事情,但不要忘了它也是Javascript的一個框架。所以你可以在jQuery程式碼有必要的時候也使用原生的Javascript函數,這樣能獲得更好的效能。
    27. 從Google載入jQuery框架
    當你的應用程式正式上線的時候,請從Google CDN載入jQuery,因為使用者可以從最近的地方取得程式碼。這樣你可以減少伺服器請求,而使用者如果瀏覽其他網站,而它也使用Google CDN的jQuery時,瀏覽器就會立即從快取中調出jQuery程式碼。
    複製程式碼 程式碼如下:

    // 連結特定版本的壓縮程式碼

    // 連結特定版本的壓縮程式碼

    // 連結特定版本的壓縮程式碼 28. 緩慢載入內容不僅能提高載入速度,也能提高SEO優化(Lazy load content for speed and SEO benefits) 使用Ajax來載入你的網站吧,這樣可以節省伺服器端載入時間。你可以從一個常見的側邊欄widget開始。
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    不同Java框架的效能對比 不同Java框架的效能對比 Jun 05, 2024 pm 07:14 PM

    不同Java框架的效能比較:RESTAPI請求處理:Vert.x最佳,請求速率達SpringBoot2倍,Dropwizard3倍。資料庫查詢:SpringBoot的HibernateORM優於Vert.x及Dropwizard的ORM。快取操作:Vert.x的Hazelcast客戶端優於SpringBoot及Dropwizard的快取機制。合適框架:根據應用需求選擇,Vert.x適用於高效能Web服務,SpringBoot適用於資料密集型應用,Dropwizard適用於微服務架構。

    PHP 陣列鍵值翻轉:不同方法的效能比較分析 PHP 陣列鍵值翻轉:不同方法的效能比較分析 May 03, 2024 pm 09:03 PM

    PHP數組鍵值翻轉方法效能比較顯示:array_flip()函數在大型數組(超過100萬個元素)下比for迴圈效能更優,耗時更短。手動翻轉鍵值的for迴圈方法耗時相對較長。

    C++ 程式最佳化:時間複雜度降低技巧 C++ 程式最佳化:時間複雜度降低技巧 Jun 01, 2024 am 11:19 AM

    時間複雜度衡量演算法執行時間與輸入規模的關係。降低C++程式時間複雜度的技巧包括:選擇合適的容器(如vector、list)以最佳化資料儲存和管理。利用高效演算法(如快速排序)以減少計算時間。消除多重運算以減少重複計算。利用條件分支以避免不必要的計算。透過使用更快的演算法(如二分搜尋)來優化線性搜尋。

    C++中如何優化多執行緒程式的效能? C++中如何優化多執行緒程式的效能? Jun 05, 2024 pm 02:04 PM

    優化C++多執行緒效能的有效技術包括:限制執行緒數量,避免爭用資源。使用輕量級互斥鎖,減少爭用。優化鎖的範圍,最小化等待時間。採用無鎖定資料結構,提高並發性。避免忙等,透過事件通知執行緒資源可用性。

    PHP 數組轉物件對效能的影響是什麼? PHP 數組轉物件對效能的影響是什麼? Apr 30, 2024 am 08:39 AM

    在PHP中,陣列到物件的轉換會對效能產生影響,主要受陣列大小、複雜度、物件類別等因素影響。為了優化效能,可以考慮使用自訂迭代器、避免不必要的轉換、批次轉換數組等技巧。

    如何使用基準測試來評估Java函數的效能? 如何使用基準測試來評估Java函數的效能? Apr 19, 2024 pm 10:18 PM

    基準測試Java函數效能的方法是使用Java微基準測試套件(JMH)。具體步驟包括:新增JMH依賴項到專案中。建立一個新的Java類,用@State註解表示基準測試方法。在類別中寫基準測試方法,用@Benchmark註解。使用JMH命令列工具執行基準測試。

    Java框架的效能比較 Java框架的效能比較 Jun 04, 2024 pm 03:56 PM

    根據基準測試,對於小型、高效能應用程序,Quarkus(快速啟動、低記憶體)或Micronaut(TechEmpower優異)是理想選擇。 SpringBoot適用於大型、全端應用程序,但啟動時間和記憶體佔用稍慢。

    Golang 中隨機數產生器的效能如何? Golang 中隨機數產生器的效能如何? Jun 01, 2024 pm 09:15 PM

    在Go中產生隨機數的最佳方法取決於應用程式所需的安全性等級。低安全性:使用math/rand套件產生偽隨機數字,適合大多數應用程式。高安全性:使用crypto/rand套件產生加密安全的隨機字節,適用於需要更強隨機性的應用程式。

    See all articles