Javascript:是否有任何方法可以检测何时加载了所有异步脚本?

Javascript:是否有任何方法可以检测何时加载了所有异步脚本?,javascript,asynchronous,Javascript,Asynchronous,如果在HTML页面上使用纯脚本标记,则在下载并解析脚本之前,渲染将被阻止。为了避免这种情况,为了更快地显示页面,您可以添加“async”属性,它告诉浏览器在不等待脚本的情况下继续处理页面。然而,这本质上意味着引用该脚本中任何内容的其他javascript可能会崩溃,因为它所需要的对象还不存在 据我所知,没有一个全脚本的事件可以连接到一起,所以我正在寻找方法来模拟一个 我知道以下策略可以推迟运行其他代码,直到异步脚本可用: 对于单个脚本,请使用其“onload”事件或属性。然而,据我所知,如果存

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

据我所知,没有一个全脚本的事件可以连接到一起,所以我正在寻找方法来模拟一个

我知道以下策略可以推迟运行其他代码,直到异步脚本可用:

  • 对于单个脚本,请使用其“onload”事件或属性。然而,据我所知,如果存在多个脚本,则没有内置的方法来判断何时加载了所有脚本
  • 在附加到窗口的onload事件处理程序中运行所有依赖代码。但是,它们也会等待所有的图像,而不仅仅是所有的脚本,因此运行的时间比理想的时间晚
  • 使用加载程序库加载所有脚本;它们通常提供在加载所有内容时运行回调。缺点(除了需要一个库来完成这项工作(必须提前加载)之外)是,所有代码都必须包装在一个(通常是匿名的)函数中,然后传递到加载程序库中。这与创建一个在我虚构的allScriptsLoaded启动时运行的函数相反

我是否遗漏了什么,或者这是最先进的吗?

您最好希望知道是否有任何未完成的异步调用(XMLHttpRequest、setTimeout、setInterval、SetImmediate、process.nextTick、Promise),然后等待没有。然而,这是底层本机代码所丢失的一个实现细节——javascript只有自己的事件循环,如果我理解正确,异步调用会传递给本机代码。除此之外,您没有访问事件循环的权限。您只能插入,不能读取或控制流(除非您在io.js和中)

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


但是,是的,DOM没有提供NoAsyncPending global或其他什么,这才是您真正需要的。

我也想知道答案!如果不在加载前添加onload处理程序,似乎无法检查
元素是否已加载。这可能包括您要查找的答案: