我有以下HTML:
<html>
<head><title>Title</title></head>
<body>
<div id='div2'>
<a href='#'>1</a>
<div id='div1'>
<a href='#'>2</a>
</div>
</div>
</body>
</html>
...以及以下Javascript代码,我正在通过Greasemonkey运行:
var nodes = document.body.getElementsByTagName('a');
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
node.parentNode.removeChild(node);
}
我希望它能找到并删除所有A标签;相反,它找到第一个,但不是第二个。据我所知,第二个A标签的嵌套方式有困难。
有人可以让我知道如何使用getElementsByTagName删除所有标签吗?有理由我不愿意尽可能不使用XPath。
答案 0 :(得分:5)
捕获长度并按相反顺序删除。这将消除副作用。
var nodes = document.body.getElementsByTagName('a');
for (var J=nodes.length-1; J >= 0; J--) //-- Kill the last, first, to avoid orphan problems.
{
var node = nodes[J];
if (node)
{
node.parentNode.removeChild (node);
}
}
但更好的方式......
将此指令添加到标题中:
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
然后你的整个代码变成:
$("a").remove ();
答案 1 :(得分:1)
遵循Vinay的回答:
var nodes = document.body.getElementsByTagName('a');
while(nodes.length > 0) {
nodes[0].parentNode.removeChild(nodes[0]);
}
因为如果你实际上没有使用迭代器来使用这样的for循环是奇怪的。
答案 2 :(得分:1)
你犯的错误是删除节点然后跳到下一个元素。删除第一个(#0)会导致第二个成为第一个。
var nodes = document.body.getElementsByTagName('a');
for (var i = 0; i < nodes.length; i++) {
var node = nodes[0]; // fixed 0 here, as opposed to i
node.parentNode.removeChild(node);
}
答案 3 :(得分:0)
将您的代码更改为
var nodes = document.body.getElementsByTagName('a');
for (var i = 0; nodes.length > 0; i++) {
var node = nodes[0];
node.parentNode.removeChild(node);
}
每次移除子项时都会评估nodes.length。