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

Dav*_*ite 1 javascript firefox firefox-addon firefox-addon-sdk

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

例如,这没有任何作用:

window.onload = function() {
  console.log("Hello from the onload");
};
Run Code Online (Sandbox Code Playgroud)

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

unsafeWindow.onload = function() {
  console.log("Hello from the onload");
};
Run Code Online (Sandbox Code Playgroud)

我一定错过了一些简单的事情吗?

can*_*ani 5

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

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

jQuery 似乎工作得很好,我想他们有一些魔力来确保他们无论如何都能触发。

解决方法是将 contentScriptWhen 设置为“end”并立即运行代码 - 这应该始终有效,因为文档加载完成时会附加内容脚本。

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

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


Wla*_*ant 5

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

window.addEventListener("load", function() {
  console.log("Hello from the onload");
}, false);
Run Code Online (Sandbox Code Playgroud)

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

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