return.Text在返回变量时是未定义的

时间:2010-05-26 16:25:55

标签: ajax

不确定问题是否与Ajax有关或者我一般都忽略了一些关于JavaScript的愚蠢行为,但是我有以下脚本,其中fox.html只是纯文本,上面写着:“快速的棕色狐狸跳过了懒狗。“ :

function loadXMLDoc()
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }

xmlhttp.open("GET","fox.html",true);
xmlhttp.send();

xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    fox = xmlhttp.responseText;
    alert(fox);
    }
  }

}

onload = loadXMLDoc;

上面的脚本警告fox.html onload的内容就好了。但是,如果我更改脚本以便:

{
fox = xmlhttp.responseText;
alert(fox);
}

变为:

{
fox = xmlhttp.responseText;
return fox;
}

和alert(loadXMLDoc()); onload我得到'undefined'。

我想知道为什么会这样。

2 个答案:

答案 0 :(得分:1)

因为返回属于xmlhttp.onreadystatechange函数的范围而不是loadXML函数。这是异步请求的工作方式,它们在代码已经存在的同时在后台运行。请求完成后,它会调用一个函数,该函数通常在onreadystatechange上设置。

如此迅速的例子;在FunctionA中,您启动XMLHTTP请求,该请求在完成时调用使用responseText调用FunctionB的onreadystatechange函数。

如果您希望代码等待响应,则需要使用同步请求 - 但是,这样做会使整个浏览器停止,直到请求完成。因此,最好将代码调整为我在第一段中所写的内容。

答案 1 :(得分:1)

AJAX是异步的。因此,您对alert(loadXMLDoc())的调用实际上并没有返回任何内容。

xmlhttp.onreadystatechange=function()
  {
  ...
  }

这将创建一个新函数并将其附加到xmlHTTP对象。当状态改变(事件被触发)时,执行该功能。它不会在loadXMLDoc()运行期间执行,而是在将来的某个时刻执行。这样做是为了保持Web应用程序的可用性(事情不是等待完成某些事情)。

在您创建的这个新功能中,必须对从您的AJAX请求返回的数据起作用。您应该使用返回的信息更新页面的必要部分。它无法返回任何数据,实际上它可以返回它想要的所有数据,但不会对该信息做任何事情。

您还可以在其他地方定义新函数,并通过执行以下操作将其附加到onreadystatechange事件处理程序:

function handler() { ... }

xhmlhttp.onreadystatechange = handler;