Javascript Firefox插件-在第页上运行脚本
使用插件SDK,我试图在每次加载页面时向页面注入脚本。为了进行测试,插件正在尝试向窗口对象添加变量,页面应该读取该变量。当我运行这个程序时,我可以看到“注入”警报,但页面给出了错误“UndefinedPropertyWindow.myVar”。我做错了什么?顺便说一句,我不想使用非安全窗口 main.js:Javascript Firefox插件-在第页上运行脚本,javascript,firefox-addon,firefox-addon-sdk,Javascript,Firefox Addon,Firefox Addon Sdk,使用插件SDK,我试图在每次加载页面时向页面注入脚本。为了进行测试,插件正在尝试向窗口对象添加变量,页面应该读取该变量。当我运行这个程序时,我可以看到“注入”警报,但页面给出了错误“UndefinedPropertyWindow.myVar”。我做错了什么?顺便说一句,我不想使用非安全窗口 main.js: var data = require("sdk/self").data; var pageMod = require("sdk/page-mod"); pageMod.PageMod({
var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
pageMod.PageMod({
include: "*",
contentScriptFile: data.url("inject.js"),
contentScriptWhen: "start",
onAttach: function(worker) {
worker.port.emit("inject", "unused param");
}
});
inject.js
function inject(arg) {
var script = document.createElement("script");
script.innerHTML = 'alert("injecting"); window.myVar=54564;';
document.head.appendChild(script);
}
self.port.on("inject", inject);
page.html
<html>
<head>
</head>
<body>
<script>
alert(window.myVar);
</script>
</body>
</html>
和页面
<html>
<head>
</head>
<body>
<script>
alert(window.myVar); <!--This shows empty alert box-->
alert(window.myVar); <!--This shows alert box with right value (123)-->
</script>
</body>
</html>
警报(window.myVar);
警报(window.myVar);
从Firefox 30开始(大约两个版本之前!)您可以使用一些新的API来实现这一点。这看起来像:
let myVar = {1:2};
self.port.on("inject", function() {
unsafeWindow.myVar = cloneInto(myVar, unsafeWindow);
});
有关详细信息,请参见:访问页面窗口对象的唯一方法是通过
unsafeWindow
。这个话题已经被讨论了一百万次,最详尽。我猜在注入内容脚本时有一个轻微的时间错误。我建议稍微延迟对全局脚本的访问—附加内容脚本需要时间。这种方式很有效,但FF 31上存在一些奇怪的行为。检查我的编辑。
let myVar = {1:2};
self.port.on("inject", function() {
unsafeWindow.myVar = cloneInto(myVar, unsafeWindow);
});