据我所知,在script
元素中,async
属性允许脚本异步下载(类似于图像),而defer
使脚本等待直到执行结束为止。
假设我要包含两个脚本:
<script src="library.js"></script>
<script src="process.js"></script>
我希望它们都异步进行,我希望process.js
等到最后开始处理。
是否有一种方法可以使library.js
脚本异步运行 ?
注意
我发现,关于async
属性的实际作用,不同的在线资源之间似乎存在一些差异。
MDN和WhatWG建议,这意味着脚本应执行异步。其他在线资源建议它应 load 异步加载,但在执行时仍会阻止渲染。
答案 0 :(得分:2)
我发现Sequential script loading in JavaScript可以为您提供帮助:
(function(){
//three JS files that need to be loaded one after the other
var libs = [
'https://code.jquery.com/jquery-3.1.1.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/underscore.string/3.3.4/underscore.string.js'
];
var injectLibFromStack = function(){
if(libs.length > 0){
//grab the next item on the stack
var nextLib = libs.shift();
var headTag = document.getElementsByTagName('head')[0];
//create a script tag with this library
var scriptTag = document.createElement('script');
scriptTag.src = nextLib;
//when successful, inject the next script
scriptTag.onload = function(e){
console.log("---> loaded: " + e.target.src);
injectLibFromStack();
};
//append the script tag to the <head></head>
headTag.appendChild(scriptTag);
console.log("injecting: " + nextLib);
}
else return;
}
//start script injection
injectLibFromStack();
})();
答案 1 :(得分:0)
defer
和async
都会影响何时执行脚本,而不影响何时下载脚本。我认为造成混淆的原因是某些文档的术语有点草率,而术语 loaded 尚不清楚它是指获取资源还是执行资源。< / p>
要使library.js
在不等待文档加载的情况下异步运行,请使用async
属性,并要使process.js
等待文档被解析,请使用{{1} }:
defer
请注意,尽管可以保证<script src="library.js" async></script>
<script src="process.js" defer></script>
可以在library.js
之前运行。