Javascript 为什么警报没有';无法从XMLHttpRequest在http.onload中工作?

Javascript 为什么警报没有';无法从XMLHttpRequest在http.onload中工作?,javascript,ajax,http,if-statement,xmlhttprequest,Javascript,Ajax,Http,If Statement,Xmlhttprequest,为什么尽管它没有得到http.status==200,但它没有警报失败 您可以尝试使用以下方法捕获错误: const http = new XMLHttpRequest(); const url = 'http://192.168.1.10/'; http.open('get', url, false); http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); http.onload = funct

为什么尽管它没有得到http.status==200,但它没有警报失败


您可以尝试使用以下方法捕获错误:

const http = new XMLHttpRequest();
const url = 'http://192.168.1.10/';
http.open('get', url, false);
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
http.onload = function () {
    if(http.status === 200 || http.status == 0) {
         alert("succeed")
    } else {
          alert("failed")
    }
}
http.send();

摘自此处的文档:

更新:服务器可能处于脱机状态,并且希望在Ajax请求超时时重试

要“修复”此问题,可以将
http.send()
语句包装到
try-catch
块中,例如:

const http = new XMLHttpRequest();
const url = 'http://192.168.1.10/';
http.open('get', url, true);
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
http.setRequestHeader("Access-Control-Allow-Origin:", "*");
http.setRequestHeader("Access-Control-Allow-Methods", "GET,POST,PUT");
http.onreadystatechange = function (oEvent) {  
    if (http.readyState === 4) {  
        if (http.status === 200) {  
           console.log(http.responseText);
           alert("succeed");
        } else {  
           console.log("Error", http.statusText); 
           alert("failed");
        }  
    }  
}; 
http.send();
若捕获到“NetworkError”,则会检测到服务器脱机,并且可以稍后重试Ajax请求


这个问题有三个问题:

  • 根据错误屏幕截图(
    net::ERR\u CONNECTION\u TIMED\u OUT
    ),目标服务器(
    http://192.168.1.10/
    )没有响应。请检查是否可以访问

  • 在代码中,
    内容类型
    被定义为
    应用程序/x-www-form-urlencoded
    ,这意味着提交了表单。但是,Ajax请求是一个
    GET
    请求,没有任何数据发送逻辑。这是一个非常奇怪的组合,可以被浏览器或服务器端逻辑拒绝。如果您只想使用Ajax GET请求,则无需配置内容类型

  • XMLHttpRequest
    load
    事件(
    http.onload
    )是,请使用@Katie建议的
    onreadystatechange

  • 只需使用为这种情况而设计的功能。 但您可能需要使用异步请求(true)


    不,它不起作用“未捕获的DomeException:未能对“XMLHttpRequest”执行“发送”:未能加载“@KatieHey@Moooooon!”!我更新了代码-尝试一下,希望这次能成功!它仍然不起作用!!!!!!!和未捕获的TypeError:http.setHeader不是一个函数btw Allow Origin不是这种情况!!它现在可以工作了,我删除了这些行
    http.setHeader(“访问控制允许源代码:”,“*”);setHeader(“访问控制允许方法”、“GET、POST、PUT”)你能解释一下你添加了什么使它工作吗?如果请求失败,我现在如何让它在1秒后重试请求?我试图将完整的xmlhttp请求放入一个函数中,然后将其回调,在else部分我再次调用它,但我得到了这样一个“未捕获的DomeException:未能在“XMLHttpRequest”上执行“send”:未能加载192.168.1.10“代码,如果我有多个相互依赖的请求,我该如何处理!”!!你能试着使用
    https://www.google.com/
    而不是
    http://192.168.1.10/
    ,您是否尝试在此地址连接浏览器?它起作用了吗?@BenoitChassignol我是故意这么做的。。看看如果发生意外情况,else是否有效!!!但它不起作用,因为地址不存在,这不是服务器的响应,而是来自浏览器的错误,您没有状态返回。我是故意这么做的。。看看如果发生意外情况,else是否有效!!!但它没有。。。而http.onreadystatechange并没有带来什么不同!!你拥有192.168.1.10吗?它存在吗?如果是,它是否收到HTTP请求?这就是为什么您没有获得HTTP状态的原因。相反,您从浏览器中得到超时错误。是的,我希望它重试“如果发生意外情况”,就像超时错误一样。。。但是如果它不是http状态,那么它叫什么呢?这里什么都不调用<代码>http.onload根本不会触发,因为没有加载任何内容。有两种类型的“超时错误”:1。超时错误,因为浏览器无法连接到服务器。2.超时错误,因为服务器占用的时间太长(但服务器本身已连接)--您只能侦听第二种类型的超时错误。如果服务器本身不存在,则不会调用任何内容。
    ...
    try {
      http.send();
    } catch(e) {
      //e.name would be "NetworkError" if the server is offline.
      console.log(e);
    }
    
    const http = new XMLHttpRequest();
    const url = 'http://192.168.1.10/';
    http.open('get', url, true);
    http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    http.onload = function () {
        if(http.status === 200 || http.status == 0) {
             alert("succeed")
        }
    }
    http.onerror = function () {         
            alert("failed")
    };
        http.send();