7

[編集:元の紛らわしい質問を、問題を示す簡単な例に置き換えています。]

バックグラウンド

Chromeで実行されるユーザースクリプトを作成しようとしています。このスクリプトは、ユーザースクリプトの外部にあるJavaScript関数を呼び出す必要があります。AlertMe()この関数はページの一部であり、サーバー側で動的に生成される変数が含まれているため、この関数を自分で書き直すことはできません。ユーザースクリプト。

コード

ページ上のスクリプト(ページにアクセス):

<script type="text/javascript">
    function AlertMe()
    {
        alert("Function AlertMe was called!");
        // then do stuff with strings that were dynamically generated
        // on the server so that I can't easily rewrite this into the userscript
    }
</script>

私のユーザースクリプト(Chromeにインストールしてください):

function tryAlert()
{
    if (typeof AlertMe == "undefined") {
        console.log('AlertMe is undefined.');
        window.setTimeout(tryAlert, 100);
    }
    else {
        AlertMe();
    }
}

tryAlert();

問題

単に関数を呼び出そうとすると、ChromeのコンソールからそのことがわかりましたAlertMe is not defined。これは、他のすべてのスクリプトがロードされる前にユーザースクリプトが実行されていたためだと考えて、関数が定義されるsetTimeoutのを待っていました。AlertMe

AlertMe is undefined.残念ながら、スクリプトをインストールしてからページにアクセスすると、これは永久に出力され、関数を呼び出さないことがわかります。Chromeのコンソールに入力すると、typeof AlertMe正しく応答しますが"function"、なぜ私のユーザースクリプトはそれAlertMeが未定義であると常に考えているのですか?

4

3 に答える 3

9

関数がロードされているかどうかを確認する小さな関数をいつでも書くことができます

function waitForFnc(){
  if(typeof absearch == "undefined"){
    window.setTimeout(waitForFnc,50);
  }
  else{
    runMyFunction();
  }
}

function runMyFunction(){
    var urlParams = window.location.search.substring(1).split('&'),
        username = "",
        hscEmailInput = document.getElementById('userfield6'),
        i = 0;
    if (urlParams !== "") {
        for (i = 0; i < urlParams.length; i++) {
            if (urlParams[i].substr(0,4) === "USER") {
                username = urlParams[i].replace('USER=', '');
                hscEmailInput.value = username + '@example.com';
                absearch('&PAGESIZE=1');
            }
        }
    }
}

waitForFnc();
于 2011-02-23T15:19:07.243 に答える
7

これはタイミングの問題ではありません。

ページ内の機能を実行できない、Greasemonkey のセキュリティ制限にぶつかっています。説明と安全な回避策については、この前の質問に対する私の回答を参照してください。

UserScripts & Greasemonkey: Web サイトの JavaScript 関数の呼び出し

于 2011-02-23T17:38:57.250 に答える
-1

問題が実際にスクリプトの実行が早すぎることである場合は、DOM の準備が整うまでチェックして待機することが解決策になる可能性があります:

編集

SOに関するこの回答も役立つかもしれません。

于 2011-02-23T15:17:04.050 に答える