繁体   English   中英

Javascript:有什么方法可以检测所有异步脚本何时加载?

[英]Javascript: Is there any way to detect when all async scripts have loaded?

如果您在HTML页面上使用普通脚本标记,则在下载并解析脚本之前,渲染将被阻止。 为了避免这种情况,为了更快地显示页面,您可以添加'async'属性,该属性告诉浏览器无需等待该脚本即可继续处理页面。 但是,从本质上讲,这意味着引用该脚本中任何内容的其他JavaScript可能会崩溃,因为所需的对象尚不存在。

据我所知,没有可以绑定的allScriptsLoaded事件,因此我正在寻找一种模拟方法。

我知道以下策略可将运行其他代码的时间推迟到异步脚本可用之前:

  • 对于单个脚本,请使用其“ onload”事件或属性。 但是,我不知道有什么内置的方法可以知道何时加载了所有脚本(如果有多个)。
  • 在窗口附带的onload事件处理程序中运行所有相关代码。 但是,它们也等待所有图像,而不仅仅是所有脚本,因此运行时间比理想情况要晚。
  • 使用加载程序库加载所有脚本; 它们通常提供在所有内容加载完成后运行的回调。 缺点(除了需要执行此操作的库之外,必须提前加载)是,所有代码都必须包装在(通常是匿名的)函数中,然后传递给加载程序库。 这与仅创建一个在神话般的allScriptsLoaded触发时运行的函数相反。

我是否缺少某些东西,或者这是最新技术?

您所希望的最好的办法就是知道是否有任何未完成的异步调用(XMLHttpRequest,setTimeout,setInterval,SetImmediate,process.nextTick,Promise),然后等待不存在任何异步调用。 但是,这是实现细节,它会丢失给底层的本机代码-javascript仅具有自己的事件循环,如果我正确理解,异步调用将传递给本机代码。 最重要的是,您无权访问事件循环。 您只能插入,不能读取或控制流(除非您在io.js中并感到生气)。

模拟一个脚本的方法是自己跟踪脚本调用,并在所有脚本完成后调用。 (即,跟踪每次在事件循环中插入相关脚本时的情况。)

但是,是的,DOM没有提供NoAsyncPending全局之类的东西,而这正是您真正需要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM