2013-07-04 153 views
-1

我使用jQuery實時獲取JSON數據,後來我將這些數據打印到屏幕上。當我從屏幕獲取數據並再次在屏幕上打印時,我會收到錯誤「未定義」。代碼:jQuery中未定義的變量錯誤

var yenile = setInterval(function() { 
    $.getJSON("ayarlar.asp",function(veri) { 
     $(".wfloodnum").html("Şu anki değer:" + veri.floodwarno); 
     $(".nfloodnum").html("Şu anki değer:" + veri.floodnum); 
    }); 
},100); 
var anlikwar = $(".wfloodnum").text().split(":")[1]; 
var anlikflood = $(".nfloodnum").text().split(":")[1]; 
alert(anlikflood); 

我該怎麼辦? 編輯:我無法訪問$ .getJSON函數中的這些變量的值。我需要這個函數的這些值的可訪問性。所以,我必須從$ .getJSON函數中定義變量。這就是爲什麼我試圖將.split()應用於屏幕上的文本。

+0

什麼時候/哪裏發生錯誤?請創建一個http://jsfiddle.net/演示。在您發佈的代碼中,似乎您正在設置內容之前嘗試訪問內容。但是,這不會產生錯誤。相關閱讀材料:[如何從AJAX調用返回響應?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call)。 –

+0

Ajax是異步的... –

回答

1

與您的代碼的問題是,由於異步調用的,你有沒有執行的順序可能是這樣的(當然也可以,因爲時間間隔和多次調用的getJSON的不同):

// 1. the call to setInterval is initiated (the function in it will not be called until the sequential instructions after setInterval are finished) 
var yenile = setInterval(function() {...}, 100); 
// 2 
var anlikwar = $(".wfloodnum").text().split(":")[1]; 
// 3 
var anlikflood = $(".nfloodnum").text().split(":")[1]; 
// 4 
alert(anlikflood); 

// 5. NOW COMES THE function given to setInterval 
$.getJSON("ayarlar.asp",function(veri) { ... }); 
// 6. now would come any other instructions in the function given to setInterval after the getJSON 
// 7. 
$(".wfloodnum").html("Şu anki değer:" + veri.floodwarno); 
// 8 
$(".nfloodnum").html("Şu anki değer:" + veri.floodnum); 

在上面的順序中,您看到在步驟2和3中,變量存在未定義,因爲您訪問的元素還沒有任何文本。或者,它有空字符串,拆分是由:,你得到數組[""],因此該數組中的索引1未定義。

您必須重新考慮代碼的結構。至少變量anlikwaranlikwar應該在之後分配JSON請求完成。

至少你coud做這樣的事情:

var anlikwar; 
var anlikflood; 

var yenile = setInterval(function() { 
    $.getJSON("ayarlar.asp",function(veri) { 
     $(".wfloodnum").html("Şu anki değer:" + veri.floodwarno); 
     $(".nfloodnum").html("Şu anki değer:" + veri.floodnum); 

     anlikwar = $(".wfloodnum").text().split(":")[1]; 
     // or simply: anlikwar = veri.floodwarno 
     anlikflood = $(".nfloodnum").text().split(":")[1]; 
     // or simply: anlikflood = veri.floodnum 
    }); 
},100); 

看起來你要監視的服務器上的東西。這看起來像一個WebSockets用例。根據您使用的服務器框架,您可以使用不同的Web套接字包。

+0

Gabriel,謝謝你的回覆。您在$ .getJSON函數中定義了該變量。但是,如果我這樣做,我不能訪問$ .getJSON函數中的這些變量的值。我需要這個函數的這些值的可訪問性。所以,我必須從$ .getJSON函數中定義變量。這就是爲什麼我試圖將.split()應用於屏幕上的文本。 – Lightsaber

+0

我在'getJSON'之外聲明瞭兩個變量,以防您在同一個腳本中需要它們。如果你在其他地方看不到它們,你將不得不從DOM元素中獲取它。無論如何,你必須確保你已經有了價值。 'if(anlikflood)alert(anlikflood);'或'if($(「.nfloodnum」).text())...做分割。 作爲一般的通知,通過從腳本中取出''Şuankideğer:''''

Şu anki değer: ...
'來避免分割。混合代碼('veri.floodnum')和內容(''Şuankideğer''')是一種糟糕的做法。 –