随着Firefox 57和Greasemonkey 4的更新,我的一些用户脚本出现了问题。在一些脚本中,我使用了:
document.addEventListener('DOMContentLoaded', doStuff, false);
在Greasemonkey中这已经不再起作用了。现在添加DOMContentLoaded
事件的正确方法是什么?
附言:我检查过在注册事件时,DOM仍未准备就绪。
随着Firefox 57和Greasemonkey 4的更新,我的一些用户脚本出现了问题。在一些脚本中,我使用了:
document.addEventListener('DOMContentLoaded', doStuff, false);
在Greasemonkey中这已经不再起作用了。现在添加DOMContentLoaded
事件的正确方法是什么?
附言:我检查过在注册事件时,DOM仍未准备就绪。
addEventListener("DOMContentLoaded", function(){
// …
});
当我试图修复我的用户脚本时,我最初注释掉了那个包装器,并放置了一个 instead
。
// @run-at document-end
在元数据块中。这样,我确保了DOM已准备好,并且最初位于DOMContentLoaded
包装器内的代码正确执行。
这个方法有效,但对于我的两个用户脚本,我实际上需要在任何页面脚本运行之前运行JavaScript并在DOM准备就绪时执行其他代码。结果发现,现在你必须把
// @run-at document-start
DOMContentLoaded
包装器才能使您的window
(或document
)正常工作。在以前的GreaseMonkey版本中,我可以省略这个并且它仍然可以正常运行。
然而,根据GreaseSpot Wiki,document-start
不能保证在GreaseMonkey 4.0中正常工作,可能是由于异步执行或缺少WebExtensions重写附加组件的功能。
此外,使用document-start
时,document.readyState
将为"loading"
,但使用document-end
或没有// @run-at
时,将为"interactive"
。
我仍然不知道在Greasemonkey 4中运行DOM ready代码的推荐方法是什么,但是在更改以下内容后:
document.addEventListener('DOMContentLoaded', doStuff, false);
to:
window.addEventListener('load', doStuff, false);
我的脚本又可以工作了。我刚开始尝试了基于这个答案的其他方法,因为我注意到我的基于jQuery的用户脚本仍然在工作(至少DOM ready部分是有效的)。
这个答案有点显而易见,但当我写问题时,我不确定自己是否跟上了Greasemonkey的变化(阅读所有异步内容),我期望DOMContentLoaded
能够正常工作。
@run-at document-end
吗? - peterh