0

我有以下代码布局

<script src="http://some.javascript/file.js"></script> // This should load first
<script language="JavaScript">
    document.write('<SCR'+'IPT language="JavaScript1.1" SRC="http://a.link.to.an.external.url/that/returns/a/full/html/page/including/some/javascript">'); // This should load second
    document.write('</SCR'+'IPT>');
</script>

MyJavascriptFunctionThatDependsOnStuffLoadedFromThe.documentWritePage(); <!-- Those files above should have loaded before this call -->

我知道这看起来很奇怪。让我们假设它必须看起来像这样,原因不会影响 JS 的加载方式。这不需要跨浏览器工作——只需要 WebKit 浏览器。

如何确保每个文档在下一个文档之前完全加载?也就是说,如何确保这些文档同步加载,以便最后的函数调用可以呈现适当的状态?

4

2 回答 2

1

JavaScript 文件应该按顺序加载并阻塞,因此除非您所依赖的脚本正在做一些不寻常的事情,否则您需要做的就是在其他文件之后加载 application.js。

跨域脚本是在站点本身的脚本之后加载的,这就是你得到错误的原因。

您可以添加事件侦听器并在此事件上加载您的 js 文件,如下所示:

function addJavaScript( js, onload ) {
   var head, ref;
   head = document.getElementsByTagName('head')[0];
   if (!head) { return; }
   script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = js;
   script.addEventListener( "load", onload, false );
   head.appendChild(script);
}
于 2012-07-16T17:51:58.123 回答
0

我认为您不能始终如一地跨浏览器这样做。

IE(至少许多旧版本)将按照从服务器返回的顺序处理脚本标签。许多其他浏览器按照定义的顺序处理它们。像这样动态添加到 DOM 的,谁知道呢?我当然不会指望能够控制它们的执行顺序,除非您在尝试添加下一个之前添加某种包装器来测试一个包装器是否到位。

如果它只是必须这样,我真的不知道该建议什么。但是,如果您可以切换使用它们,那么有很多模块加载器。你可能会特别关注AMD

于 2012-07-16T17:56:26.297 回答