使用内容脚本定义全局变量

时间:2014-06-04 19:13:38

标签: javascript firefox-addon firefox-addon-sdk content-script

我正在创建一个Firefox扩展,我想要的一个功能是用户能够将脚本或样式表注入特定网站,而不是像Greasemonkey(除了这只是一个站点) 。我正在为脚本添加一些函数,我打算将这些函数从内容脚本添加到主(不安全)窗口中。在MDN blog上,它表示他们已经对如何实现它进行了更改,因此我根据帖子中的建议将我的代码基于新实现,所以这就是我所拥有的:

var $jq = jQuery.noConflict();//Yes, I am also injecting jQuery at the same time
console.log("created jquery object"); //This works
exportFunction($jq, unsafeWindow, {defineAs: "$jq"});
console.log("This will never be called");

但脚本的执行才会停止,并在控制台中打印Message: TypeError: window is null。 我主要在Firefox 28中进行测试(我现在似乎无法让Ubuntu的Firefox更新,而且一大堆问题迫使我在VM中使用Ubuntu),但是在Nightly 31a1(Win7) )没有任何东西被注入,包括硬编码风格(适用于FF28)所以我必须在某些时候弄明白。 (PageMod代码在这里:

var lttWorker = sdk.pageMod.PageMod({
    include:["*"],
    /*contentScriptFile: [sdk.data.url("jquery.large.js"), sdk.data.url("scripts/bootstrapper.js")],
    contentScriptWhen: "ready",*/ //This is commented to test whether it was an issue with the script. It's not.
    contentStyle: "#header_bar{background-color:green;}", //This is injected in FF28 but not 31
    attachTo: ["existing", "top"],
    onAttach: function(){desktopNotifications({title:"attached content worker", text:"The content worker has been successfully attached"})} //This is called in FF28 but not 31
});
lttWorker.on("error", function(){callError("pageWorker failed");}); //This never gets called. Ever.

如果有人有兴趣的话)

编辑:我现在已经在Firefox 30b上尝试了它,但仍然有很多问题,尽管它们似乎与FF28和31都略有不同......

1 个答案:

答案 0 :(得分:2)

首先:Firefox 30及更高版本支持这些新功能。见@canuckistani答案。

exportFunction API太有限了,无法实际注入像jQuery这样的所有复杂对象或包含DOM节点。这简直不会使用应用于参数的结构化克隆算法。 API旨在使附加组件能够双向与页面进行通信,而不是注入复杂的库。

您最好的选择是使用DOM API创建脚本标记并将jQuery放在那里。