在Firefox插件内容脚本中访问窗口对象?

时间:2012-08-30 09:55:52

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

我似乎无法访问内容脚本中的窗口对象。这是正常的吗?

例如,这没有任何作用:

window.onload = function() {
  console.log("Hello from the onload");
};

相反,我必须使用unsafeWindow对象。

unsafeWindow.onload = function() {
  console.log("Hello from the onload");
};

我一定错过了一些简单的东西吗?

2 个答案:

答案 0 :(得分:5)

不要使用window.onload,而是写:

window.addEventListener("load", function() {
  console.log("Hello from the onload");
}, false);

window.onload有一个限制,即只能有一个事件监听器,设置一个不同的监听器取代现有的监听器 - 这已经是你永远不应该使用它的原因了。在附加SDK的情况下,事情变得更复杂,因为内容脚本具有与网页不同的DOM视图。所以只需使用addEventListener

哦,请不要使用unsafeWindow - 它(正如名称所示)本身就是不安全的。

答案 1 :(得分:4)

内容脚本中可用的窗口对象实际上是一个代理 - 因此unsafeWindow工作,窗口不工作。我做了一些测试,document.addEventListener也不起作用:

https://builder.addons.mozilla.org/package/150362/latest/

jQuery似乎工作得很好,我想他们会做一些魔术来确保无论发生什么都会开火。

解决方法只是将contentScript设置为“结束”并立即运行代码 - 这应始​​终在文档加载完成后附加内容脚本时起作用。

我确实记录了这个关于我喜欢把它当作'wtf'的错误吗?这种行为的一个方面 - 我认为结果令Web开发人员感到惊讶,我们应该尝试不那么令人惊讶:

https://bugzilla.mozilla.org/show_bug.cgi?id=787063