3

Twitter 投稿のキーワードを変更する Greasemonkey スクリプトを作成しようとしています。問題は、コンテンツが「読み込みが遅い」ことであり、ユーザーの要求に応じて追加されます。

追加した要素にイベント リスナーを追加する場合は、JQuery のdelegate(). ロード時にコンテンツを変更したいだけなので、これは適切ではないようです。

Mutation Events はその条件に合っているようです。これらは Gecko 固有のものですが、Greasemonkey スクリプトではあまり問題になりません。問題は、それらが減価償却されており、一連の非常に正当な理由があることです。

もちろん、タイマーを使用して定期的に DOM をポーリングすることもできますが、これは厄介なようです。

DOM への追加を検出し、挿入された要素に対応するにはどうすればよいですか?

4

1 に答える 1

8

AJAX で作成されたノードを検出する場合のオプション (除外するのが賢明な Mutation イベント以外) は次のとおりです。

  1. 間隔またはタイマーによるポーリング。
  2. ページの AJAX リクエスト (存在する場合) にフックしようとしています。
  3. ページの JavaScript へのスプライシング、ハイジャック、または置き換え。

私はこれらすべてを一度に実行しましたが、1 つを除くすべてに大きな欠点があります。

  1. ページの JavaScript へのスプライシングは、(特に無名関数の場合) 必ずしも簡単ではなく、通常はそのコードの複雑な分解が必要であり、非常に脆弱です。ページの JavaScript は予告なしに変更されます。
  2. ページの AJAX 要求にフックするのは非常に簡単な場合もありますが、サンドボックス バリアを越えて情報を転送することは、通常、価値があるよりも面倒です。
  3. ポーリングは実際にはうまく機能し、実装が簡単で、通常は低コストです。

waitForKeyElements() ユーティリティを使用して、それを完了することをお勧めします。使い方はとても簡単です。例えば:

// ==UserScript==
// @name    Highlight good comments
// @include http://SOME_SITE/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// ==/UserScript==

function highlightGoodComments (jNode) {
    if (/beer/i.test (jNode.text () ) ) {
        jNode.css ("background", "yellow");
    }
}

waitForKeyElements ("#userBlather div.comment", highlightGoodComments);
于 2012-05-19T11:53:10.903 に答える