我正在尝试删除标签名称为“label”的所有元素。我有以下代码。它在某种程度上起作用,但它只删除了1个标签。其他5人仍然存在。如何更改代码以删除所有“标签”标签?
element = document.getElementsByTagName("label");
for (index = 0; index < element.length; index++) {
element[index].parentNode.removeChild(element[index]);
}
答案 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();