26

可能重复:
在多个元素上使用 remove()

我正在尝试删除标签名称为“label”的所有元素。我有以下代码。它在某种程度上有效,但它只删除了 1 个标签。剩下的5个还在。如何更改代码以删除所有“标签”标签?

element = document.getElementsByTagName("label");
for (index = 0; index < element.length; index++) {
    element[index].parentNode.removeChild(element[index]);
}
4

5 回答 5

50
var element = document.getElementsByTagName("label"), index;

for (index = element.length - 1; index >= 0; index--) {
    element[index].parentNode.removeChild(element[index]);
}
于 2012-12-22T14:26:48.297 回答
36

问题是document.getElementsByTagName()返回 a NodeList,而不是 a Array。当NodeList您从位于NodeList. 因此,当您删除第一个元素时,新的第一个元素NodeList会变得更短,并且的第一个元素占用index0。index因此,在循环中更新会使您至少错过一个元素,可能更多取决于结果的长度。

尝试这样的事情:

var elements = document.getElementsByTagName('label')
while (elements[0]) elements[0].parentNode.removeChild(elements[0])
于 2012-12-22T14:31:20.683 回答
4

当您从文档中删除节点时,您刚刚获得的节点列表getElementsByTagName()也会更新以避免延迟引用,因此您应该继续删除第一个节点,直到没有节点为止。

var nodes = document.getElementsByTagName("label");

for (var i = 0, len = nodes.length; i != len; ++i) {
    nodes[0].parentNode.removeChild(nodes[0]);
}

这里, 的值nodes.length被缓存;否则它会继续减少,你最终只会删除一半:)

于 2012-12-22T14:31:11.303 回答
2

“问题”是.getElementsByTagName()返回一个Live NodeList。因此,当您删除头部(第一个)条目时,尾部会填满并向左移动,可以这么说。

它不是一个真正的Javascript 数组,它可以按预期工作。要创建这样一个冻结的数组,我们可以像

var element = Array.prototype.slice.call(document.getElementsByTagName("label"),0); 

for (var index = 0, len = element.length; index < len; index++) {
    element[index].parentNode.removeChild(element[index]);
}
于 2012-12-22T14:34:47.150 回答
2

为什么不使用 jQuery?然后就是简单

$("label").remove();
于 2012-12-22T15:39:23.843 回答