我读过的博客有一些讨厌的评论者。我以为我会试着去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新手,所以任何人都可以看到任何明显的我做错了吗?
答案 0 :(得分:3)
您所看到的行为归因于comments
为live 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-- )