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

Javascript 使用内容脚本定义全局变量,javascript,firefox-addon,firefox-addon-sdk,content-script,Javascript,Firefox Addon,Firefox Addon Sdk,Content Script,我正在创建一个Firefox扩展,我希望它的一个特性是用户能够将脚本或样式表注入到特定的网站中,就像Greasemonkey(除了这只适用于一个网站)。我正在为脚本添加一些要使用的函数,我打算将这些函数从内容脚本添加到主(不安全)窗口中。另一方面,它说他们已经对应该如何实现进行了更改,所以我的代码基于帖子中建议的新实现,所以我有: var $jq = jQuery.noConflict();//Yes, I am also injecting jQuery at the same time co

我正在创建一个Firefox扩展,我希望它的一个特性是用户能够将脚本或样式表注入到特定的网站中,就像Greasemonkey(除了这只适用于一个网站)。我正在为脚本添加一些要使用的函数,我打算将这些函数从内容脚本添加到主(不安全)窗口中。另一方面,它说他们已经对应该如何实现进行了更改,所以我的代码基于帖子中建议的新实现,所以我有:

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");
但是脚本的执行只是停止,并且在控制台中打印
消息:TypeError:window为null
。 我主要是在Firefox 28中进行测试(我现在似乎无法让Firefox for Ubuntu更新到更高版本,一大堆问题迫使我在虚拟机中使用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略有不同…

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

exportFunction
API太过有限,无法在所有复杂对象都是DOM节点或包含DOM节点的情况下实际注入jQuery之类的东西。对于应用于参数的结构化克隆算法来说,这根本无法实现。 API的作用是让附加组件与页面双向通信,而不是注入复杂的库


最好的办法是使用DOM API创建一个脚本标记,并将jQuery放在那里。

我确实尝试过,但由于某种原因,它不起作用。这就是我所拥有的:
$jq(“body”).append($jq(“,{src:”https://code.jquery.com/jquery-2.1.1.min.js“}”).append($jq(“”.html(“var$jq=jQuery.noConflict();$jq('body').hide()”))
但是尽管主体被隐藏(因此应该定义
$jq
),但它并不是根据firebug全局定义的。我确实必须使用noConflict()。看起来很正常,除了远程代码注入(如果jquery,则应注入本地提供的副本)。。。我可能会在以后研究这个问题……我只是使用jQuery的远程副本来简化测试,因为否则我就必须将资源URL发送到脚本。不过,我会在生产代码中这样做。另外,如果我将脚本标签中的代码完全放在FB控制台中,它也可以正常工作。请在使用这些API时使用Firefox Beta 30。他们非常新,直到30岁才完全定居下来: