不确定问题是否与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'。
我想知道为什么会这样。
答案 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;