按标签名称删除元素

时间:2012-12-22 14:23:35

标签: javascript

  

可能重复:
  use remove() on multiple elements

我正在尝试删除标签名称为“label”的所有元素。我有以下代码。它在某种程度上起作用,但它只删除了1个标签。其他5人仍然存在。如何更改代码以删除所有“标签”标签?

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

5 个答案:

答案 0 :(得分:42)

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

for (index = element.length - 1; index >= 0; index--) {
    element[index].parentNode.removeChild(element[index]);
}

答案 1 :(得分:32)

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

尝试这样的事情:

var elements = document.getElementsByTagName('label')
while (elements[0]) elements[0].parentNode.removeChild(elements[0])

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:1)

“问题”是.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]);
}

答案 4 :(得分:0)

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

$("label").remove();