Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript IE9'有已知的解决方法吗;注入的脚本标记的执行顺序?_Javascript_Internet Explorer_Google Chrome_Labjs_Javascript Injection - Fatal编程技术网

Javascript IE9'有已知的解决方法吗;注入的脚本标记的执行顺序?

Javascript IE9'有已知的解决方法吗;注入的脚本标记的执行顺序?,javascript,internet-explorer,google-chrome,labjs,javascript-injection,Javascript,Internet Explorer,Google Chrome,Labjs,Javascript Injection,我确信我并不完全理解这个问题,但我们似乎在我的项目中看到了IE9上的奇怪行为,某种程度上与通过调用文档注入的JavaScript无序执行有关。编写,例如: document.write('<scr'+'ipt type="text/javascript" src="'+file1+'"></src'+'ipt>'); document.write('<scr'+'ipt type="text/javascript" src="'+file2+'"></s

我确信我并不完全理解这个问题,但我们似乎在我的项目中看到了IE9上的奇怪行为,某种程度上与通过调用
文档注入的JavaScript无序执行有关。编写
,例如:

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>');
document.write(“”);
文件。写(“”);
文件。写(“”);
我有限的谷歌研究表明,IE9将以不同于其他浏览器(尤其是Firefox和Chrome)的顺序执行以这种方式注入的脚本。有没有更好的方法来实现我们的目标,确保所有浏览器的执行顺序相同


我收回这一点:我们并不真正关心所有的浏览器,只关心Chrome和IE9。

因此,以这种方式编写脚本标记的优势在于,它们可以。我不知道浏览器的细微差别到底是如何做到的,但我原以为它们会在下载时执行,没有特定的顺序。类似于动物的行为


另一种方法是让脚本按顺序执行,但以非阻塞方式执行。您可以尝试将其添加到生成的
标记中。IE9.

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

var newJS= document.createElement('script');
newJS.onload=function() {alert("done")} //or call next load function
newJS.src="..."
document.body.appendChild(newJS)

使用一个脚本加载器(就像我写的:),它将规范化各种浏览器中所有不同的加载怪癖。还有一个好处:它没有使用那个糟糕透顶的文档。LABjs将允许您异步(并行)加载所有脚本,但请确保它们以正确的顺序执行。听起来基本上正是你想要的。

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

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

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

而且您不需要
document.write()

(大声思考):我想知道在IE9中使用
document.write()
将脚本插入DOM是否是一种非阻塞操作?(也大声思考):是否可以为每个注入的标记添加
defer
属性?我不知道它会有什么影响,如果有的话,但是如果脚本当前按照它们完成下载的顺序(即首先是最小/最快的主机)而不是它们声明的顺序进行评估,那么添加
defer
可能会迫使它们堆叠。也许吧,我肯定是的。这是一个被广泛接受的非阻塞JavaScript调用解决方案。@Flambino:我对
defer
属性不太了解,但实际上我已经尝试过了,而且似乎没有解决问题。关于
async
defer
的更好资源是:
文档。write
是同步的,非异步。
文档。写入
是同步的。写入文档的
标记(使用
document.write
或其他方法)将导致异步加载源JavaScript文件。否,使用
文档编写的脚本。写入
仍然是同步的。为什么函数的执行会有所不同,因为指定了脚本而不是明文?此外,那篇文章中甚至没有提到
document.write
(除了在评论中有一点提及)。考虑这个演示:那就是“JavaScript方式”: