注意:我没有开发这个网站 - 我只需要处理它。
我有一个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中测试),这似乎是错误的行为。有什么我想念的吗?
答案 0 :(得分:2)
使用这些可以选择三种可能的模式 属性。如果存在async属性,那么脚本将是 一旦可用就异步执行。如果异步 属性不存在但是defer属性存在,那么 页面完成解析后执行脚本。如果没有 属性存在,然后获取并执行脚本 在用户代理继续解析页面之前立即执行。
因此,当脚本具有异步时,它将立即从服务器获取,但DOM解析将并行继续。这部分很简单明了。
然后,只要获取了异步脚本,就会执行它。这种执行可以在DOM完成加载之前或之后,完全取决于事物加载/解析的时间,并且可能在页面中的其他非异步脚本运行之前或之后。
请注意,由于浏览器中的javascript是单线程的,因此一旦此异步脚本开始执行,在此脚本完成之前,其他脚本都不会运行,即使它是“异步”。脚本上的异步允许解析DOM继续(而不是阻塞),但它不会使脚本在可用时不执行,一旦执行,其他处理必须等待它完成执行。
如果您希望脚本在DOM和DOM中的任何常规脚本加载并运行之后才执行,那么您应该使用“defer”,而不是“async”。
仅供参考,如果您想了解所有这些的实际规格here。
如果您想要更详细地解释所有这些如何适用于您的确切情况,您必须至少为我们提供一个伪代码表示您要询问的脚本,因为您的单词不够明确跟随。