gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:27:01 26 4
gpt4 key购买 nike

我正在创建一个 Firefox 扩展,我想要它的一个功能是用户能够将脚本或样式表注入(inject)特定网站,而不是像 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 ) 没有注入(inject)任何东西,包括硬编码样式(适用于 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 的局限性太大,无法实际注入(inject)诸如 jQuery 之类的东西,所有复杂对象都是或包含 DOM 节点。这根本不会与应用于参数的结构化克隆算法一起运行。API 旨在作为加载项与页面双向通信的一种方式,而不是注入(inject)复杂的库。

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

关于javascript - 使用内容脚本定义全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24045698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com