IE9的注入脚本标签的执行顺序是否有已知的解决方法?

时间:2011-08-19 19:11:11

标签: javascript internet-explorer google-chrome labjs javascript-injection

我确信我没有完全理解这个问题,但似乎我们在我的项目中看到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。

4 个答案:

答案 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();