2009-08-14 17 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はちょうどので、私は知っている)

このほとんどが動作します。例えば1つのテストページで、1人のユーザーから16の投稿のうち13が削除されました。私はこれでremoveChildのラインを交換しようとした:

すべてを取得するために表示されますが、コメントがあったであろう大きな空のスペースを残しての犠牲に
comment.style.visibility = 'hidden'; 

私は完全なjavascriptの初心者ですので、間違っていることを誰もが分かりますか?

答えて

1

あなたのforループの順序を逆にし、最初のコメント配列の末尾から要素を削除することによってそれを修正することができるはずです。

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

私はそれが問題であるかもしれないかと思ったので、私は削除するためにコメントへの配列を作って、それからfrromを削除しようとしましたが、役に立たなかった。しかしこれはこれまで有望視されている!もう少し長く試してみると戻ってくる。 –

3

あなたが見ている行動があることcommentsによるものですlive NodeListcommentsによって参照される要素をDOMから削除すると、commentsが変更され(そしてそのlengthが更新されます)、ループがウィンドウの外に出ます。

あなたはできる@Patが提案、または最初のコピー操作でDOMからNodeListを「外す」と逆の順序でループ:

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

を次に以前のように進みます。

関連する問題