在 Chrome 扩展内容脚本中,我是否必须在处理文档之前等待 document.ready?

IT技术 javascript jquery google-chrome google-chrome-extension
2021-02-28 18:12:01

具体来说,我正在评估页面上的所有图像以查看它们是否具有某个属性,然后根据这些属性将一些新的 <divs> 添加到 DOM。在执行这些修改之前,我是否必须等待 document.ready 触发才能保证 Chrome 已经加载了 DOM 的所有必要部分?

我遇到的问题是有时 document.ready 需要很短的时间才能触发,而用户已经在浏览页面,想知道为什么我的扩展程序还没有产生任何效果。问题通常只持续片刻,但足以令人讨厌。

如果我不费心等待 document.ready,而是立即处理文档,一切似乎都正常;但我想知道我是否只是走运了。

2个回答

实际上,您不必等待。您可以立即在Content Scripts 中进行处理只要确保你不使用document_startrun_at属性。

在 中document_end,文件在 DOM 完成后立即注入,但在图像和帧等子资源加载之前。document_idle(默认值)发生得更晚。

{
  "name": "My extension",
  ...
  "content_scripts": [
    {
      "matches": ["http://www.google.com/*"],
      "css": ["mystyles.css"],
      "js": ["jquery.js", "myscript.js"],
      "run_at": "document_end"
    }
  ],
  ...
}
同意如果你想检查文档是否加载,上面提到的方法是好的。但是即使在加载 Document 之后,DOM 更新也可能发生。这可能是 AJAX 功能。就像为“DOMSubtreeModified”添加一个监听器。window.addEventListener("DOMSubtreeModified", (event) -> console.log "DOMSubtreeModified", event )
2021-04-27 18:12:01

简短的回答:是的。

长答案:jQuery 将无法获取任何尚未呈现的 DOM 元素。我知道我遇到了几次麻烦,调试一段时间后发现我忘记将代码包装在 document.ready 中可能会很烦人。如果它对你有用,那是因为你很幸运。此外,如果您的脚本位于页面底部,就在结束正文标记的上方,则无需将其包装在 document.ready 中。

这是关于页面底部脚本的一个很好的观点。在哪里/何时评估 Chrome 扩展内容脚本?
2021-04-15 18:12:01
简短回答:仅当您使用document_start. 两者document_idle(默认)和document_end在 dom 就绪后运行。
2021-04-17 18:12:01
根据 Chrome 时间线(开发人员工具),扩展程序最后加载。所以你很可能不必使用 document.ready
2021-05-04 18:12:01