Javascript 使用document.write是否是跨浏览器跨域同步加载脚本的唯一可能方法?

Javascript 使用document.write是否是跨浏览器跨域同步加载脚本的唯一可能方法?,javascript,browser,cross-browser,Javascript,Browser,Cross Browser,我想模仿这种行为: <script src="console.log.1.js"></script> <script>console.log(2)</script> <script>console.log(3)</script> 这样做行不通: <script> var x = document.createElement("script"); x.src = "console.log.1.js"; x.asy

我想模仿这种行为:

<script src="console.log.1.js"></script>
<script>console.log(2)</script>
<script>console.log(3)</script>
这样做行不通:

<script>
var x = document.createElement("script");
x.src = "console.log.1.js";
x.async = false;
x.defer = false;
document.body.appendChild(x);
console.log("2");
console.log("3");
</script>
到目前为止,我找到了实现这一目标的唯一途径:

<script>
document.write("<scrip" + "t src='console.log.1.js'></scrip" + "t>");
</script>
<script>
console.log("2");
console.log("3");
</script>

是的,这是在页面解析期间强制加载脚本的唯一方法。或者至少,我愿意相信的唯一方法是跨浏览器运行良好

如果你的剧本是这样的,我可以看到你的想法:

<script>
var x = document.createElement("script");
x.src = "console.log.1.js";
x.async = false;
x.defer = false;
document.body.appendChild(x);
</script>
<script><!-- note the new script element -->
console.log("2");
console.log("3");
</script>
结果:

before after during 输出:

before during after
是的,这是在页面解析期间强制加载脚本的唯一方法。或者至少,我愿意相信的唯一方法是跨浏览器运行良好

如果你的剧本是这样的,我可以看到你的想法:

<script>
var x = document.createElement("script");
x.src = "console.log.1.js";
x.async = false;
x.defer = false;
document.body.appendChild(x);
</script>
<script><!-- note the new script element -->
console.log("2");
console.log("3");
</script>
结果:

before after during 输出:

before during after
事实上,我发现使用LazyLoad插件非常适合这个用例,即

if (typeof jQuery === 'undefined')
    LazyLoad.js('//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js', function() { 
        initialize(); 
    });
else
    initialize();

事实上,我发现使用LazyLoad插件非常适合这个用例,即

if (typeof jQuery === 'undefined')
    LazyLoad.js('//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js', function() { 
        initialize(); 
    });
else
    initialize();

您是否考虑过使用document.getElementsByTagName'body'[0].appendChildx;?但即便如此,你不在头上而不是身体上附加东西有什么原因吗?我想那还是会注销231,就像第二个例子一样。@DavidThomas:我和Karolis在一起。不是脚本元素没有在执行它的元素之后立即插入,至少在Chrome上是这样,根据开发工具,这是因为以这种方式附加脚本元素会触发异步操作来下载脚本。您是否考虑过使用document.getElementsByTagName'body'[0]。appendChildx;?但即便如此,你不在头上而不是身体上附加东西有什么原因吗?我想那还是会注销231,就像第二个例子一样。@DavidThomas:我和Karolis在一起。这并不是说脚本元素没有在执行它的元素之后立即插入,至少在Chrome上是这样,根据开发工具的说法,这是因为以这种方式附加脚本元素会触发异步操作来下载脚本。您是否有任何指针、规格等,或者这是否来自经验也许最好的办法是查看firefox/chrome的实际源代码,但这听起来很痛苦。@Karolis:我真的不能指出什么,这有点弱。:-我用更多的讨论更新了答案,fwiw。我相信这是HTML5规范所暗示的。@Tim:很难说。虽然这解释了document.write的行为方式为何不同,但它并不一定告诉我们appendChild的行为方式为何不同。您是否有任何指针、规格等,或者这是否来自经验也许最好的办法是查看firefox/chrome的实际源代码,但这听起来很痛苦。@Karolis:我真的不能指出什么,这有点弱。:-我用更多的讨论更新了答案,fwiw。我相信这是HTML5规范所暗示的。@Tim:很难说。虽然这解释了document.write的行为方式与document.write不同,但它并不一定告诉我们为什么appendChild的行为方式与document.write不同。 before during after
if (typeof jQuery === 'undefined')
    LazyLoad.js('//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js', function() { 
        initialize(); 
    });
else
    initialize();