How to use getElementsByTagName () to find all nested elements?

I have the following 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>

... and the following Javascript code that I run through Greasemonkey:

var nodes = document.body.getElementsByTagName('a');
for (var i = 0; i < nodes.length; i++) {
  var node = nodes[i];
  node.parentNode.removeChild(node);    
}

I would expect it to find and delete all A tags; instead, he finds the first, but not the second. As far as I can tell, he is having difficulty with how the second tag A is nested.

Can someone please let me know how to remove all tags using getElementsByTagName? There are reasons why I would prefer not to use XPath, if at all possible.

+3
source share
4 answers

Capture length and delete in reverse order. This eliminates the side effects.

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 ();
+5

:

var nodes = document.body.getElementsByTagName('a');
while(nodes.length > 0) {
  nodes[0].parentNode.removeChild(nodes[0]);
}

for, , , -.

+1

The error you had was to remove the node, and then move on to the next element. Deleting the very first (# 0) causes the second to become the first.

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);    
}
+1
source

change your code to

var nodes = document.body.getElementsByTagName('a');
for (var i = 0; nodes.length > 0; i++) {
    var node = nodes[0];
    node.parentNode.removeChild(node);    
}

nodes.length gets an estimate every time you remove a child.

0
source

Source: https://habr.com/ru/post/1766315/


All Articles