2010-06-19 68 views
4

今天我非常喜歡Work和jQ。我得到了它一個上午,但我解決不了它:( 我在這裏的工作:如何在jQuery中使用「For」而不是「each」函數

<div class="container"> 
    <p class="test">a</p> 
    <div> 
     <p class="test">a</p> 
    </div> 
</div> 

在正常的,我可以用JQ每個功能for選擇所有<p class="test">a</p> EX:

$(".test").each(function() { 
    $(this).text('a'); 
}); 

但是我聽到大家講的是,for功能得到較少timeload比each功能。現在我想用for代替each ..但我不知道如何編寫代碼JQ在這種情況下。

有人可以幫助我!謝謝!

+0

爲什麼你要更短的時間負荷?這是一個非常耗時的操作嗎?對於javascript的規則是,如果它沒有滯後,並且不存在過多的錯誤,那麼它的好代碼。 – tcooc 2010-06-19 03:50:17

回答

7

我不會擔心它,除非你通過數百個迭代。

for循環通常與正常的DOM(又名無jQuery的)遍歷,就像使用...緩存的

var elements = document.getElementById('something').getElementsByTagName('a'); 

var elementsLength = elements.length; 

for (var i = 0; i < elementsLength; i++) { 

    elements[i].style.color = 'red'; 
} 

elementsLength是一個好主意,所以不計算每次迭代。感謝CMS對此建議的評論。

只要適應你的jQuery對象,如果你想用jQuery來做到這一點。

用您的jQuery集合替換elements變量,如$('#something a')。我想你可能需要重新包裝對象,如果你需要做更多的jQuery的東西。

+0

我上次檢查getElementById時返回了一個html元素,它沒有任何方法,比如getElementsByTagName。那只是文件所具有的。長話短說我不認爲有可能使用原生javascript方法鏈接這樣的方法 – 2010-06-19 03:50:44

+2

他的代碼是正確的。您可以使用任何DOM元素作爲上下文,使用getElementsByTagName或getElementsByClassName類似下降。 – 2010-06-19 03:53:23

+0

@alex:你的循環的條件應該是'i CMS 2010-06-19 03:53:55

1

您是否嘗試過明顯的解決方案?

var nodes = $(".test"); 
for(var i = 0; i < nodes.length; i++) 
{ 
    var node = nodes[i]; 
} 
+0

for塊不是閉包,因此您將在技術上重新定義每個循環上的相同變量。不確定,但我認爲會引發錯誤。 – 2010-06-19 03:54:29

+0

變量聲明被「懸掛」到頂端,所以它看起來像這樣:'var nodes,node;節點= $('。test'); for(...){node = nodes [i]; }' – 2010-06-19 04:38:13

+0

爲什麼我會引用相同的元素。節點是一個html元素的數組。這個集合中的第i個元素是類測試中找到的元素之一。我在這裏沒有看到問題 – 2010-06-19 05:47:59

5

有一點需要注意的是,對jQuery選擇的結果使用序數存取器將返回一個本地DomElement。如果你想在它們上面使用jQuery方法,你必須重新包裝它們:

我想說別人的話。除非你處理很多元素,否則這是過早的優化。重新包裝元素以使用.text()方法甚至可能使其恢復到沒有任何收益。

+0

哦謝謝!這就是我想要的! – Rueta 2010-06-19 03:52:00

+0

+1「重新包裝元素以使用.text()方法甚至可能使其回覆到無法獲得的收益。」我沒有任何基準測試,但重新封裝每個迭代聽起來都很麻煩。 – alex 2010-06-19 04:02:33

+0

我不明白這個重新包裝的情況......你能解釋一下這個更詳細的信息嗎?請重新包裝。 – Rueta 2010-06-19 04:13:00

1

This article表明each()在進入成千上萬的循環項目之前沒有顯着的性能損失。

+0

是的..但我想optimazing我的代碼.. – Rueta 2010-06-19 03:57:20

+1

這是值得稱道的,但這將是一個微不足道的性能增益代價的清晰度和可維護性的代價。我敢打賭,其他地方有更大的表演豬。像'for'循環中的'Something.length'可能? ;-) – 2010-06-19 04:02:38

1

另一種選擇:

for (var i = 0; i < $('.test').length; i++){ 
    var element = $('.test').eq(i); 
} 
相關問題