2008-12-11 26 views
0

這是什麼用JavaScript;或者是我做錯了什麼。Javascript變量在外部文件中不可用

file1.js

var collection = new Object(); 
collection.foo = new Array(1, 2, 3); 

文件2.js

var someClass = new Class({ 
    bar : function() { 
     alert(collection.foo.length); 
    } 
}); 

的index.html

<script type="text/javascript" src="file1.js"></script> 
<script type="text/javascript" src="file2.js"></script> 
<script type="text/javascript"> 
var x = new someClass(); 
x.bar(); //cannot find collection 
</script> 

所以,我想另一種方法:

file1.js

collection.foo = new Array(1, 2, 3); 

文件2.js

var someClass = new Class({ 
    bar : function() { 
     alert(collection.foo.length); 
    } 
}); 

的index.html

<script type="text/javascript"> 
var collection = new Object(); 
</script> 
<script type="text/javascript" src="file1.js"></script> 
<script type="text/javascript" src="file2.js"></script> 
<script type="text/javascript"> 
var x = new someClass(); 
x.bar(); //cannot find collection.foo 
</script> 

我使用MooTools的(其中Class對象來自),如果你認爲事宜。

更新:我簡化了它的發佈示例,但x.bar()是另一種方法的單擊事件的一部分。但是在一些alert()測試之後,我發現file1實際上並沒有被執行。它實際上是一個用文本/ javascript contenttype發送的.axd文件,所以我不知道爲什麼 - 我必須調查明天。

是的,標籤將在底部。 file1是一個令人討厭的大型JavaScript文件,這就是爲什麼它被分離出來的原因 - 目標是不得不盡可能在客戶端上緩存。它是一個.axd文件,因爲它是從數據庫生成的(Ref數據),我明確設置了過期,壓縮,內容類型和可用性。

更新:經過更多的搗鼓之後,我發現在螢火蟲沒有捕捉的數據中出現錯誤;這只是一個錯誤,並不是一些深層次的技術問題。因此;收盤。

回答

1

是你的文件1源包裹在(有些標準模式)

(function() { 


})(); 

它做什麼,它打算在這種情況下,這是使局部變量?

編輯: 是否加入<腳本>和< /腳本>幫助之間的空間?我遇到了一些空標籤被忽略的問題,但我不確定這是否適用於這種情況。

+0

我試圖添加空間,也沒有工作。 =/ – 2008-12-11 22:55:01

0

「Class」的用法是什麼? JavaScript是否支持使用Class關鍵字創建類?

+0

問題提到它的mooTools類系統 – Jimmy 2008-12-11 23:40:05

1

它可能只是文件執行的順序。瀏覽器將按照它們加載的順序運行文件,而不一定按照它們包含的順序運行。測試這種情況的一種簡單方法是爲每個文件添加一行調試。

file1.js

alert("Loading File 1"); 
var collection = new Object(); 
collection.foo = new Array(1, 2, 3); 

file2.js

alert("Loading File 2"); 
// ... your code. 

如果顯示文件1之前的文件2,再有就是你的問題。我不確定是否有一種可靠的方法來避免這種情況,但我所做的是使用腳本將我的所有JavaScript文件打包成一個大文件 - 這樣您就可以確切瞭解所有內容的加載順序,無論如何。

+0

這是一個很好的方式來測試條件。 – StingyJack 2008-12-12 00:46:48

0

JS文件將阻止其他下載並導致用戶加載延遲。出於這個原因,儘可能在頁面底部粘貼腳本標籤。 請參閱here的「底部腳本」部分或here

可能發生的情況是,當JS已經準備好執行時,JS文件並沒有完全準備好。您需要考慮這些選項。

是否有任何理由這些文件不能整合? 您是否可以將內聯腳本(示例1 - index.HTML)封裝到函數中,並將該函數綁定到onload()事件?