代码之家  ›  专栏  ›  技术社区  ›  Duncan Bayne

如何使用getElementsByTagname()查找所有嵌套元素?

  •  3
  • Duncan Bayne  · 技术社区  · 14 年前

    我有以下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);    
    }
    

    我希望它能找到并删除所有的标签;相反,它找到的是第一个,而不是第二个。据我所知,第二个标记的嵌套方式有困难。

    有人能告诉我如何使用GetElementsByTagname删除所有标签吗?如果可能的话,我有理由不使用xpath。

    4 回复  |  直到 12 年前
        1
  •  5
  •   Brock Adams    14 年前

    捕捉长度并按相反顺序移除。这将消除副作用。

    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 ();
    
        2
  •  1
  •   Jamie Wong    14 年前

    按照维尼的回答:

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

    因为使用这样的for循环是很奇怪的,如果您实际上没有为任何事情使用迭代器。

        3
  •  1
  •   Macsek    12 年前

    您犯的错误是删除节点,然后跳到下一个元素。删除第一个(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);    
    }
    
        4
  •  0
  •   Vinay B R    14 年前

    将代码更改为

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

    nodes.length在每次删除子级时都会得到评估。

    推荐文章