如何在Greasemonkey 4中运行DOM上的代码?

时间:2017-11-24 23:21:14

标签: javascript greasemonkey-4

随着Firefox 57和Greasemonkey 4的更新,我的一些用户脚本破了。在我使用的一些脚本中:

document.addEventListener('DOMContentLoaded', doStuff, false);

这不再适用于Greasemonkey。现在添加DOMContentLoaded事件的正确方法是什么?

P.S。我在注册事件时检查过,DOM还没准备好。

2 个答案:

答案 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 Wikidocument-start不能保证在GreaseMonkey 4.0中工作,可能是由于异步执行或WebExtensions重写附件中缺少的功能。

此外,document.readyState "loading"document-start"interactive"document-end// @run-at