我想寫一個腳本,通過論壇評論列表(使用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'。 –