2009-08-14 48 views
1

我读过的博客有一些讨厌的评论者。我以为我会试着用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新手,所以任何人都可以看到任何明显的我做错了吗?

回答

1

您应该能够通过反向您的顺序循环,并首先从意见数组末尾删除元素来解决它:

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

我想知道如果这可能是一个问题,所以我尝试做一个数组来评论删除,然后删除frrom它,但无济于事。但目前看起来很有希望!我会再测试一下,然后再回来。 – 2009-08-14 02:31:45

3

你看到的行为是由于comments是一个live NodeList。当您从DOM中删除comments引用的元素时,comments会发生变化(并且其更新为length),并且您的循环会跳出窗口。

您可以循环颠倒顺序@Pat建议,或“脱钩”从DOM NodeList与复制操作第一:

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

像以前然后继续。