随着Firefox 57和Greasemonkey 4的更新,我的一些用户脚本破了。在我使用的一些脚本中:
document.addEventListener('DOMContentLoaded', doStuff, false);
这不再适用于Greasemonkey。现在添加DOMContentLoaded
事件的正确方法是什么?
P.S。我在注册事件时检查过,DOM还没准备好。
答案 0 :(得分:2)
我仍然不知道在Greasemonkey 4中为DOM准备好运行代码的推荐方法是什么,但在更改之后:
document.addEventListener('DOMContentLoaded', doStuff, false);
为:
window.addEventListener('load', doStuff, false);
我的脚本再次运作。我刚刚开始基于这个answer测试其他方法,因为我注意到我的基于jQuery的用户脚本仍在工作(至少DOM就绪部分可以)。
这个答案很明显,但在撰写问题时,我不确定我是否跟上Greasemonkey的变化(阅读所有异步内容)并且我预期DOMContentLoaded
工作。
答案 1 :(得分:2)
在GreaseMonkey升级到版本4后我遇到了类似的问题,但是我使用了
addEventListener("DOMContentLoaded", function(){
// …
});
代替。
在尝试修复我的用户脚本时,我最初注释掉了包装并放了一个
// @run-at document-end
metadata block中的。这样,我确保DOM已准备好,并且最初在DOMContentLoaded
包装器内的代码正确执行。
然而,对于我实际需要运行JavaScript的两个用户脚本,在任何页面脚本运行和在DOM准备好时执行其他代码之前,这是有效的。事实证明,现在你需要来放
// @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
。