2014-02-13 58 views
0

我不能得到以下問題。 我定義變量是這樣的:加載時未定義JavaScript變量;

<script type="text/javascript">var myVar;</script> 
<script type="text/javascript" src="/myScript.js"></script> 

myScript.js看起來是這樣的:

$(document).ready(function() { 
    myVar = new myClass(); 
    myVar.init(); 
}); 

,如果我嘗試訪問這樣的變量:

<div onclick="myVar.activate(x);">some content</div> 

一切工作正常,但如果我做

<img src="path" onload="myVar.activate(x);"/> 

我收到一條錯誤「myVar未定義」。我不明白。

<script type="text/javascript">var myVar;</script> 
    some DOM Elements 
<script type="text/javascript" src="/myScript.js"></script> 
<script type="text/javascript">myVar.activate(x);</script> 

不工作嗎?!?!!奇怪,不是嗎?

* X生成服務器端*

+0

這是錯誤的一段代碼,調用onload myVar.activate(x),但該函數是DOM內準備..不可能 –

+0

順便說一句onload主要用於像window.onload – shubendrak

+3

@Liam - 它可能。它可能不會。這取決於圖像加載的速度。 – Quentin

回答

1
$(document).ready(function(){ 
    // this function is executed after the entire document is ready, 
    // and it will fire after window.onload 
    myVar = new myClass(); 
    myVar.init(); 
}); 

在這裏,你正在嘗試同要訪問myVar的方法,但是您的.ready()函數尚未開啓,因此myVar尚未設置爲new myClass()。它仍然是一個undefined可變

<script type="text/javascript"> 
    myVar.activate(x); 
    // this script executes *before* the code inside your document ready function, 
    // so this is *before* you have set myVar = new myClass(); 
    var_dump(myVar); 
    // above should output 'undefined' 
</script> 

如果你真的需要/想調用這個方法在一個onload屬性,那麼你應該在你的內聯腳本設置myVarnew myClass(),像這樣:

<script type="text/javascript"> 
    var myVar = new myClass(); 
    myVar.init(); 
    myVar.activate(x); 
</script> 
+0

感謝提示與 Viktor

+0

@Viktor這有助於你解決你的問題嗎? – Bill

+0

還沒有。我必須找到另一種方式來讀取服務器端生成的var x jQuery – Viktor

0

沒有什麼可怕在這裏,你只是沒有在一個良好的時間聲明變量。在使用在線腳本時,必須在瀏覽器讀取DOM節點之前分配變量。

在您的代碼中,您已將DOM分配爲myVar,因此瀏覽器已經完成讀取DOM並拋出錯誤。

我現在的問題是,爲什麼在創建對象之前需要等待DOM準備好?肯定有一個解決辦法。

+2

沒有問題的是*聲明*的變量( 'var myVar')。問題是它有一個值賦給它的時間。 – Quentin

+0

@Quentin我的不好,我錯誤地解釋,謝謝! –

0

當你的HTML被完全呈現

$(document).ready(function() { 
    myVar = new myClass(); 
    myVar.init(); 
}); 

而且因爲它的下載和瀏覽器在HTML中添加下列儘可能快而被呈現,執行以下功能:

<img src="path" onload="myVar.activate(x);"/> 

所以myVar不能被定義,因爲當頁面呈現<img>時,ready()尚未被調用。 您的第二個示例的原因相同。 myVar是空

您應該刪除:

$(document).ready(function() ... 

,然後再試一次。

+0

我確實需要$(document).ready(function()來引起一些依賴於外部加載的腳本 – Viktor

+0

因此,您必須在這些外部加載的腳本之後加載/顯示HTML。 – alexmngn

0

爲什麼不能簡單地說,這取決於x是何宣佈,明明:

$(document).ready(function() { 
    myVar = new myClass(); 
    myVar.init(); 
    myVar.activate(x); 
}); 

的淨結果應該是沒有錯誤

+0

x由服務器端函數生成 – Viktor

1

如果您的代碼在文檔中準備好分配值myVar是絕對必要的,那麼處理此問題的更好方法是這樣的:

$(document).ready(function() { 
    myVar = new myClass(); 
    myVar.init(); 

    $("#idOfMyImage").load(function() { myVar.activate(x); }); 
}); 

這裏發生的情況是,只有在啓動了dom就緒事件並且myVar具有分配給它的值後,纔會附加load處理程序。如果圖像在文檔準備好觸發時已經加載,那麼這將立即執行,它沒有,它將在圖像加載時觸發。現在你已經消除了競爭條件,你的代碼依賴於這兩個事件觸發的順序(如果提供圖像的服務器速度足夠慢,提供數據,你的原始代碼可能已經工作 - 可能發生的事情是,你的圖像正在加載緩存由您的瀏覽器)。

作爲獎勵,您現在已經擺脫了內聯事件處理程序,它可以更好地將HTML與Javascript分離。

0

感謝比利馬修斯,我知道爲什麼它不工作。非常感謝你!

這是現在我是如何做到的(不乾淨,但工作!)

<script type="text/javascript" src="/myScript.js"></script> 

myScript.js看起來是這樣的:

$(document).ready(function() { 
var ServerGeneratedValue = $('myID').html(); 

var myVar = new myClass(); 
myVar.init(); 

myVar.activate($ServerGeneratedValue); 
}); 

非常感謝所有的答案!