Javascript 无法读取';状态';来自'的属性;XMLHttpRequest';:对象';不能打开的状态

Javascript 无法读取';状态';来自'的属性;XMLHttpRequest';:对象';不能打开的状态,javascript,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!"); } 我

我尝试通过以下代码检测页面状态是否为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!");
    }  
我在浏览器控制台中遇到了一个最严重的错误:

未捕获的InvalidStateError:未能从“XMLHttpRequest”读取“status”属性:不能打开对象的状态


有什么线索吗?

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

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

if (request.status === "404") {  
  alert("Oh no, it does not exist!");
}  
你有两个选择
  • 发出
    请求。发送()调用同步(vs异步)。这是不推荐的,因为在呼叫过程中,浏览器的UI将冻结,直到您的请求返回
  • 您需要为请求的状态发生更改时添加回调。这是通过关闭
    请求
    变量的
    onreadystatechange
    属性来完成的。在回调中,您可以检查状态,因为直到请求完成后,您才能够知道状态是否为“404”(或任何其他状态)。从
  • 带有
    onreadystatechange
    回调的异步调用示例:

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

    使您的if块如下所示:

    if (request.readyState == 4 && request.status === 404) { ... }
    
    您不会等到页面加载完成。您使用的是异步请求,但您处理它的方式使其同步。如果我是你,我会查找异步AJAX或尝试使用JQuery


    您能等一个
    readystatechanged
    吗?例如,添加一个
    onreadstatechanged
    侦听器。它是onreadystatechange事件处理程序,而不是onreadystatechanged。如果我尝试您的建议,它确实会消除错误,但不会检测到404状态。。有没有可能是因为使用了readyState?我已经6个月没有编写过没有JQuery的AJAX了,但是你确定readyState是字符串吗?我链接到的文档指定它的数据类型是短的,我将编辑答案,这样它就不会像以前那样指定字符串。这样的回调?:xmlhttp.onreadystatechange=function(){…}是的,我在回答中添加了一些额外的代码,通过一个实际的示例更好地概括了这一点。不过,您需要进一步阅读关于这个和XMLHttpRequest的更多内容,以便更好地理解存在的就绪状态以及如何使用它们。我同意下面的@MaKR,您应该研究像jQuery这样的库,因为它处理得非常好,在这种情况下不能使用jQuery,所以我尝试使用JS来处理它。谢谢