Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript XMLHttpRequest异步不工作,始终返回状态0_Javascript_Xmlhttprequest - Fatal编程技术网

Javascript XMLHttpRequest异步不工作,始终返回状态0

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

这是我从W3S学校拼凑的一个XMLHttpRequest示例

<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://进行测试


如果您需要更多详细信息,请告诉我。

零状态出现有两个原因

  • 您正在运行文件协议
  • 当Ajax请求处于活动状态时,有东西正在发回页面
  • 我相信你在这里看到了#2。所以你需要取消按钮点击

    <button type="button" onclick="loadXMLDoc(); return false;">CHange Content</button>
    
    更改内容
    

    在上面的代码中,当请求是异步的时,警报(T)总是什么也不说

    我现在收到了对这个常见问题的良好响应。答复如下:

    在为web开发时,这是一个非常常见的问题。有两种方法

  • 第一种是使用JSONP,当您添加查询参数(“?callback=foo”)时,我们的API支持JSONP。这应该可以让您立即启动并运行,对于开发来说非常好,但是对于生产使用来说并不安全,因为用户可以访问您的API密钥
  • 第二种方法(这是我们在Forecast上使用的方法,也是生产的最佳方法)是在您自己的域上设置一个代理服务器,该服务器可以代表用户请求Forecast。这避开了浏览器的同源策略,阻止用户访问API密钥(可以存储在服务器端),还允许您根据需要使用请求缓存。(我们最喜欢的web服务器NGINX支持这种开箱即用的配置,非常容易配置。如果您需要一些示例配置,请告诉我们!)

  • 我已经解决了使用异步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>