2009-12-19 63 views
1

我们有一个同时使用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工作。核心/ loader.js在dojo完全加载之前运行。任何想法,为什么这不起作用?

回答

4

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

...或者您可以有一个实际连接这些文件的构建过程,并且只需要一个脚本,这也可以节省请求的数量,因为你实际上做的是增加了请求的数量。

+0

谢谢'文件撰写(“”)'的伎俩这个非常类似的解决方案的例子。 – Lightbeard 2009-12-20 01:55:45

1

我的猜测是,因为您是通过DOM创建元素,而不是将它们作为标记,浏览器不会等待一个脚本完成后再执行下一个脚本(例如,在直接<script></script><script></script>设置)。

如何在级联表单中添加脚本(Google关闭在其末尾添加s2,Dojo s3),或者如Lee Kowalkowski所示,使用document.write()编写<script>命令?

0

一般而言 - 在窗口中添加一个命名空间,和编辑外部资源 -

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

  2. 编辑您的外部资源,在末处加入1个额外的行,要求对action.jsmain.js的方法,当加载会做,“回调像”将执行该方法,你已经增加了DOM之前。它非常像JSONProtocol。

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

看到提供动态加载谷歌,封库上another threadhttps://stackoverflow.com/a/17226714/257319