1

私が読んだブログには、迷惑なコメントが何人かあります。私は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 人による 16 件の投稿のうち 13 件が削除されました。removeChild 行を次のように置き換えてみました。

comment.style.visibility = 'hidden';

それはすべてを取得しているように見えますが、コメントがあったはずの大きな空のスペースを残すことを犠牲にしています.

私は完全なJavaScriptの初心者なので、誰かが私が間違っていることが明らかな何かを見ることができますか?

4

2 に答える 2

3

表示されている動作はcommentsライブNodeListであるためです。によって参照される要素をcommentsDOM から削除するcommentsと、変更 (およびlength更新) され、ループがウィンドウから出ます。

@Pat が提案したように逆の順序でループするか、NodeList最初にコピー操作で DOM から「フックを外す」ことができます。

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

その後、以前のように進みます。

于 2009-08-14T04:05:30.633 に答える
1

for ループの順序を逆にして、最初にコメント配列の最後から要素を削除することで、修正できるはずです。

for ( var i = comments.length - 1; i >= 0; i-- )
于 2009-08-14T02:17:02.607 に答える