1

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

例如,这什么都不做:

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

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

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

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

4

2 回答 2

5

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

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

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

哦,请不要使用unsafeWindow- 它(正如名字已经说过的)本质上是不安全的。

于 2012-08-31T08:01:38.077 回答
4

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

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

jQuery 似乎工作正常,但我想他们会做一些魔法来确保无论如何都能触发。

解决方法只需将 contentScriptWhen 设置为“结束”并立即运行您的代码 - 这应该始终有效,因为在完成加载文档时附加了内容脚本。

我确实记录了这个关于我喜欢认为的“wtf?”的错误。这种行为的一个方面——我认为结果对 Web 开发人员来说是令人惊讶的,我们应该尽量不那么令人惊讶:

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

于 2012-08-30T14:28:49.247 回答