无法从'XMLHttpRequest'读取'status'属性:对象的状态不能打开

时间:2013-11-19 17:07:53

标签: javascript

我尝试通过此代码检测页面状态是否为404:

var request = new XMLHttpRequest();  
    request.open('GET', 'http://xxxxxxxx.me/yossi/default.aspx', true);  
    request.send();  

    if (request.status === "404") {  
        alert("Oh no, it does not exist!");
    }  

我在浏览器控制台中遇到了这个最严重的错误:

  

Uncaught InvalidStateError:无法从'XMLHttpRequest'读取'status'属性:对象的状态不能打开。

任何线索是什么?

2 个答案:

答案 0 :(得分:2)

您正在以ASYNC request.open('GET', 'http://*****/yossi/default.aspx', true);(请求的true部分)打开连接。

这意味着进行了request.send();调用,立即继续执行您的程序。当您的程序继续处理下一行代码时,XMLHttpRequest在后台执行自己的工作并发出HTTP请求,因此当命中以下代码时,连接当前处于“打开”状态:

if (request.status === "404") {  
  alert("Oh no, it does not exist!");
}  

您有两个选择

  1. 使request.send();调用同步(vs async)。这是 NOT RECOMMENDED ,因为在您的请求返回之前,浏览器的用户界面将会冻结。
  2. 您需要在请求“state发生更改时添加回调。这是通过onreadystatechange变量的request属性完成的。在回调中,您可以检查状态,因为在请求完成之前,您甚至无法知道状态是否为“404”(或任何其他状态)。摘自http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp
  3. 的示例

    使用onreadystatechange回调的异步调用示例:

    request.onreadystatechange = function() {
      if (request.readyState==4 && xmlhttp.status==404) {
        alert("Oh no, it does not exist!");
      }
    }
    

答案 1 :(得分:1)

像这样制作你的if块:

if (request.readyState == 4 && request.status === 404) { ... }

您不会等到页面完成加载。您正在使用异步请求,但您处理它的方式使其同步。如果我是你,我会查找异步AJAX或尝试使用JQuery。

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest