2013-07-04 36 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''')是一种糟糕的做法。 –