2009-12-19 62 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