【问题标题】:Detect async script load in Chrome检测 Chrome 中的异步脚本加载
【发布时间】:2015-11-05 00:09:31
【问题描述】:

我正在编写一个需要检查 DOM 中元素的 chrome 扩展。我目前正在尝试解决在document.onload 触发后将脚本添加到 DOM 的情况,并且这些脚本会向 DOM 添加更多元素,我想查看这些元素。有时元素位于子框架中,有时脚本会使用document.write 添加它们。是的,我知道,我知道。

目前的主要问题似乎是我无法检测脚本是否已经加载。如果它没有加载,我可以安全地将一个监听器附加到script.onload,但是如果它已经已经加载了,onload 将不会触发。

在其他几个地方,我会检查readyState 以查看文档是否已经准备好。如果是,我执行我的代码,如果不是,我附加一个 onload 监听器。然而,Chrome 中的异步脚本似乎没有 readyState,尽管在几个 SO 答案中都引用了这样的属性。

那么有什么方法可以确定异步脚本是否已经加载?由于这是特定于 Chrome 的,因此不需要跨浏览器兼容。有没有办法使用 MutationObserver 可靠地为 每个 脚本附加一个 onload 侦听器并手动跟踪其状态?

谢谢!

【问题讨论】:

  • 等等,你为什么要让自己变得更困难?当您可以跟踪添加的实际节点时,为什么要使用 MutationObserver 跟踪脚本的onload

标签: javascript html dom google-chrome-extension


【解决方案1】:

要检测加载到 DOM 上的脚本,请检索所有脚本标签:

document.querySelectorAll('script');

这将返回加载到 DOM 上的脚本数组。在数组上调用 .length 将显示加载了多少脚本。您可以通过它们的 .src 或其他属性引用这些脚本来执行诸如获取它们的子元素或兄弟元素之类的操作。

【讨论】:

  • 这并不能告诉您具有async 属性的脚本是否已实际下载并执行。这就是script.onload 事件的用途,但它存在我的问题中概述的问题。不过谢谢!
  • 您可以等待页面加载,直到您可以安全地假设所有异步脚本都已完成加载并过滤以仅获取异步脚本。然后为每个 async script.onload 事件编写案例,以便在刷新页面时,您应该能够捕获所有 onload 事件并处理每个 async 脚本。
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 2016-07-09
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 2019-06-29
相关资源
最近更新 更多