1

我读过的博客有一些烦人的评论。我想我会尝试在 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 新手,所以有人能看出我做错了什么吗?

4

2 回答 2

3

您看到的行为是由于commentsliveNodeListcomments当您从 DOM中删除引用的元素时,comments它会发生变异(并length更新)并且您的循环会消失。

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

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

然后像以前一样继续。

于 2009-08-14T04:05:30.633 回答
1

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

for ( var i = comments.length - 1; i >= 0; i-- )
于 2009-08-14T02:17:02.607 回答