Ajax 返回变量时,文本未定义
我不确定这个问题是否与Ajax有关,或者与JavaScript的某些愚蠢之处有关,而我通常忽略了这些问题,但我有下面的脚本,其中fox.html只是纯文本,上面写着:“敏捷的棕色狐狸跳过了懒狗。” 上面的脚本可以很好地提醒fox.html onload的内容。但是,如果我更改脚本以便:Ajax 返回变量时,文本未定义,ajax,Ajax,我不确定这个问题是否与Ajax有关,或者与JavaScript的某些愚蠢之处有关,而我通常忽略了这些问题,但我有下面的脚本,其中fox.html只是纯文本,上面写着:“敏捷的棕色狐狸跳过了懒狗。” 上面的脚本可以很好地提醒fox.html onload的内容。但是,如果我更改脚本以便: { fox = xmlhttp.responseText; alert(fox); } 变成: { fox = xmlhttp.responseText; return fox; } 和警报(loadXMLD
{
fox = xmlhttp.responseText;
alert(fox);
}
变成:
{
fox = xmlhttp.responseText;
return fox;
}
和警报(loadXMLDoc());onload我得到“未定义”
我想知道为什么会这样。因为返回值在
xmlhttp.onreadystatechange
函数的范围内,而不是在loadXML函数的范围内。异步请求就是这样工作的,它们在后台运行,而代码已经在继续。当请求完成时,它调用一个函数,该函数通常在onreadystatechange
上设置
这么快的例子;在FunctionA中启动XMLHTTP请求,该请求在完成时调用onreadystatechange
函数,该函数使用responseText调用函数B
如果您想让代码等待响应,则需要使用同步请求-但是,这样做会使整个浏览器暂停,直到请求完成。因此,最好将您的代码调整为我在第一段中编写的代码 AJAX是异步的。因此,对警报的调用(loadXMLDoc())实际上没有返回任何内容
xmlhttp.onreadystatechange=function()
{
...
}
这将创建一个新函数并将其附加到xmlHTTP对象。当状态更改(触发事件)时,将执行此函数。它不会在loadXMLDoc()运行期间执行,而是在将来的某个时间执行。这样做是为了在web应用程序中保持可用性(事情不是等待完成)
从AJAX请求返回的数据必须在您创建的这个新函数中执行。您应该使用返回的信息更新页面的必要部分。它不能返回任何数据,实际上它可以返回它想要的所有数据,但是对这些信息什么也做不了
您还可以在其他地方定义新函数,并通过执行以下操作将其附加到onreadystatechange
事件处理程序:
function handler() { ... }
xhmlhttp.onreadystatechange = handler;
谢谢你的解释。但是,我不确定您将我的代码调整为您在第一段中编写的代码是什么意思。您在第一段中写了什么?他的意思是更改您创建并附加到
onreadystatechange
事件侦听器的函数,以处理返回的XML而不返回它。@Matt Ah得到了它。就像在我最初的示例中,我提醒响应而不是返回响应(显然做的不仅仅是提醒)。谢谢。嗯,我不确定我是否完全听懂了。您是说loadXMLDoc()在onreadystatechange函数执行之前完成,因为它设置为在客户端收到浏览器的响应后启动?但是,如何将onreadystatechange函数作为目标来返回值。。。或者在这种情况下这是不可能的,我只能让值更新页面上的某个内容,比如div?后面的语句是正确的,处理函数需要处理返回的数据。当涉及到范围时,可以说这是完全独立的。它包含从XML请求接收到的数据,以及对页面全局的所有内容,但仅此而已。是的,loadXMLDoc()
将在ajax完成之前返回<就JS而言,code>.statechange=handler与var a=5
没有什么不同,因此没有实际的处理过程。感谢您的澄清!
function handler() { ... }
xhmlhttp.onreadystatechange = handler;