Javascript Firefox插件-在第页上运行脚本

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({

使用插件SDK,我试图在每次加载页面时向页面注入脚本。为了进行测试,插件正在尝试向窗口对象添加变量,页面应该读取该变量。当我运行这个程序时,我可以看到“注入”警报,但页面给出了错误“UndefinedPropertyWindow.myVar”。我做错了什么?顺便说一句,我不想使用非安全窗口

main.js:

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);
});