jQuery性能優化

1、jQuery性能優化javascript

(1)使用最新版本的jQuery類庫css

jQuery每個新的版本都會較上一版進行Bug修復和一些優化,同時也會包含一些創新,因此建議使用最新版本的jQuery來提升性能。不過須要注意的是,在更換版本後,要記得測試你的代碼,畢竟有時候不是徹底向後兼容。html

(2)使用合適的選擇器html5

①$(「#id」)java

使用id來定位DOM元素無疑是最佳提升性能的方式,由於jQuery底層將直接調用本地方法document.getElementById()。若是這個方式不能直接找到你須要的元素,能夠考慮使用find()方法,代碼以下:jquery

$(「#id」).find(「element」);編程

②$(「p」),$(「div」),$(「input」)後端

標籤選擇器的性能也是不錯的,它是性能優化的第二選擇,由於jQuery將直接調用本地方法document.getElementByTagName()來定位DOM元素。數組

③$(「.class」)瀏覽器

類選擇器對於比較欣的瀏覽器如IE9,它支持本地方法document.getElementByClassName(),而對於老的瀏覽器,如IE8或者更早版本,只能靠使用DOM搜索方式來實現,這無疑對性能產生較大的影響。因此建議有選擇性地使用它。

④$(「[attribute=value]」)

對於利用屬性來定位DOM元素,本地javascript方法中並無直接地實現,大多都是使用DOM搜索方式來達到效果,不少現代瀏覽器都支持querySelectorAll()方法,可是不一樣瀏覽器間的性能仍是有區別,整體來講,使用這種方式來定位DOM元素,性能並非很是理想。因此爲了得到更好的優化效果,建議開發中儘可能避免使用這種對性能有害的方式

⑤$(「:hidden」)

和上面利用屬性來定位DOM的方式相似,這種僞選擇器也一樣沒有直接在本地javascript方法中實現,而且jQuery須要搜索每個元素來定位這個選擇器,這將對應用帶來比較大的性能問題,因此建議儘可能不要使用。若是堅持要使用這種方式,請先使用ID選擇器定位父元素,而後再使用該選擇器,這樣對性能會有幫助,如:

$(「#comment」).find(「:hidden」)

$(「#username」).find(「checkbox」)

以上是使用選擇器的基本規則,性能自上而下依次降低。另外可使用jsPerf來直觀查看性能區別,地址:http://jsperf.com/id-vs-class-vs-tag-selectors/2

總結注意:一、儘可能使用ID選擇器

             二、儘可能給選擇器指定上下文

(3)緩存對象

在開發代碼中,可能會常常這麼寫:

$(「#traffic_light input.on」).bind(「click」,function(){…});

$(「#traffic_light input.on」).css(「border」,」1px solid red」);

$(「#traffic_light input.on」).css(「background-color」,」red」);

$(「#traffic_light input.on」).fadeIn(「slow」);

編程中的跳躍思惟致使你有可能這樣書寫代碼,這無可厚非,可是這樣致使的結果是:jQuery會在建立每個選擇器的過程當中,查找DOM,建立多個jQuery對象。比較好的書寫方式以下:

var $active_light=$(「#traffic_light input.on」);

$active_light.bind(「click」,function(){…});

$active_light.css(「border」,」1px solid red」);

$active_light.css(「background-color」,」red」);

$active_light.fadeIn(「slow」);

然而,在本例中使用鏈式方式將更加簡潔,可是這裏職位說明使用緩存變量的重要性,這和java開發中不要隨意的建立對象同樣,能夠幫助有效地提升代碼運行性能。

使用jQuery鏈式操做再加以改善後:

var $active_light=$(「#traffic_light input.on」);

$active_light.bind(「click」,function(){…}).css({「border」:」1px solid red,"background-color」:」red」}).fadeIn(「slow」);

若是想在其餘函數中使用jQuery對象,可把它們緩存到全局環境中:

$(function() {
    //在全局範圍定義一個對象
    window.$my = {
        head: $("head"),
        traffic_light: $("#traffic_light"),
        traffic_button: $("#traffic_button")
    };

    function do_something() {
        //如今能夠引用存儲的結果並操做它們
        var script = document.createElement("script");
        $my.head.apped(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", "yellow");
    }
    //也能夠在其餘函數中使用
});

 

(4)循環時的DOM操做

咱們從一個實例開始講起:

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

 

以上代碼中,咱們將每個新添加的標籤元素都做爲一個節點添加到容器ID中,實際上jQuery操做消耗的性能也不低,因此更好的方式是儘量地減小DOM操做,這裏應該將整個元素字符串在插入DOM以前所有建立好,修改代碼以下:

var top_100_list=[...]//假設這裏是100個獨一無二的字符串
    $mylist=$("#mylist")
    for(var i=0;i<top_100_list.length;i++){
        top_100_list[i]+=li>"+top_100_list[i]+"</li>";
    }

$mylist.html(top_100_list[i]);

更有甚者:

for(i=0;i<100;i++){

     var $mylist=$(「#mylist」); //竟然把$mylist循環獲取了100次

     $mylist.append(「This is item is」+i)

}

(5)數組方式使用jQuery對象

使用jQuery選擇器獲取結果是一個jQuery對象,然而,jQuery類庫會讓你感受你正在使用一個定義了索引和長度的數組。在性能方面,建議使用簡單for或者while循環來處理,而不是$.each(),這樣能使代碼更快。

$.each(array,function(i) {
        array[i]=i;
    });

 

用for循環來代替$.each()

var array=new Array();
    for(var i=0;i<array.length;i++){
        array[i]=i;
    }

 

另外注意檢查長度也是一個檢查jQuery對象是否存在的方式:

var $comment=$("#comment");
    if($comment){//老是true
        //do somethis
    }
    if($comment.length){//擁有元素才返回true
        //do something
    }

 

(6)事件代理

每個javascript事件(例如:click,mouseover等)都會冒泡到父級節點。當咱們須要給多個元素調用同個函數時這點頗有用。

好比,要爲一個table綁定這樣一個行爲:點擊td後,把背景色設置爲紅色,代碼以下:

$("#mytable td").click(function(){
        $(this).css("background-color","red");
    })

 

那麼假設有100個td元素,在使用以上方式的時候,你綁定了100個事件,這將帶來很負面的性能影響。代替這種效率不好的多元素事件監聽的方法就是:只需向它們的父節點綁定一次事件,而後經過event.target獲取當前點擊的元素,代碼以下:

$("#mytable").click(function(e){
        var $clickele=$(e.target); //e.target捕捉到觸發的目標元素
        $clickele.css("background-color","red");
    });

 

在jQuery1.7中新增on(),來幫助你將整個時間監聽封裝到一個便利方法中,以下:

$("#mytable").on(‘click’,’td’,function(){
        $clickele.css("background-color","red");
    });

(7)將代碼轉化成jQuery插件

若是每次都須要花上必定的時間去開發相似的jQuery代碼,那麼能夠考慮將代碼變成插件。這樣可以使代碼有更好的重用性,而且可以有效的幫助你組織代碼。建立jQuery插件教程:

(8)使用join()來拼接字符串

也許你以前一直使用"+」來拼接字符串,如今你能夠改改了。雖然它可能會有點奇怪,但它確實有助於優化性能,尤爲是長字符串處理的時候

例如:

var array=[];
    for(var i=0;i<array.length;i++){
        array[i]=i;
    }
    $("#list").html(array.join(''));

 

(9)合理利用HTML5的Data屬性

html5中的data屬性能夠幫助咱們插入數據,特別是先後端的數據交換。jQuery的data()方法,有效地利用哦個了html5的屬性,來自動獲得數據。例如:

html代碼:

             <div id=」data1」 data-role=」page」 data-last-value=」33」 data-options=’{「name」:」Jhon」}’></div>

jQuery代碼:

            $(「#data1」).data(「role」);          //page

            $(「#data1」).data(「lastvalue」)      //33

            $(「$data1」).data(「options」)          //Jhon

(10)儘可能使用原生的js

下面一段代碼用來判斷多選框是否被選中:

jQuery代碼:

var $cs=$("#cs"); //jQuery對象
    $cs.click(function() {
        if($cr.is(":checked")){ //jQuery判斷方式
            alert("感謝您的支持!");
        }
    });

 

javascript代碼:

var $cr=$("#cr"); //jQuery對象
    var cr=$cr.get(0); ///DOM對象
    $cs.click(function() {
        if(cr.checked){ //原生javascript方式判斷
            alert("感謝您的支持!");
        }
    });

 

毋庸置疑,第二種方式效率高於第一種方式,由於它不須要拐彎抹角地去調用不少函數。經驗告訴咱們,方法的選擇很重要,有時候你也許根本不須要jQuery。

(11)壓縮javascript代碼

如今的Web項目老是離不開大量的javascript,而JS文件的體積愈來愈大,隨之也影響到頁面的感知性能。所以,須要對javascript文件進行壓縮,一方面是使用Gzip;另外一方面是去除javascript文件裏的註釋、空白,而且壓縮局部變量長度等。

js壓縮工具不少,可使用老牌的JSMin,YUI Compressor,它們均可以用來壓縮js,後者還能夠用來處理CSS,也可使用新工具,好比Google Closure Compiler和UglifyJS。

相關文章
相關標籤/搜索