我确信我没有完全理解这个问题,但似乎我们在我的项目中看到IE9上的奇怪行为,不知何故与JavaScript的无序执行有关通过调用document.write
注入,例如:
document.write('<scr'+'ipt type="text/javascript" src="'+file1+'"></src'+'ipt>');
document.write('<scr'+'ipt type="text/javascript" src="'+file2+'"></src'+'ipt>');
document.write('<scr'+'ipt type="text/javascript" src="'+file3+'"></src'+'ipt>');
我有限的谷歌研究表明,IE9将以与其他浏览器(特别是Firefox和Chrome)不同的顺序执行以这种方式注入的脚本。有没有更好的方法来实现我们的目标,这将确保所有浏览器的执行顺序相同?
我接受了回复:我们并不关心所有浏览器,只关注Chrome和IE9。
答案 0 :(得分:5)
我猜你可以链接一个onload事件来启动另一个的加载:
var newJS= document.createElement('script');
newJS.onload=function() {alert("done")} //or call next load function
newJS.src="..."
document.body.appendChild(newJS)
答案 1 :(得分:5)
使用脚本加载器(就像我写的那样:LABjs),它将规范化各种浏览器加载的所有不同怪癖。和奖励:它不使用那个上帝可怕的document.write()。 LABjs将允许您异步(并行)加载所有脚本,但要确保它们以正确的顺序执行。听起来基本上就是你想要的。
答案 2 :(得分:2)
因此,以这种方式编写脚本标记的优点是它们are loaded asynchronously。我不知道浏览器的细微差别究竟是如何完成的,但我认为它们会在下载后执行,没有特定的顺序。与HTML5 async
attribute的行为类似。
还有另一个HTML5 attribute defer
,它使脚本按顺序执行,但是采用非阻塞方式。您可以尝试将其添加到生成的<script>
代码中。 IE9 partially honours it。
答案 3 :(得分:0)
我为此目的制作了一个小脚本:
https://github.com/mudroljub/js-async-loader
简而言之,它以异步方式加载所有脚本,然后执行它们。它看起来像这样:
for (var lib in libs) {
loadAsync(lib);
}
您不需要document.write()
;