Javascript节点列表循环是否在更改时退出?

Javascript节点列表循环是否在更改时退出?,javascript,greasemonkey,Javascript,Greasemonkey,我正在尝试编写一个脚本,它使用Vanilla论坛软件浏览论坛评论列表,并将一个隐藏类添加到所有与给定用户名匹配的评论(从username类中提取)中。这很好,除了下面的循环在进行第一次更改后似乎会退出,我不知道为什么会发生这种情况,或者是如何发生的 var userlist = [ 'Flowerpot', ]; var postsToDelete = document.querySelectorAll('.ItemComment'); console.log(postsTo

我正在尝试编写一个脚本,它使用Vanilla论坛软件浏览论坛评论列表,并将一个隐藏类添加到所有与给定用户名匹配的评论(从username类中提取)中。这很好,除了下面的循环在进行第一次更改后似乎会退出,我不知道为什么会发生这种情况,或者是如何发生的

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);
}
由于索引2是一个与上面的if语句匹配的post,它将类应用于post,然后在我看到的情况下无错误地退出,不再继续


我如何解决这个问题?我想让脚本遍历postsToDelete中的所有值,而不仅仅是第一个匹配的值

每次输入for循环时,将计算一个新长度,该长度与计数器i不同步。使用postsToDelete.slice复制初始数组,或者:

替换此行:

for (var i = 0; i < postsToDelete.length; i++)

节点列表是活动的-它会自动更新以反映DOM的当前状态。因此,如果在列表中循环时修改DOM,索引将不同步。您需要将节点列表复制为数组。@Barmar-但是querySelector返回一个非活动节点列表?开始删除代码行。在某个时刻,您应该找出哪一个正在停止循环。当按类获取时,您将在querySelectorAll和getElementsByClassName之间切换。为什么呢?我会用querySelectorAll。在两个只需要第一个匹配项的地方,都可以使用querySelector,它返回找到的第一个元素,或者null。您还没有用提供的代码完成这项工作。array.prototype.foreach在这种情况下可以工作吗?DOM是否仍会在复制的数组中更新?我尝试了你最初的解决方案,但它完全不起作用,而且总体上只迭代一次。这是不正确的。querySelectorAll方法不返回活动列表。您的while解决方案将是一个无限循环。另外,postsToDelete.slice将失败,因为返回的集合没有.slice方法。啊,对不起-我以为它使用的是document.getElementsByClassName,它生成了一个实时集合。改变它,它就会工作。这仍然会导致无限循环,即使使用document.getElementsByClassName。
for (var i = 0; i < postsToDelete.length; i++)
while(postsToDelete.length){
  var post = postsToDelete[0];
  ...