Javascript XMLHttpRequest异步不工作,始终返回状态0
这是我从W3S学校拼凑的一个XMLHttpRequest示例Javascript XMLHttpRequest异步不工作,始终返回状态0,javascript,xmlhttprequest,Javascript,Xmlhttprequest,这是我从W3S学校拼凑的一个XMLHttpRequest示例 <html> <head> <script type="text/javascript"> function loadXMLDoc() { var T="nothing"; xmlhttp=new XMLHttpRequest(); xmlhttp.overrideMimeType('text/plain'); // don't sc xmlhttp.onreadystatech
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
var T="nothing";
xmlhttp=new XMLHttpRequest();
xmlhttp.overrideMimeType('text/plain'); // don't sc
xmlhttp.onreadystatechange=function()
{
alert ("rdystate: " + xmlhttp.readyState);
alert ("status: " + xmlhttp.status);
alert ("Text: " + xmlhttp.statusText);
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
T = xmlhttp.responseText;
}
}
xmlhttp.open("GET","SBL_PROBES.htm",true);
xmlhttp.send(null);
//T = xmlhttp.responseText;
alert(T);
}
</script>
</head>
<body>
<h2>Using the XMLHttpRequest object</h2>
<div id="myDiv"></div>
<button type="button" onclick="loadXMLDoc()">CHange Content</button>
</body>
</html>
到
联合国对该行发表评论
//T = xmlhttp.responseText;
将返回请求文件的文本
HTM和文件位于同一目录中。如果您尝试这样做,您还需要一个文件SBL_PROBES.htm,它的内容与此无关
我正在使用Firefox 3.6.22
这可能是一个跨域问题吗?如果是,为什么它作为同步请求工作?这是因为异步在请求返回之前返回。同步请求在请求返回后返回 试着在这里操纵你的逻辑
xmlhttp.onreadystatechange=function()
{
alert ("rdystate: " + xmlhttp.readyState);
alert ("status: " + xmlhttp.status);
alert ("Text: " + xmlhttp.statusText);
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
T = xmlhttp.responseText;
alert(T);
}
}
可以在if语句中使用函数。readystate更改为4时执行此函数
var handleResponse = function (status, response) {
alert(response)
}
var handleStateChange = function () {
switch (xmlhttp.readyState) {
case 0 : // UNINITIALIZED
case 1 : // LOADING
case 2 : // LOADED
case 3 : // INTERACTIVE
break;
case 4 : // COMPLETED
handleResponse(xmlhttp.status, xmlhttp.responseText);
break;
default: alert("error");
}
}
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=handleStateChange;
xmlhttp.open("GET","SBL_PROBES.htm",true);
xmlhttp.send(null);
您的旧代码执行了一个异步调用,并继续使用alert语句。此时T是空的
好的,我会解释一下整个过程的工作原理:
首先,我们定义两个回调函数,稍后在请求中调用它们,分别命名为handleResponse和handleStateChange
之后,我们创建一个对象,它表示XMLHttpRequest
var xmlhttp=new XMLHttpRequest();
这将生成如下对象(简化):
通过open(…)函数调用,可以为请求设置参数:
xmlhttp.open("GET","SBL_PROBES.htm",true);
这意味着,执行异步GET请求以获取页面SBL_PROBES.htm
然后调用send(…)函数,该函数将触发请求本身
我们为onreadystatechange注册了一个回调函数,可以想象,这实际上是一个eventHandler。每次状态更改时,都会调用此函数。(这与向表单中的onKeyUp事件注册回调函数相同,每次键向上时都会触发此回调:))
对您的问题感兴趣的唯一情况是状态4。因此,handleRequest回调函数仅在状态4中调用。此时您的请求实际上有一个结果,并进一步说明一个状态。(状态表示您的Web服务器返回了状态代码200=正常,404=未找到等)
这并不是ajax背后的全部魔力,但应该给你一个简单的概述,即幕后实际发生的事情。
在Web服务器上测试这一点很重要,不要使用file://进行测试
如果您需要更多详细信息,请告诉我。零状态出现有两个原因
<button type="button" onclick="loadXMLDoc(); return false;">CHange Content</button>
更改内容
在上面的代码中,当请求是异步的时,警报(T)总是什么也不说 我现在收到了对这个常见问题的良好响应。答复如下: 在为web开发时,这是一个非常常见的问题。有两种方法
我已经解决了使用异步XMLHttpRequest open语句时无法获得结果的问题。由于这个问题是我在使用谷歌时发现的第一个问题,下面是我如何解决它的: 如果使用表单中的按钮,请确保将其设置为type=“submit”和onclick=“return myFunction()”。在myFunction()中,确保返回false,而不是true!通过从函数返回true,您将重新加载页面,XML对象将消失。如果返回false,XML请求将获得完成所需的时间,onreadystatechange函数将运行
来源:Daniel A.White:很抱歉,我不明白,我们从来没有到达那里,因为xmlhttp.status始终为零。Alert为caps,改为Alert.:)我从未见过readyState=4且状态为非零的函数调用。一次一个问题。在HandlerResponse中,只需执行警报(“foo”),警报调用是否正确?只是现在不在乎现状。顺便说一句,你可以省略“SBL_PROBES.htm”。只需输入“/”并检查是否调用了警报。好的。我检查了status,只检查readyState==4。然后,handleStateChange中的警报显示带有正确内容的T。最后的另一个警报也熄灭了,上面的警报没有显示任何内容。那么,我如何等待请求完成呢?我对同步请求很满意,但想获得状态,看看事情是否成功。我可以通过同步请求获得状态吗?或者我需要异步请求来获取状态吗?您可以执行同步或异步调用。无论如何,两者都支持状态。但是“通常”您使用xmlhttp请求进行异步调用,因为您希望在“后台”中发生某些事情,并且在请求完成时调用函数。没有区别,状态始终为零。您是从服务器还是从硬盘[aka c:\file.html]运行此操作?如果是你的硬盘,你将永远看不到200。#2正在发生,回发正在终止活动的Ajax请求。。。好人!真牛#2.在我的头撞到地板上几天后。谢谢但有人能解释一下到底发生了什么吗?@epascarello我也想解释一下#2。为什么按钮会起作用
XMLHttpRequest { status=0, readyState=0, multipart=false, onreadystatechange=handleEvent()}
xmlhttp.open("GET","SBL_PROBES.htm",true);
<button type="button" onclick="loadXMLDoc(); return false;">CHange Content</button>