JQuery 的優先級


1.使用最新的jQuery版本

2.用對選擇器.
   2.1 jquery最快的選擇器是ID選擇器:來源於js的getElementById()方法

   注釋:需要選擇多個元素,必然涉及到Dom遍歷和循環,為了提交性能,建議從最近的ID開始繼承
   例如:<div id="div"><ul id="ul"><li class="on">1</li><li class="off">2</li></ul></div>  var ul=$("#ul")

    2.2 第二快的選擇器是tag(標簽)選擇器,它是來自原生getElementsByTagName()方法
    如上例子:var light=$("#ul input.on")
    
    2.3 較慢的選擇器 class 選擇器
    $('.className')的性能,取決於不同的瀏覽器 moz webkit safari o 瀏覽器都有原生方法:getElementByClassName()所以速度並不慢
    但是IE5-IE8都沒有會相當慢

    2.4 最慢的選擇器:偽類選擇器和屬性選擇器:原因:因為沒有針對他們的原生方法,但是一些新的瀏覽器版本有:queryselector()和        

queryselectorAll()放來提高性能
     偽類選擇器:$(':hidden')
     屬性選擇器:$('attribute=value')  attribute:屬性名:id、name、class... value 值   例如:id='ss'
3.理解子元素和父元素的關系
   var list=$("#list");
  【1.$('.child', $parent)2.$parent.find('.child')3.$parent.children('.child')4.$('#parent > .child')5.$('#parent .child')6.       

  $('.child', $('#parent'))】
   語句:  $('.child', $parent)
   解釋:這條語句的意思是,給定一個DOM對象,然后從中選擇一個子元素。jQuery會自動把這條語句轉成$.parent.find('child'),這會導致一定 

         的性能損失。它比最快的形式慢了5%-10%。
   轉化:$('.child',$('.ss').parent)=$('.child', $parent)[.child與.ss是同級]
     $('.child', $parent)=$('.child', list)
   
   語句:$parent.find('.child')
   解釋:這條是最快的語句。.find()方法會調用瀏覽器的原生方法(getElementById,getElementByName,getElementByTagName等等),所以速  

       度較快。
   轉化: $parent.find('.child')=  $(list).find('.test');

   語句:$parent.children('.child')
   解釋:這條語句在jQuery內部,會使用$.sibling()和javascript的nextSibling()方法,一個個遍歷節點。它比最快的形式大約慢50%。
   轉化: $parent.children('.child') =$test = $(list).children('.test');

   語句:$('#parent > .child')
   解釋:jQuery內部使用Sizzle引擎,處理各種選擇器。Sizzle引擎的選擇順序是從右到左,所以這條語句是先選.child,然后再一個個過濾出父  

       元素#parent,這導致它比最快的形式大約慢70%。
   轉化:$('#parent > .child')=var $test = $('#list > .test');

   語句:$('#parent .child')
   解釋:這條語句與上一條是同樣的情況。但是,(上一條只選擇直接的子元素,這一條可以於選擇多級子元素),所以它的速度更慢,大概比最

快的         形式慢了77%。
   轉化:var $test = $('#list .test'); 

   語句:$('.child', $('#parent'))
   解釋;jQuery內部會將這條語句轉成$('#parent').find('.child'),比最快的形式慢了23%。
   轉化:var $test = $('#list').find('.test');
總結:除了優先級后,很重要的一個原因是是否 緩存了。
      同時,多級和chidren的使用也會有導致很大的影響

4.不要過度的使用jQuery
  最簡單的語句 js至少比$(快10多倍)

5.做好緩存(很重要)
   var cached=jQuery('#top')
   根據測試,緩存比不緩存快了2-3倍
      5.1.將jQuery對象緩存起來:永遠不要讓相同的選擇器在你的代碼里出現多次
      錯誤的寫法:
      例如:$("#traffic_light input.on").bind("click", function(){ ... });
      $("#traffic_light input.on").css("border", "1px dashed yellow");
      正確的寫法:
      例如:var $active_light = $("#traffic_light input.on");
      $active_light.bind("click", function(){ ... });
      $active_light.css("border", "1px dashed yellow"); 
      更高效的寫法,鏈式寫法
      $active_light.bind("click", function(){ ... }).css("border", "1px dashed yellow") 
      如果打算在其他函數中使用Jquery對象,則必須把它們緩存到全局環境中
      例如:window.$my={window.$my = {  head : $("head"),  traffic_light : $("#traffic_light"),  traffic_button :                  

  $("#traffic_button")  };  function do_something(){  }
            當在函數內部時,可以繼續將查詢存入到全局對象中去$my.cool_results = $("#some_ul li");  
            將全局函數作為一個普通的jq對象去使用
            $my.other_results.css("border-color", "red");


6.使用鏈式寫法
  $('div').find('h3').eq(2).html('Hello'); 
  采用鏈式寫法時,jQuery自動緩存每一步的結果,因此比非鏈式寫法要快。根據測試,鏈式寫法比(不使用緩存的)非鏈式寫法,大約快了25%。

7.事件的委托處理(冒泡)
  初級:每個每個格子綁定一個點擊事件
  $("td").on("click", function(){
      alert(“司法所地方”)
   });
  初級優化:原理:這個事件只需要在父元素綁定1次即可,而不需要在子元素上綁定100次,從而大大提高性能。這就叫事件的”委托處理”,也就 

                 是子元素”委托”父元素處理這個事件
  $(“table”).delegate(“td”, “click”, function(){
       alert("斯蒂芬森飛灑")
   });
  更好的寫法,則是把事件綁定在document對象上面。
  $(document).on("click", "td", function(){ $(this).toggleClass("click"); });document=指定的id或class

8.少改動DOM結構
  (1)改動DOM結構開銷很大,因此不要頻繁使用.append()、.insertBefore()和.insetAfter()這樣的方法。
    如果要插入多個元素,就先把它們合並,然后再一次性插入。根據測試,合並插入比不合並插入,快了將近10倍。
  (2)如果你要對一個DOM元素進行大量處理,應該先用.detach()方法,把這個元素從DOM中取出來,處理完畢以后,再重新插回文檔。根據測試, 

   使用.detach()方法比不使用時,快了60%。
  (3)如果你要在DOM元素上儲存數據,不要寫成下面這樣:
    var elem = $(‘#elem');
    elem.data(key,value);

9.正確處理循環
  循環總是一種比較耗時的操作,如果可以使用復雜的選擇器直接選中元素,就不要使用循環,去一個個辨認元素。
  javascript原生循環方法for和while,要比jQuery的.each()方法快,應該優先使用原生方法。


網站:http://www.jb51.net/article/25530.htm
      http://caibaojian.com/jquery-performance-optimization.html
      http://www.2cto.com/kf/201308/238441.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM