3

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

4 回答 4

5

我想你可以链接一个的 onload 事件来启动另一个的加载:

var newJS= document.createElement('script');
newJS.onload=function() {alert("done")} //or call next load function
newJS.src="..."
document.body.appendChild(newJS)
于 2011-08-19T19:20:20.550 回答
5

使用脚本加载器(就像我写的那个:LABjs),它将规范化跨各种浏览器加载的所有不同怪癖。还有好处:它不使用那个可怕的 document.write()。LABjs 将允许您异步(并行)加载所有脚本,但要确保它们以正确的顺序执行。听起来基本上正是你想要的。

于 2011-08-22T21:08:48.110 回答
2

所以用这种方式编写脚本标签的好处是它们是异步加载的。我不知道浏览器的细微差别究竟是如何完成的,但我原以为它们会在下载时执行,没有特定的顺序。类似于HTML5async属性的行为。

还有另一个HTML5 属性defer,它使脚本按顺序执行,但以非阻塞方式。您可以尝试将其添加到生成的<script>标签中。IE9部分尊重它

于 2011-08-19T19:19:16.660 回答
0

我制作了一个小脚本,正是为了这个目的:

https://github.com/mudroljub/js-async-loader

简而言之,它异步加载所有脚本,然后执行它们。它看起来像这样:

for (var lib in libs) {
    loadAsync(lib);
}

你不需要document.write()

于 2015-11-27T10:26:45.763 回答