我似乎无法访问内容脚本中的窗口对象。这是正常的吗?
例如,这没有任何作用:
window.onload = function() {
console.log("Hello from the onload");
};
相反,我必须使用unsafeWindow
对象。
unsafeWindow.onload = function() {
console.log("Hello from the onload");
};
我一定错过了一些简单的东西吗?
答案 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开发人员感到惊讶,我们应该尝试不那么令人惊讶: