4

我正在编写一个应该使用 jQuery 并在 Google Chrome 和 Firefox 上工作的 Greasemonkey 用户脚本。

我已经看到了几个如何做到这一点的例子,包括关于 SO 的非常好的答案。所有这些都归结为调用一个“注入脚本”函数,传递另一个回调函数作为参数。

该回调函数内的代码是“魔术”发生的地方,包括对jQuery( $) 对象的访问。

此解决方案工作正常。但是,使用它的后果之一是不能从回调函数内部调用定义在回调函数之外的函数:

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 回答