使用Greasemonkey删除列表元素

时间:2009-08-14 02:02:31

标签: javascript greasemonkey

我读过的博客有一些讨厌的评论者。我以为我会试着去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就是这样,我知道脚本是否运行完毕)

主要是有效。例如在一个测试页面上,它删除了其中一个用户的16个帖子中的13个。我尝试用这个替换removeChild行:

comment.style.visibility = 'hidden';

这似乎可以得到所有东西,但代价是留下大量的空白空间来评论本来就是。

我是一个完整的javascript新手,所以任何人都可以看到任何明显的我做错了吗?

2 个答案:

答案 0 :(得分:3)

您所看到的行为归因于commentslive NodeList。当您从DOM中删除comments引用的元素时,comments会发生变异(并且其length已更新),并且您的循环会从窗口中消失。

您可以按照@Pat建议的相反顺序循环,或者首先通过复制操作从DOM中“取消挂钩”NodeList

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

然后像以前一样继续。

答案 1 :(得分:1)

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

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