我知道我对这个问题的回答有点晚了,但是,这是www.html5rocks.com中的一篇很棒的文章-深入了解脚本加载的阴暗水域。
在那篇文章中得出的结论是,在浏览器支持方面,在不阻塞内容呈现的情况下动态加载 JavaScript 文件的最佳方式是以下方式:
考虑到您已经命名了四个脚本script1.js, script2.js, script3.js, script4.js
,那么您可以通过应用 async = false来做到这一点:
[
'script1.js',
'script2.js',
'script3.js',
'script4.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
现在,Spec说:一起下载,全部下载后按顺序执行。
Firefox < 3.6,Opera 说:我不知道这个“异步”的东西是什么,但碰巧我按照添加的顺序执行通过 JS 添加的脚本。
Safari 5.0 说:我理解“异步”,但不理解用 JS 将其设置为“false”。我会在你的脚本落地后立即执行,无论顺序如何。
IE < 10 说:不知道“异步”,但是有一个使用“onreadystatechange”的解决方法。
其他一切都在说:我是你的朋友,我们将照本宣科。
现在,使用 IE < 10 解决方法的完整代码:
var scripts = [
'script1.js',
'script2.js',
'script3.js',
'script4.js'
];
var src;
var script;
var pendingScripts = [];
var firstScript = document.scripts[0];
// Watch scripts load in IE
function stateChange() {
// Execute as many scripts in order as we can
var pendingScript;
while (pendingScripts[0] && pendingScripts[0].readyState == 'loaded') {
pendingScript = pendingScripts.shift();
// avoid future loading events from this script (eg, if src changes)
pendingScript.onreadystatechange = null;
// can't just appendChild, old IE bug if element isn't closed
firstScript.parentNode.insertBefore(pendingScript, firstScript);
}
}
// loop through our script urls
while (src = scripts.shift()) {
if ('async' in firstScript) { // modern browsers
script = document.createElement('script');
script.async = false;
script.src = src;
document.head.appendChild(script);
}
else if (firstScript.readyState) { // IE<10
// create a script and add it to our todo pile
script = document.createElement('script');
pendingScripts.push(script);
// listen for state changes
script.onreadystatechange = stateChange;
// must set src AFTER adding onreadystatechange listener
// else we’ll miss the loaded event for cached scripts
script.src = src;
}
else { // fall back to defer
document.write('<script src="' + src + '" defer></'+'script>');
}
}
一些技巧和缩小后,它是 362 字节
!function(e,t,r){function n(){for(;d[0]&&"loaded"==d[0][f];)c=d.shift(),c[o]=!i.parentNode.insertBefore(c,i)}for(var s,a,c,d=[],i=e.scripts[0],o="onreadystatechange",f="readyState";s=r.shift();)a=e.createElement(t),"async"in i?(a.async=!1,e.head.appendChild(a)):i[f]?(d.push(a),a[o]=n):e.write("<"+t+' src="'+s+'" defer></'+t+">"),a.src=s}(document,"script",[
"//other-domain.com/1.js",
"2.js"
])