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)
我一定错过了一些简单的事情吗?
内容脚本中可用的 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
不要使用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- 它(正如名称所示)本身就不安全.