5

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

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

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

PS我在注册事件的时候检查了一下,DOM还没有准备好。

4

2 回答 2

3

我仍然不知道在 Greasemonkey 4 中准备好的 DOM 上运行代码的推荐方式是什么,但是在更改之后:

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

至:

window.addEventListener('load', doStuff, false);

我的脚本再次起作用。我刚刚开始根据这个答案测试其他方法,因为我注意到我的基于 jQuery 的用户脚本仍在工作(至少 DOM 就绪部分可以)。

这个答案有点明显,但在写这个问题的时候,我不确定我是否跟上了 Greasemonkey 的变化(阅读所有异步的东西),我希望DOMContentLoaded能正常工作。

于 2017-11-28T23:47:26.597 回答
3

GreaseMonkey 升级到版本 4 后我遇到了类似的问题,但我使用

addEventListener("DOMContentLoaded", function(){
  // …
});

反而。

在尝试修复我的用户脚本时,我最初注释掉了那个包装器并放了一个

// @run-at document-end

元数据块中。通过这种方式,我确保了 DOM 已准备就绪,并且最初位于DOMContentLoaded包装器内的代码正确执行。

然而,这对我的两个用户脚本来说是有效的,我实际上需要在任何页面脚本运行在 DOM 准备好时执行其他代码之前运行 JavaScript。事实证明,现在你需要

// @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

于 2017-12-14T15:44:48.230 回答