代码之家  ›  专栏  ›  技术社区  ›  John Fouhy

使用Greasemonkey删除列表元素

  •  1
  • John Fouhy  · 技术社区  · 15 年前

    我读的一篇博客有一些令人讨厌的评论。我想我会试试我的手在Greasemonkey关掉它们。

    HTML的基本结构很简单-注释如下所示:

    <li>
      <cite>user name ...</cite>
      comment text
    </li>
    

    考虑到这一点,我把头撞在键盘上一段时间,直到它掉了下来:

    var killlist = /user1|user2/;
    
    var comments = document.getElementsByTagName('li');
    
    if (comments.length) {
      for ( var i = 0; i < comments.length; i ++ ) {
        var comment = comments[i];
        var cites = comment.getElementsByTagName('cite');
        if (cites.length) {
          var cite = cites[0];
          var title = cite.textContent;
          if (killlist.test(title)) {
            comment.parentNode.removeChild(comment);
          }
        }
      }
    }
    
    window.alert('Done!')
    

    window.alert 只是让我知道脚本是否运行到完成)

    主要地 作品e、 在一个测试页面上,其中一个用户删除了16篇文章中的13篇。我尝试用以下内容替换removeChild行:

    comment.style.visibility = 'hidden';
    

    这似乎得到了一切,但代价是在评论可能出现的地方留下了巨大的空白。

    我是一个完全的javascript新手,所以有人能看出我做错了什么吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Crescent Fresh    15 年前

    你看到的行为是由于 comments 作为一个 live NodeList . 删除引用的元素时 评论 评论 是变异的(和它的 length 更新)和你的循环出去的窗口。

    您可以按照@Pat建议的相反顺序循环,或者“取消挂钩” 节点主义者 从DOM中首先执行复制操作:

    var comments = Array.slice(document.getElementsByTagName('li'));
    

    然后像以前一样继续。

        2
  •  1
  •   Pat    15 年前

    您应该能够通过颠倒for循环的顺序并首先从comments数组的末尾删除元素来修复它:

    for ( var i = comments.length - 1; i >= 0; i-- )