我想写一个脚本,通过论坛评论列表(使用Vanilla论坛软件),并添加一个“埋藏”类到与给定用户名相匹配的所有评论(从用户名类中拉出)。这工作正常,除了下面的循环似乎退出后,它进行第一次更改,我无法弄清楚为什么会发生这种情况。JavaScript的NodeList循环退出改变?
var userlist = [
'Flowerpot',
];
var postsToDelete = document.querySelectorAll('.ItemComment');
console.log(postsToDelete.length);
for (var i = 0; i < postsToDelete.length; i++)
{
var username = postsToDelete[i].getElementsByClassName('Username')[0].innerHTML;
if (userlist.indexOf(username) >=0)
{
postsToDelete[i].className += ' Buried';
var author_info = postsToDelete[i].querySelectorAll('.AuthorLocation');
author_info[0].innerHTML = '';
}
console.log(i);
}
例如,运行一个页面上的脚本时返回以下控制台输出:
25 (postsToDelete.length)
0 (first post that doesn't match..)
1 (second..)
而且,由于指数2是一个匹配上面的if语句后,它适用于类到邮局,然后退出没有错误(从我能看到的),只是不再进一步。
我该如何解决这个问题?我希望脚本遍历postsToDelete中的所有值,而不仅仅是第一个匹配的值!
一个'NodeList'是 “活”:要么做postsToDelete.slice(初始数组的副本)或:
替换该行更新以反映DOM的当前状态。因此,如果在循环列表时修改DOM,则索引将不同步。你需要将一个'NodeList'作为一个数组。 – Barmar
@Barmar - 但querySelector返回一个非活的NodeList? – adeneo
开始消除代码行。在某些时候,你应该找出哪一个正在停止循环。当按类提取时,你在'querySelectorAll'和'getElementsByClassName'之间切换。这是为什么?我只是使用'querySelectorAll'。在两个你只想要第一个匹配的地方,使用'querySelector',它返回找到的第一个元素,或者'null'。 –