2012-02-10 63 views
1

未定義這似乎是一個令人難以置信的簡單問題,但我不知道爲什麼我得到未定義。我使用jQuery從PHP腳本獲取數據 - 特別是PHP文件迴應的字符串。下面的代碼:

<script type="text/javascript"> 

    var map1; 

    $.get("script.php", function(data) 
    { 
     map1 = data; 
    }); 

    alert(map1); 

</script> 

現在,如果我警報(MAP1),它最終被不確定......究竟爲什麼是這樣?我想通過在$ .get之外聲明map1來解決問題,但事實並非如此。如果我在$ .get函數內部警告(map1),它會很好地結束,變量保存一個字符串(而不是未定義)。所以問題是... map1發生了什麼?我怎樣才能阻止它被定義/超出範圍/發生了什麼?

在此先感謝。

+1

Ajax是異步的。傳遞給'get'的函數在ajax響應返回時調用,而不是立即調用。 – ggreiner 2012-02-10 09:29:15

+0

我現在看到了...該死的,我應該看到了,這很明顯,它是異步的。我還修復了這個錯誤(我一直在強調這個錯誤超過了一個星期)。感謝你和其他人指出了這一點。 – Chrispy 2012-02-10 09:58:26

回答

3

正如@Michael所說的,.get調用是異步的,所以你的javascript正在執行這個調用,然後繼續執行你的腳本,這就是爲什麼你會得到一個undefined警報框。

你最好的選擇是放在一個success電話:

$.get("script.php", function(data) 
{ 
    map1 = data; 
}) 
.success(function() { alert(map1); }); 
+0

真棒 - 感謝您爲我提供成功電話,這是我一直在尋找的東西! – Chrispy 2012-02-10 09:58:46

4

因爲您的alertget完成之前執行。在賦值後放在函數體中。 get發起請求並返回。

1

因爲您的$.get填充數據比您的警報執行速度慢!
這意味着您的$.get函數需要比警報計算更長的時間!
您可以使用setTimeout()來解決這個問題,但我認爲這是一個不好的做法。

2

$.get異步運行,這就是爲什麼該函數的第二個參數是匿名函數。一旦$.get完成執行,就會調用這個匿名函數。立即調用alert(map1),而不是異步調用。您可以在alert調用添加到傳遞給$.get匿名函數:

$.get("script.php", function(data){ 
    map1 = data; 
    alert(map1); 
}); 
1

什麼做這種方式?

var map1; 

$.ajax({ 
      type: "GET", 
      url: "script.php", 
      async: true, 
      success : function(data) 
      { 
       map1 = data; 
       alert (data); 
      } 
});