2014-03-31 56 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()'方法。 –