4

jQuery を使用し、Google Chrome と Firefox で動作する Greasemonkey ユーザー スクリプトを作成しています。

これを行う方法のいくつかの例を見てきました.SOでの非常に良い答えも含まれています。そして、それらはすべて、別のコールバック関数をパラメーターとして渡す「注入スクリプト」関数を呼び出すことに要約されます。

そのコールバック関数内のコードは、jQuery( $) オブジェクトへのアクセスを含む「魔法」が発生する場所です。

このソリューションは正常に機能します。ただし、これを使用した場合の結果の 1 つは、コールバック関数の外部で定義された関数をその内部から呼び出すことができないということです。

function doSomethingImportantThatIWantToUnitTest(){ ... }

function with_jquery(callback) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.textContent = "(" + callback.toString() + ")(jQuery)";
    document.body.appendChild(script);
};

with_jquery(function ($) {
    doSomethingImportantThatIWantToUnitTest(); // <---- meh. Not defined!
});


そのため、コールバック関数内で 定義された関数のみを使用できます。ただし、これらの関数は、外部から呼び出すことはできません。特に、たとえばユニットテストから呼び出すことができず、これは私にとって非常に面倒です。

Chrome 用の Greasemonkey スクリプトを作成し、それを単体テストする方法はありますか?

4

1 に答える 1

1

関数変数を含め、必要なものは何でもコールバック関数に渡すことができるはずです。

var f = function doSomethingImportantThatIWantToUnitTest(){ ... }

function with_jquery(callback) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.textContent = "(" + callback.toString() + ")(jQuery,f)";
    document.body.appendChild(script);
};

with_jquery(function ($, f) {
    f(); // <---- DEFINED!
});

実行したい関数がいくつかあり、いくつかの異なる場所でコードを更新したくない場合は、すべての関数をオブジェクト プロパティまたは配列内の要素として持つオブジェクトまたは配列を渡すことができます。

私だったら、あなたが使っているスコープ内で関数を定義するだけです。

于 2012-04-07T00:48:36.103 に答える