1

私はユーザースクリプトを作成していますが、Operaではチャームのように機能しますが、FireFoxとChromeでは次のエラーが発生します。

エラー:PunishCalcが定義されていません

スクリプトの上部に次のような変数があります(ユーザーはスクリプトで複数の項目を構成できます)。

var LoginFormat     = true;
var PunishCalc      = true;
var WorldList       = true;
var aWerelden       = Array();
var TitleTickets    = true;
var OverviewLink    = true;
var CookieMarker    = true;

ご覧のとおり、PunishCalc実際にはそこで定義されています。

これはスクリプトの最も重要な部分です。ページにjQueryを実装します。

function addJQuery(callback) 
{
    var script = document.createElement("script");
    script.setAttribute("src", "http://code.jquery.com/jquery-1.7.2.min.js");
    script.addEventListener("load", function() 
    {
        var script = document.createElement("script");
        script.textContent = "(" + callback.toString() + ")();";
        document.body.appendChild(script);
    }, false);
    document.body.appendChild(script);
}

function main()
{
    // All the code will be in here
}

addJQuery(main);

これで、変数を使用するコードが表示されます。

else if(document.location.href.indexOf("village.php?mode=list") > -1 && PunishCalc === true)
{
    // Code here
}

ご覧のとおり、変数がtrueかどうかをチェックするだけです。それがしなければならないすべてです。なぜそれがOperaで動作するのに、ChromeやFirefoxでは動作しないのか誰かが知っていますか?

4

1 に答える 1

1

全体の問題は、jQueryがどのようにロードされるかに起因します。

ページにタグを挿入し<script>、スクリプトがロードされたときに何かを実行するリスナーを追加します。実行するコードはですmain.toString()。これは実際にはのすべてのステートメントですmainが、実際の関数ではありません。

FirefoxとChromeのユーザースクリプトはサンドボックス化されており、ページコンテキストとスクリプトコンテキストは完全に異なります。したがって、main.toString()ステートメントが実行されると、ユーザースクリプトスコープではなく、現在のページスコープになります。これは<script>、現在のページというコンテキストでコードを実行する挿入が挿入されているためです。PunishCalcここでは、userscriptスコープで定義されているため、定義されていません。

この制限を回避するには、すべてのステートメントをmain関数に配置します。

于 2012-06-24T17:10:18.213 に答える