2014-03-31 54 views
0

我想写一个脚本,通过论坛评论列表(使用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中的所有值,而不仅仅是第一个匹配的值!

+0

一个'NodeList'是 “活”:要么做postsToDelete.slice(初始数组的副本)或:

替换该行更新以反映DOM的当前状态。因此,如果在循环列表时修改DOM,则索引将不同步。你需要将一个'NodeList'作为一个数组。 – Barmar

+2

@Barmar - 但querySelector返回一个非活的NodeList? – adeneo

+0

开始消除代码行。在某些时候,你应该找出哪一个正在停止循环。当按类提取时,你在'querySelectorAll'和'getElementsByClassName'之间切换。这是为什么?我只是使用'querySelectorAll'。在两个你只想要第一个匹配的地方,使用'querySelector',它返回找到的第一个元素,或者'null'。 –

回答

0

每次输入for循环时,都会评估一个与您的计数器i不同步的新长度。自动 -

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

while(postsToDelete.length){ 
    var post = postsToDelete[0]; 
    ... 
+0

可以在这种情况下array.prototype.foreach工作吗? – VeXii

+0

DOM将在复制阵列中更新吗?我尝试了你的初始解决方案,但它平淡无功,并且只进行一次整体迭代。 – Ephemeralis

+0

这是不正确的。 'querySelectorAll'方法不返回“实时列表”。你的'while'解决方案将是一个无限循环。此外,'postsToDelete.slice()'将失败,因为返回的集合没有'.slice()'方法。 –