随着 Firefox 57 和 Greasemonkey 4 的更新,我的一些用户脚本被破坏了。在我使用的一些脚本中:
document.addEventListener('DOMContentLoaded', doStuff, false);
这不再适用于 Greasemonkey。DOMContentLoaded
现在添加事件的正确方法是什么?
PS我在注册事件的时候检查了一下,DOM还没有准备好。
随着 Firefox 57 和 Greasemonkey 4 的更新,我的一些用户脚本被破坏了。在我使用的一些脚本中:
document.addEventListener('DOMContentLoaded', doStuff, false);
这不再适用于 Greasemonkey。DOMContentLoaded
现在添加事件的正确方法是什么?
PS我在注册事件的时候检查了一下,DOM还没有准备好。
我仍然不知道在 Greasemonkey 4 中准备好的 DOM 上运行代码的推荐方式是什么,但是在更改之后:
document.addEventListener('DOMContentLoaded', doStuff, false);
至:
window.addEventListener('load', doStuff, false);
我的脚本再次起作用。我刚刚开始根据这个答案测试其他方法,因为我注意到我的基于 jQuery 的用户脚本仍在工作(至少 DOM 就绪部分可以)。
这个答案有点明显,但在写这个问题的时候,我不确定我是否跟上了 Greasemonkey 的变化(阅读所有异步的东西),我希望DOMContentLoaded
能正常工作。
GreaseMonkey 升级到版本 4 后我遇到了类似的问题,但我使用
addEventListener("DOMContentLoaded", function(){
// …
});
反而。
在尝试修复我的用户脚本时,我最初注释掉了那个包装器并放了一个
// @run-at document-end
在元数据块中。通过这种方式,我确保了 DOM 已准备就绪,并且最初位于DOMContentLoaded
包装器内的代码正确执行。
然而,这对我的两个用户脚本来说是有效的,我实际上需要在任何页面脚本运行并在 DOM 准备好时执行其他代码之前运行 JavaScript。事实证明,现在你需要把
// @run-at document-start
在元数据块中,以便DOMContentLoaded
包装器在您的window
(或document
)上工作。
在以前版本的 GreaseMonkey 中,我可以省略它,它会运行良好。
但是,根据GreaseSpot Wiki,document-start
不能保证在 GreaseMonkey 4.0 中工作,可能是由于异步执行或 WebExtensions 重写插件中缺少功能。
此外,document.readyState
将"loading"
有document-start
,但"interactive"
有document-end
或根本没有// @run-at
。