104

私は Greasemonkey ユーザー スクリプトを書いていますが、表示したい div カウントを返すため、ページの読み込みが完全に終了したときに特定のコードを実行したいと考えています。

問題は、この特定のページがすべてロードされるまでに少し時間がかかる場合があることです。

$(function() { });ドキュメントと$(window).load(function(){ });ラッパーを試しました。ただし、間違って適用している可能性がありますが、どれもうまくいかないようです。

私ができる最善のことはsetTimeout(function() { }, 600);、常に信頼できるとは限りませんが、動作する a を使用することです。

ページの読み込みが完了したときに特定のコードが確実に実行されるようにするために、Greasemonkey で使用する最適な手法は何ですか?

4

7 に答える 7

89

Greasemonkey (通常) には jQuery がありません。したがって、一般的なアプローチは使用することです

window.addEventListener('load', function() {
    // your code here
}, false);

ユーザースクリプト内

于 2012-10-15T14:38:30.987 に答える
72

これは一般的な問題であり、あなたが言ったように、ページの読み込みを待つだけでは十分ではありません.AJAXはその後ずっと物事を変えることができます.

これらの状況には、標準的な (っぽい) 堅牢なユーティリティがあります。ユーティリティですwaitForKeyElements()。_

次のように使用します。

// ==UserScript==
// @name     _Wait for delayed or AJAX page load
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a major design
    change introduced in GM 1.0.
    It restores the sandbox.
*/

waitForKeyElements ("YOUR_jQUERY_SELECTOR", actionFunction);

function actionFunction (jNode) {
    //-- DO WHAT YOU WANT TO THE TARGETED ELEMENTS HERE.
    jNode.css ("background", "yellow"); // example
}

より具体的な例として、ターゲット ページの正確な詳細を入力してください。

于 2012-10-15T15:51:48.300 に答える
14

私のスクリプトをラップする$(window).load(function(){ })ことは、私にとって決して失敗しませんでした。

あなたのページは終了しているかもしれませんが、まだいくつかの ajax コンテンツがロードされています。

その場合は、Brock Adamsのこの素晴らしいコードが役に立ちます:
https://gist.github.com/raw/2625891/waitForKeyElements.js

私は通常、 postbackに表示される要素を監視するために使用します。

次のように使用します。waitForKeyElements("elementtowaitfor", functiontocall)

于 2012-10-15T14:43:12.183 に答える
2

XHR が Web ページへのロードを完了したかどうかを検出するために、何らかの機能がトリガーされます。これは、JavaScript を使用して「XHR の読み込みが完了しました」というメッセージを Chrome のコンソールに保存するにはどうすればよいですか?から取得します。そしてそれは実際に機能します。

    //This overwrites every XHR object's open method with a new function that adds load and error listeners to the XHR request. When the request completes or errors out, the functions have access to the method and url variables that were used with the open method.
    //You can do something more useful with method and url than simply passing them into console.log if you wish.
    //https://stackoverflow.com/questions/43282885/how-do-i-use-javascript-to-store-xhr-finished-loading-messages-in-the-console
    (function() {
        var origOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function(method, url) {
            this.addEventListener('load', function() {
                console.log('XHR finished loading', method, url);
                display();
            });

            this.addEventListener('error', function() {
                console.log('XHR errored out', method, url);
            });
            origOpen.apply(this, arguments);
        };
    })();
    function display(){
        //codes to do something;
    }

しかし、ページに多くの XHR がある場合、特定の XHR をフィルター処理する方法がわかりません。

もう 1 つのメソッドは、便利な waitForKeyElements() です。 https://gist.github.com/BrockA/2625891
Greasemonkey の使用例があります。 同じページで Greasemonkey スクリプトを複数回実行しますか?

于 2018-04-02T06:01:54.270 に答える