动态脚本标记加载未按预期工作

时间:2009-12-19 23:34:28

标签: javascript dojo google-closure google-closure-library

我们有一个使用google闭包和dojo库的应用程序。我们的索引页面中有以下内容可以正常工作:


<script type="text/javascript" src="runtime/src/lib/google-closure-rev26/closure/goog/base.js"></script>
<script type="text/javascript" src="runtime/src/lib/dojo_release_132_src/dojo/dojo.js"></script>
<script type="text/javascript" src="runtime/src/core/loader.js"></script>

我们想在实际的html源代码中只使用一个脚本标记。所以我们尝试执行以下操作:


<head>
   <script type="text/javascript" src="runtime/src-bootstrap.js"></script>
</head>

然后在src-bootstrap.js中:


var head = document.getElementsByTagName("head")[0];

var s1 = document.createElement("script");
s1.type = "text/javascript";
s1.src = "runtime/src/lib/google-closure-rev26/closure/goog/base.js";


var s2 = document.createElement("script");
s2.type = "text/javascript";
s2.src = "runtime/src/lib/dojo_release_132_src/dojo/dojo.js";

var s3 = document.createElement("script");
s3.type = "text/javascript";
s3.src = "runtime/src/core/loader.js";

head.appendChild(s1);
head.appendChild(s2);
head.appendChild(s3);

但是,这在FF中不起作用。 core / loader.js在dojo完全加载之前运行。任何想法为什么这不起作用?

3 个答案:

答案 0 :(得分:4)

对于这种类型的机制,最好使用document.write()来包含脚本。您当前使用的技术适用于延迟加载脚本,它以异步方式下载和执行脚本:http://www.nczonline.net/blog/2009/06/23/loading-javascript-without-blocking/

...或者您可以拥有一个实际连接这些文件的构建过程,并且只需要一个脚本,这样可以节省请求的数量,因为您实际执行的操作会增加请求的数量。

答案 1 :(得分:1)

我的猜测是因为你是通过DOM创建元素,而不是将它们作为标记,浏览器不会等待一个脚本在执行下一个脚本之前完成(就像在直线中一样) <script></script><script></script>设置)。

如何以级联形式附加脚本(谷歌关闭在其末尾添加s2,Dojo s3),或者如Lee Kowalkowski建议的那样,使用<script>编写document.write()命令?

答案 2 :(得分:0)

一般来说 - 在窗口下添加命名空间,然后编辑外部资源 -

  1. 在本地留下一个action.jsmain.js文件,这将添加一个方法,最好在全局范围内(意味着在窗口下...)。

  2. 编辑您的外部资源,在最后添加1行,在action.jsmain.js上调用方法,当加载完成时,“回调状态”将执行您以前添加到DOM的方法。它的工作方式与JSONProtocol非常相似。

  3. 即使使用动态加载资源的最复杂组合,它也能实现奇迹。

  4. 查看此动态加载Google {Cl}-Library another threadhttps://stackoverflow.com/a/17226714/257319