2011-05-06 37 views
1
<div class="t">Hello</div> 
<div class="t">Hello</div> 

<script> 
    function $$(name) { 
     a = document.getElementsByTagName("*"); 
     for (var i = 0; i < a.length; i++) { 
      if (a[i].className == name) return a[i]; 
     } 
    } 

    $$('t').style.color = "red"; 
</script> 

只有一類的「T」的第一個div變成了紅色。我做錯了什麼?試圖改變JavaScript中多個項目的屬性,只有第一項變化,我做錯了什麼?

+0

大聲笑@湯姆,良好的通話。看起來國旗值得我。 ;) – 2011-05-06 11:19:13

回答

3

你只要找到一個匹配退出循環,所以通過定義只有一個元素都不會得到改變。如果你想匹配的元素上有額外的類太

哦,你的代碼將失敗。

這將是更好地編寫代碼來調用所有匹配元素的回調:

function $$(name, cb) { 
    var a = document.getElementsByTagName("*"); 
    for (var i = 0; i < a.length; i++) { 
     if (a[i].className == name) { 
      cb.apply(a[i]) 
     } 
    } 
} 

$$('t', function() { 
    this.style.color = 'red'; 
}); 

或者,只需使用一個庫(如jQuery的),它的設計正是這種類型的工作:

$('.t').css('color', 'red'); 
+0

那麼你可以發佈代碼告訴我如何讓它工作?謝謝 – 0x499602D2 2011-05-06 11:06:53

1

您遍歷所有,直到找到一個符合你條件的元素,然後返回它(此時退出循環)。

如果你要處理所有這些在時尚,你需要創建一個數組,並推動它所有匹配的,然後後返回數組for循環已經完成。然後你將不得不循環所有設置.style.color屬性。

或者,您可以將函數作爲參數傳遞給$$(這是一個非常無用的函數名稱),並在for循環期間在每個匹配元素上調用該函數。

由於問題是一個通用的「什麼是錯的?」這大概也是值得指出的是,您使用的是全球a,而不是一個本地化的功能與var,而且許多現代瀏覽器有一個本地getElementsByClassName方法,這將是多大,快那麼你的遍歷每元件。

0

當功能達到回報;聲明它打破(和稱爲功能的代碼繼續)。這就是爲什麼你只有1個元素。

0

你正在爲()`循環的if()in your做一個return,這意味着它會在第一次碰到結果時跳出函數,所以你只會得到第一個結果。

0

在循環中找到類時返回。返回語句結束函數並返回值,無論它在哪裏調用。

你最好將元素添加到數組並在循環後返回。

 
function $$(name) { 
     arr = []; 
     a = document.getElementsByTagName("*"); 
     for (var i = 0; i < a.length; i++) { 
      if (a[i].className == name) 
      { 
       arr[i] = a[i]; 
      } 
     } 
     return arr 
    } 

    //you'll have to loop over them again here 
    $$('t').style.color = "red"; 

相關問題