jQuery常用選取器效能測試

來源:互聯網
上載者:User

可以靈活的對頁面中的JS代碼片斷進行測試,使用的時候只要將FireJSPT的類庫檔案匯入即可:

<script type="text/javascript" src="firejspt.js"></script>

使用FireJSPT,本博對jQuery的常用的選取器在Firefox下做了一個測試,測試環境如下:

•作業系統:Windows 7旗艦版本
•瀏覽器:Firefox 3.6.13
•外掛程式:Firebug 1.60(未安裝其他外掛程式)
•jQuery版本:1.44
層級選取器(ul li)和find的對比
HTML結構如下:

 代碼如下 複製代碼

<ul class="list">
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<!--省略455個li標籤-->
<li><a href="#">jQuery常用選取器效能測試</a></li>
</ul>

首先要感謝redky同志的提醒,原來我的測試過於片面導致測試結果很受質疑,我現在盡量類比真實的環境來重新進行測試。上面的HTML代碼複製了500個li標籤,分別寫了兩個函數testFun1和testFun2,並分別綁定一個點擊事件,JavaScript代碼如下:
/*引入1.44版的jQuery的庫檔案*/

 代碼如下 複製代碼

<script type="text/javascript" src="jquery.js"></script>
/*引入FireJSPT的庫檔案*/
<script type="text/javascript" src="firejspt.js"></script>
<script type="text/javascript">
function testFun1(){
$(".list a").click(function() { alert("Hello World"); });
}

function testFun2(){
$(".list").find("a").click(function() { alert("Hello World"); });
}

/*分別調用2個函數進行測試*/
$(function(){
jspt.test(function(){ testFun1(); });
jspt.test(function(){ testFun2(); });
});
</script>

測試結果如下圖:

從上圖可以看出,如果頁面中只有一個ul.list的DOM節點,find的速度比層級選取器的要快。再把上面的整個ul.list>li的結構複製2次,複製後的結構如下:

 代碼如下 複製代碼
<ul class="list">
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<!--省略455個li標籤-->
<li><a href="#">jQuery常用選取器效能測試</a></li>
</ul>
<ul class="list">
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<!--省略455個li標籤-->
<li><a href="#">jQuery常用選取器效能測試</a></li>
</ul>
<ul class="list">
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<li><a href="#">jQuery常用選取器效能測試</a></li>
<!--省略455個li標籤-->
<li><a href="#">jQuery常用選取器效能測試</a></li>
</ul>

測試結果圖:

從上圖可以看出,如果有多個ul.list這樣的DOM節點,層級選取器的速度又比find快。那麼大致可以得出一個這樣的結論,如果頁面中的DOM節點是唯一的,那麼使用find來尋找它的子節點速度比層級選取器要快,如果頁面中有多個類名相同的節點,那麼使用find來尋找它的子節點速度比層級選取器要慢。

層級選取器(ul > li)和children的對比
用上面同樣的方法來進行測試,改動後的JavaScript代碼如下:

 代碼如下 複製代碼

function testFun1(){
$(".list > li").click(function() { alert("Hello World"); });
}

function testFun2(){
$(".list").children("li").click(function() { alert("Hello World"); <A href="/">australian casino sites</A> });
}


只有一個ul.list的DOM節點的測試結果圖:

三個ul.list的DOM節點測試結果圖:

這個差距不大,children稍勝一籌,這個結果與原來用for迴圈的測試方法完全相反。

id和class選取器的對比
HTML結構如下:

 代碼如下 複製代碼


<div id="test">jQuery常用選取器效能測試</div> 
<div class="test">jQuery常用選取器效能測試</div>


改動後的JavaScript代碼如下:

 代碼如下 複製代碼

function testFun1(){
 for(var i = 0;i < 1000;i ){
  $("#test").click(function() { alert("Hello World"); });
 }
}

function testFun2(){
 for(var i = 0;i < 1000;i ){
  $(".test").click(function() { alert("Hello World"); });
 }
}

測試結果圖:

瞭解JavaScript的都知道id選取器肯定比class選取器快,至於快多少這下應該有個比較靠譜的答案了。

Jquery選取器常用例子

獲得只有Name的隱藏Input的值

 代碼如下 複製代碼

  $("input[type=hidden][name=隱藏Input的名稱]").val()  或  $("input[name=隱藏Input的名稱]:hidden").val()

radio設值

 代碼如下 複製代碼

$("input[type=radio][value=值]").attr("checked",true);

eg.$("input[type=radio][value=${order.paymentMethod}]").attr("checked",true); 

jQuery有非常強大的Sizzle引擎來實現選取器,jQuery做了最佳化,他們能很好的工作,你一般不必擔心太多。然而,我們可以稍微做一些改進,將可以使你的指令碼略有提高。

一般在jquery中能不要用Sizzle引擎就不要用,當然前面說了只要有可能,就盡量使用.find()方法。比如:

 代碼如下 複製代碼
$('#someDiv p.someClass').hide();
$('#someDiv').find('p.someClass').hide();

上面兩行代碼執行的結果是完全一樣的,但是下面一句的效率要比上面一句的執行效率高。
現代瀏覽器(除IE6,IE7)都有QuerySelectorAll支援,能允許你像CSS選取器一樣擷取對象,而不需要用到jQuery中的Sizzle引擎。jQuery會在使用自己的引擎之前檢查是否存在這個函數。

對於IE6/IE7,就需要jQuery使用Sizzle引擎,jQuery會把你的選取器轉化成一個數組,並且通過從右往左來迭代匹配。通過Regex匹配頁面每一個元素,所以你的可以盡量減少選取器的層級,儘可能的使用最右邊的選取器,比如使用ID選取器等;這個規則和我們的css的尋找規則是一直的,如果你要最佳化css選取器也要知道這個規則:從右往左來迭代匹配!

尺度把握:

1.保持代碼簡單

2.儘可能的使用find()尋找,使用瀏覽器的原生尋找函數

3.儘可能使用最右邊的選取器,比如ID等

或條件:(用逗號隔開)

如:

 代碼如下 複製代碼
$("#tableList").find("tr.row_even,tr.row_odd").click(function() {
    alert('test');
   });

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.