3

簡単なdom操作を行う簡単なグリースモンキースクリプトがあります。DOM がロードされた後にグリースモンキー スクリプトがロードされます。これで問題なく、最初のページで機能します。しかし、このサイト (Twitter です ;-) では、ページの一部が xmlhttprequest によってクリックされた後に読み込まれ、この部分は私のグリースモンキースクリプトによって操作されませんでした。

xmlhttprequest が読み込まれた後、またはリクエストによって DOM が変更された後に、スクリプトを再度実行する簡単な方法はありますか?

4

2 に答える 2

3

Greasemonkey を使用する際の強力な手法は、既存の JavaScript 関数を「ハイジャック」することです。変更するページに、応答processAjaxResponseを処理するときに呼び出される関数がある場合XmlHttpRequestは、Greasemonkey スクリプトで次の操作を実行できます。

var originalProcessAjaxResponse;

function myNewProcessAjaxResponse() {
  /* Manipulate DOM if you need to, and then... */
  originalProcessAjaxResponse();
}

function hijack() {
  var originalProcessAjaxResponse = processAjaxResponse;
  processAjaxResponse = myNewProcessAjaxResponse();
}

これにより、AJAX 応答イベントが発生したときに独自の機能を挿入できます。

于 2009-07-06T11:19:20.243 に答える
1

ありがとうハワード。それは正しい方向への道でした。

縮小化されたスクリプトで関数をハイジャックするための適切なエントリ ポイントを見つけるのは非常に困難です。しかし、Twitter スクリプトに問題があることがわかりました。Ajax リクエストの後に window.onPageChange を呼び出します。(これは JavaScript の一般的なベスト プラクティスなのか、他の人もこれを行っているのだろうか?) http://userscripts.org/scripts/review/47998で、この可能性を使用してイベントを添付するコードを見つけました。

        if (typeof unsafeWindow.onPageChange === 'function') {
        var _onPageChange = unsafeWindow.onPageChange;
        unsafeWindow.onPageChange = function(){
            _onPageChange();
            filter();
        };
    } else {
        unsafeWindow.onPageChange = filter;
    }
于 2009-07-06T12:40:56.303 に答える