jquery性能優化的十種方法

有時候咱們在書寫jquery的時候,爲了書寫代碼方便,每每忽略了程序執行過程當中,給客戶端帶來的壓力。隨之而來的就是在某些低端瀏覽器或者低端電腦上運行速度緩慢,甚至沒法運行等問題。css

所以咱們有必要對咱們本身書寫的jquery代碼進行優化,以達到更快捷、更流暢的運行效果。html

 

在這裏整理了十種jquery優化的方法,以下:jquery

1,老是從ID選擇器開始繼承
在jQuery中最快的選擇器是ID選擇器,由於它直接來自於JavaScript的getElementById()方法。
例若有一段HTML代碼:express

<div id="content">
    <form method="post" action="#">
    <h2>交通訊號燈</h2>
    <ul id="traffic_light">
    <li><input type="radio" class="on" name="light" value="red" /> 紅色</li>
    <li><input type="radio" class="off" name="light" value="yellow" /> 黃色</li>
    <li><input type="radio" class="off" name="light" value="green" /> 綠色</li>
    </ul>
    <input class="button" id="traffic_button" type="submit" value="Go" />
    </form>
    </div>

若是採用下面的選擇器,那麼效率是低效的。
var traffic_button = $(「#content .button」);
由於button已經有ID了,咱們能夠直接使用ID選擇器。以下所示:
var traffic_button = $(「#traffic_button」);
固然 這只是對於單一的元素來說。若是你須要選擇多個元素,這必然會涉及到 DOM遍歷和循環,
爲了提升性能,建議從最近的ID開始繼承。
以下所示:
var traffic_lights = $(「#traffic_light input」);


2,在class前使用tag(標籤名)
在jQuery中第二快的選擇器是tag(標籤)選擇器( 好比:$(「head」) )。
跟ID選擇器累時,由於它來自原生的getElementsByTagName() 方法。
繼續看剛纔那段HTML代碼:瀏覽器

<div id="content">
 
    <form method="post" action="#">
 
    <h2>交通訊號燈</h2>
 
    <ul id="traffic_light">
 
    <li><input type="radio" class="on" name="light" value="red" /> 紅色</li>
 
    <li><input type="radio" class="off" name="light" value="yellow" /> 黃色</li>
 
    <li><input type="radio" class="off" name="light" value="green" /> 綠色</li>
 
    </ul>
 
    <input class="button" id="traffic_button" type="submit" value="Go" />
 
    </form>
 
    </div>

好比須要選擇 紅綠 單選框,
那麼可使用一個tag name來限制(修飾)class ,以下所示:
var active_light = $(「input.on」);
固然也能夠結合 就近的ID,以下所示:
var active_light = $(「#traffic_light input.on」);緩存

在使用tag來修飾class的時候,咱們須要注意如下幾點:
(1) 不要使用tag來修飾ID,以下所示:
var content = $(「div#content」);
這樣一來,選擇器會先遍歷全部的div元素,而後匹配#content。
(好像jQuery從1.3.1開始改變了選擇器核心後,不存在這個問題了。暫時沒法考證。)
(2)不要多此一舉的使用ID來修飾ID,以下所示:
var traffic_light = $(「#content #traffic_light」);


3,將jQuery對象緩存起來
把jQuery對象緩存起來 就是要告訴咱們 要養成將jQuery對象緩存進變量的習慣。
下面是一個jQuery新手寫的一段代碼:性能優化

 $("#traffic_light input.on").bind("click", function(){  });
    $("#traffic_light input.on").css("border", "1px dashed yellow");
    $("#traffic_light input.on").css("background-color", "orange");
    $("#traffic_light input.on").fadeIn("slow");

但切記不要這麼作。
咱們應該先將對象緩存進一個變量而後再操做,以下所示:app

var $active_light = $("#traffic_light input.on");
    $active_light.bind("click", function(){  });
    $active_light.css("border", "1px dashed yellow");
    $active_light.css("background-color", "orange");
    $active_light.fadeIn("slow");

記住,永遠不要讓相同的選擇器在你的代碼裏出現屢次.
注:(1)爲了區分普通的JavaScript對象和jQuery對象,能夠在變量首字母前加上 $ 符號。
(2)上面代碼可使用jQuery的鏈式操做加以改善。以下所示:dom

var $active_light = $("#traffic_light input.on");
    $active_light.bind("click", function(){  })
                        .css("border", "1px dashed yellow")
                        .css("background-color", "orange")
                        .fadeIn("slow");

若是你打算在其餘函數中使用jQuery對象,那麼你必須把它們緩存到全局環境中。
以下代碼所示:函數

// 在全局範圍定義一個對象 (例如: window對象)
 
    window.$my = {
 
    head : $("head"),
 
    traffic_light : $("#traffic_light"),
 
    traffic_button : $("#traffic_button")
 
    };
 
    function do_something(){
 
    // 如今你能夠引用存儲的結果並操做它們
 
    var script = document.createElement("script");
 
     $my.head.append(script);
 
    // 當你在函數內部操做是, 能夠繼續將查詢存入全局對象中去.
 
    $my.cool_results = $("#some_ul li");
 
    $my.other_results = $("#some_table td");
 
     // 將全局函數做爲一個普通的jquery對象去使用.
 
    $my.other_results.css("border-color", "red");
 
     $my.traffic_light.css("border-color", "green");
    }
     //你也能夠在其餘函數中 使用它

4,對直接的DOM操做進行限制

這裏的基本思想是在內存中創建你確實想要的東西,而後更新DOM 。
這並非一個jQuery最佳實踐,但必須進行有效的JavaScript操做 。直接的DOM操做速度很慢。
例如,你想動態的建立一組列表元素,千萬不要這樣作,以下所示:

var top_100_list = [], // 假設這裏是100個獨一無二的字符串
    $mylist = $("#mylist"); // jQuery 選擇到 <ul> 元素
    for (var i=0, l=top_100_list.length; i<l; i++){
      $mylist.append("<li>" + top_100_list[i] + "</li>");
    }

咱們應該將整套元素字符串在插入進dom中以前先所有建立好,以下所示:

var top_100_list = [],$mylist = $("#mylist"), top_100_li = ""; // 這個變量將用來存儲咱們的列表元素
    for (var i=0, l=top_100_list.length; i<l; i++){
       top_100_li += "<li>" + top_100_list[i] + "</li>";
    }
    $mylist.html(top_100_li);

5,冒泡
除非在特殊狀況下, 不然每個js事件(例如:click, mouseover等.)都會冒泡到父級節點。
當咱們須要給多個元素調用同個函數時這點會頗有用。
代替這種效率不好的多元素事件監聽的方法就是, 你只需向它們的父節點綁定一次。
好比, 咱們要爲一個擁有不少輸入框的表單綁定這樣的行爲: 當輸入框被選中時爲它添加一個class
傳統的作法是,直接選中input,而後綁定focus等,以下所示:

$("#entryform input").bind("focus", function(){
        $(this).addClass("selected");
    }).bind("blur", function(){
        $(this).removeClass("selected");
    });

固然上面代碼能幫咱們完成相應的任務,但若是你要尋求更高效的方法,請使用以下代碼:

 $("#entryform").bind("focus", function(e){
        var $cell = $(e.target); // e.target 捕捉到觸發的目標元素
        $cell.addClass("selected");
    }).bind("blur", function(e){
        var $cell = $(e.target);
        $cell.removeClass("selected");
    });

經過在父級監聽獲取焦點和失去焦點的事件,對目標元素進行操做。
在上面代碼中,父級元素扮演了一個調度員的角色, 它能夠基於目標元素綁定事件。
若是你發現你給不少元素綁定了同一個事件監聽, 那麼如今的你確定知道哪裏作錯了。

6,推遲到 $(window).load

jQuery對於開發者來講有一個很誘人的東西, 能夠把任何東西掛到$(document).ready下。
儘管$(document).rady 確實頗有用, 它能夠在頁面渲染時,其它元素還沒下載完成就執行。
若是你發現你的頁面一直是載入中的狀態,頗有可能就是$(document).ready函數引發的。
你能夠經過將jQuery函數綁定到$(window).load 事件的方法來減小頁面載入時的cpu使用率。
它會在全部的html(包括iframe)被下載完成後執行。
一些特效的功能,例如拖放, 視覺特效和動畫, 預載入隱藏圖像等等,都是適合這種技術的場合。

7,壓縮JavaScript

在線壓縮地址: http://dean.edwards.name/packer/
壓縮以前,請保證你的代碼的規範性,不然可能失敗,致使Js錯誤。

8,儘可能使用ID代替Class。

前面性能優化已經說過,ID選擇器的速度是最快的。因此在HTML代碼中,能使用ID的儘可能使用ID來代替class。
看下面的一個例子:

// 建立一個list
    var $myList = $('#myList');
    var myListItems = '<ul>';
    for (i = 0; i < 1000; i++) {
         myListItems += '<li class="listItem' + i + '">This is a list item</li>'; //這裏使用的是class
     }
    myListItems += '</ul>';
    $myList.html(myListItems);
    // 選擇每個 li
     for (i = 0; i < 1000; i++) {
        var selectedItem = $('.listItem' + i);
    }

在代碼最後,選擇每一個li的過程當中,總共用了5066毫秒,超過5秒了。
接着咱們作一個對比,用ID代替class:

// 建立一個list
    var $myList = $('#myList');
    var myListItems = '<ul>';
    for (i = 0; i < 1000; i++) {
        myListItems += '<li id="listItem' + i + '">This is a list item</li>'; //這裏使用的是id
    }
    myListItems += '</ul>';
    $myList.html(myListItems);
     // 選擇每個 li
    for (i = 0; i < 1000; i++) {
         var selectedItem = $('#listItem' + i);
    }

在上段代碼中,選擇每一個li總共只用了61毫秒,相比class的方式,將近快了100倍。

9,給選擇器一個上下文

jQuery選擇器中有一個這樣的選擇器,它能指定上下文。 jQuery( expression, context ); 經過它,能縮小選擇器在DOM中搜索的範圍,達到節省時間,提升效率。 普通方式: $(‘.myDiv’) 改進方式: $(‘.myDiv’ , $(「#listItem」) )

相關文章
相關標籤/搜索