2009-08-14 51 views
1

我讀過的博客有一些討厭的評論者。我以爲我會試着用Greasemonkey來關閉它們。用Greasemonkey刪除列表元素

的HTML的基本結構很簡單 - 評論看起來是這樣的:

<li> 
    <cite>user name ...</cite> 
    comment text 
</li> 

所以考慮到這一點,我撞壞我的頭靠在鍵盤一段時間,直到這退學:

var killlist = /user1|user2/; 

var comments = document.getElementsByTagName('li'); 

if (comments.length) { 
    for (var i = 0; i < comments.length; i ++) { 
    var comment = comments[i]; 
    var cites = comment.getElementsByTagName('cite'); 
    if (cites.length) { 
     var cite = cites[0]; 
     var title = cite.textContent; 
     if (killlist.test(title)) { 
     comment.parentNode.removeChild(comment); 
     } 
    } 
    } 
} 

window.alert('Done!') 

(該window.alert只是讓我知道,如果腳本運行到完成)

大多工作。例如在一個測試頁面上,它刪除了其中一個用戶的16個帖子中的13個。我試着用這個代替removeChild之行:

comment.style.visibility = 'hidden'; 

這似乎得到一切,但留下巨大的空白空間,其中的意見本來的代價。

我是一個完整的JavaScript新手,所以任何人都可以看到任何明顯的我做錯了嗎?

回答

1

您應該能夠通過反向您的順序循環,並首先從意見數組末尾刪除元素來解決它:

for (var i = comments.length - 1; i >= 0; i--) 
+0

我想知道如果這可能是一個問題,所以我嘗試做一個數組來評論刪除,然後刪除frrom它,但無濟於事。但目前看起來很有希望!我會再測試一下,然後再回來。 – 2009-08-14 02:31:45

3

你看到的行爲是由於comments是一個live NodeList。當您從DOM中刪除comments引用的元素時,comments會發生變化(並且其更新爲length),並且您的循環會跳出窗口。

您可以循環顛倒順序@Pat建議,或「脫鉤」從DOM NodeList與複製操作第一:

var comments = Array.slice(document.getElementsByTagName('li')); 

像以前然後繼續。