2012-10-10 45 views
0

我遇到了這個問題,我無法縮小getElementsByTagName的範圍。double getElementsByTagName

這是我在做什麼

<!DOCTYPE html> 
<html> 
<head> 
<script> 
function getElements() 
{ 
    var t = document.getElementById("t"); 
    var x = t.getElementsByTagName("table"); 
    //var f = x.getElementsByTagName("td"); 
    alert(x.length); 
} 
</script> 
</head> 
<body> 
<div id="t"> 
    <table class="x"> 
     <td class="f"> 
     </td> 
    </table> 
</div> 
<input type="button" onclick="getElements()" value="How many input elements?"> 
</body> 
</html> 

上述作品,帶回1

雖然當我改變這一點。

var f = x.getElementsByTagName("td"); 
alert(f.length); 

它打破了劇本。

當我無法使用2個TagNames時,我該如何縮小範圍?

更新:我的壞,我發佈後發現它必須有[0]之後的變種。

var t = document.getElementById("t"); 
var x = t.getElementsByTagName("table"); 
var f = x[0].getElementsByTagName("td"); 
var u = f[0].getElementsByTagName("div"); 
alert(f.length); 
alert(u[0].className); 

回答

3

這是因爲getElementsByTagName總是返回一個數組,即使只有一個元素。

如果你這樣做var f = x[0].getElementsByTagName("td");它應該正常工作。

+0

對於我來說,即使當我知道這是一個數組時,它當時也完全放棄了我的想法。 – 1Rabbit

2

那麼有一個節點列表對象沒有getElementsByTagName功能。也就是說,您第一次致電getElementById()會返回一個DOM元素,因此可以從該結果調用getElementsByTagName()。然而,第二次調用返回一個節點列表(一個HTMLCollection),它沒有這樣的方法。

如果要在所有表格中累積所有<td>元素的列表,則必須明確地對其進行編碼。迭代第一個調用的結果(元素列表<table>),並累積每個列表的每個元素上調用getElementsByTagName("td")的結果。 (節點列表的元素是DOM元素,所以可以工作)。