2012-12-31 104 views
1

我在這裏看到了這個問題的幾個版本,但沒有一個與我的問題看起來是一樣的,所以我想創建一個新的問題。我必須在這裏做一些非常愚蠢的事情,但在我的生活中,我無法發現它。Javascript全局變量不工作

我會與上下文開始,雖然不是特別相關:我jQuery的延遲加載與JS代碼,這意味着沒有我的代碼文件可以包含一個$(document).ready(...)電話,因爲「$」將是不確定的第一關。相反,我加入我的準備功能,以「全球」陣列,和jQuery負載異步後,我把所有這些功能有以下幾點:

function FireLoadEvents() { 
    while (OnLoadEvents.length > 0) { 
    var item = OnLoadEvents.splice(0,1); 
    item[0].ready(); 
    } 
} 

現在我的任何頁面組件,我可以使用以下方法來添加一個事件我想火的時候,jQuery是加載和文件實際上是準備:

<script language="text/javascript"> 
var OnLoadEvents = new Array(); 
</script> 

OnLoadEvents.push({ ready: function() { ... } }); 

我在我的模板在頭部的最頂部定義的變量

正如您所看到的,它在任何函數作用域之外,並且在被引用之前也被聲明。當自己進行測試時,此設置運行良好,但由於某種原因,當它添加到我的實際頁頭時,頁面後面的腳本標記無法將項添加到OnLoadEvents變量。例如,下面是一個PHP,包括服務器端被拉入我的模板,並增加這些線路到我的網頁正文:

<script type='text/javascript'> 
OnLoadEvents.push({ ready: function() { 
    if ($('.sponsor-link').length != 0) { 
    ... 
    } 
} }); 
</script> 

當我打在Chrome頁面,它報告在以下異常「推」線上面:

Uncaught ReferenceError: OnLoadEvents is not defined 

任何想法是怎麼回事?爲什麼OnLoadEvent會在我初始化它的幾行之後未定義?我會注意到,我也嘗試將OnLoadEvents定義爲window.OnLoadEvents

在此先感謝!

+0

爲什麼jQuery會異步加載?腳本通常按順序加載,因此您可以確保jQuery首先加載使用'.ready()'。你使用'async'或'defer'屬性嗎?你使用腳本加載器來加載jQuery? – Joseph

+0

樣式註釋:使用'var OnLoadEvents = [];'而不是'var OnLoadEvents = new Array();'參見:http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new -ya/ – User

+0

我認爲重要的部分是「如何」將這段代碼添加到頁面中。如果您通過innerHTML添加腳本,它將不會執行腳本。 – epascarello

回答

7

更改此:

<script language="text/javascript"> 

這樣:

<script> 

的Web瀏覽器不能識別language屬性的值,因此,不執行代碼。

現場演示:http://jsfiddle.net/gyhcM/2/

你不需要language屬性,也不是type屬性,如網絡瀏覽器在默認情況下承擔的JavaScript。

+0

這不會有所作爲。 epascarello

+2

@epascarello是的,它的確如此。看到這裏:http://jsfiddle.net/gyhcM/ –

+0

@epascarello不會在哪個操作系統上的瀏覽器版本有所作爲? :) –