double getElementsByTagName

时间:2012-10-10 12:57:27

标签: javascript html

我遇到了这个问题,我无法缩小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时,我能够缩小范围吗?

更新:我的不好,我在发布之后意识到它必须在var之后有[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);

2 个答案:

答案 0 :(得分:3)

这是因为getElementsByTagName总是返回一个数组,即使只有一个元素。

如果你var f = x[0].getElementsByTagName("td");它应该正常工作。

答案 1 :(得分:2)

节点列表对象上没有getElementsByTagName函数。也就是说,您对getElementById()的第一次调用会返回一个DOM元素,因此从该结果中调用getElementsByTagName()会起作用。但是,第二个调用返回一个节点列表(HTMLCollection),它没有这样的方法。

如果要在所有表中累积所有<td>元素的列表,则必须明确地对其进行编码。迭代第一次调用的结果(<table>元素列表),并在每个列表的每个元素上累积调用getElementsByTagName("td")的结果。 (节点列表的元素是DOM元素,因此“工作”。