0

注意:我没有开发这个网站——我只需要处理它。

我有一个带有 LAB.js 的文档,用于在头部异步加载一系列脚本。再往下,我还有两个外部脚本,一个在头部下方,另一个在身体顶部。

这两个脚本通常无法访问。它们都被标记为“异步”并且不会阻止文档加载。但是 - 他们显然阻止了其他脚本的执行。

需要明确的是,第一系列脚本会立即下载,但在下载其他两个异步脚本之前似乎不会执行。

该站点不公开,并且无法在 jsfiddle 中创建此类问题。粗略的说明:

<!doctype html>
<head>
     <!-- This script asynchronously loads many others -->
     <script src="/js/LAB.js"></script>

     <script src="slow-server/js/slowscript1.js" async></script>
</head>
<body>
     <script src="show-server/js/slowscript2.js" async></script>
</body>

关于 Lab.js 的信息:http: //labjs.com/

LAB 会将其他几个脚本标签添加到要异步加载的头部。它们都立即下载,但在“慢速服务器”脚本响应之前不会执行。有时需要一段时间。在我看来,对于具有 async 属性的脚本(我正在 Chrome 中进行测试),这似乎是不正确的行为。有什么我想念的吗?

4

1 回答 1

2

这个 MDN 页面

使用这些属性可以选择三种可能的模式。如果存在 async 属性,则脚本将在可用时立即异步执行。如果 async 属性不存在但 defer 属性存在,则在页面完成解析后执行脚本。如果两个属性都不存在,则在用户代理继续解析页面之前立即获取并执行脚本。

因此,当脚本具有异步功能时,它将立即从服务器获取,但 DOM 解析将并行继续。那部分简单明了。

然后,一旦获取异步脚本,它将被执行。此执行可能在 DOM 完成加载之前或之后,完全取决于加载/解析事物的时间,它可能在页面中的其他非异步脚本运行之前或之后。

请注意,因为浏览器中的 javascript 是单线程的,所以一旦此异步脚本开始执行,在此脚本完成之前不会运行其他脚本,即使它是“异步”的。脚本上的异步允许继续解析 DOM(而不是阻塞),但它不会阻止脚本在可用时执行,并且一旦执行,其他处理必须等待它完成执行。

如果您希望脚本在 DOM 和 DOM 中的任何常规脚本加载并运行之后才执行,那么您应该使用“defer”,而不是“async”。

仅供参考,如果您想了解所有这些的实际规格,它就在这里


如果您想更详细地解释这一切如何适用于您的确切情况,您至少必须向我们提供您所询问的脚本的伪代码表示,因为您的文字不够清晰,无法理解。

于 2013-10-25T19:42:34.197 回答