jQuery 3 ajax().fail回调jqXHR status始终为0,如何正确获取状态码
你碰到的jqXHR.status始终为0的问题,本质是请求被浏览器前置拦截导致,和jQuery自身的fail回调实现无关。先澄清你看到的几个错误说法:
- jQuery 2.x/3.x版本没有废弃jqXHR对象,该对象是原生XMLHttpRequest的封装超集,status属性始终可用,不存在固定返回0的设定
- HTTP 2.0不会导致jqXHR对象为空,jQuery的ajax封装和HTTP协议版本无绑定关系
- 仅jsonp请求因为是通过script标签注入实现,无法获取完整HTTP状态码,你用的是普通json类型跨域请求,不存在这个限制
- 跨域场景只要CORS配置符合规范,完全可以正常获取HTTP状态码,status为0是跨域配置错误导致请求被拦截的典型表现
排查方向
- 优先检查浏览器控制台的CORS报错:你当前开启了
withCredentials: true,对应服务端的CORS响应头必须满足两个要求:Access-Control-Allow-Origin不能为通配符*,必须和请求源域名完全匹配;Access-Control-Allow-Credentials必须显式设为true。如果是带自定义头的非简单请求,还要确认OPTIONS预检请求返回正常(200/204状态码),且预检请求的CORS头配置也符合要求。一旦预检请求不通过,浏览器会直接终止请求,此时不管真实接口返回什么状态码,拿到的jqXHR.status都是0。 - 排查请求是否被第三方逻辑拦截:浏览器广告拦截/代理插件、前端全局请求拦截器、网络层的防火墙/代理规则都有可能截断请求,导致返回status为0。
- 确认你使用的jQuery版本是官方未修改版本:部分第三方精简/篡改的jQuery版本可能存在封装缺陷,导致属性读取异常。
fail回调获取状态码的标准实现(无废弃风险,符合jQuery官方规范)
$.ajax({ url: this.url, type: 'post', data: jsonsendobject, dataType: 'json', crossDomain: true, // 非外部Web应用测试模式下请注释此行 xhrFields: { withCredentials: true }, // 非外部Web应用测试模式下请注释此行 }).done(function(data, textStatus, jqXHR) { // 请求成功后执行对应逻辑 }).fail(function(jqXHR, textStatus, errorThrown) { // 先区分拦截类错误和服务端返回错误 if (jqXHR.status === 0) { // 此类为请求未完成(CORS拦截、网络中断、请求被插件拦截等),无服务端状态码 console.log('请求异常:', textStatus, errorThrown) } else { // 此处即可正常拿到服务端返回的HTTP状态码,可直接用于统一错误处理 const statusCode = jqXHR.status console.log('服务端错误状态码:', statusCode) // 你的统一错误逻辑 } });
你提到的statusCode配置是jQuery提供的另一种状态码处理方式,和fail回调的状态码读取互不冲突,fail回调中读取jqXHR.status是官方明确支持的标准用法,不存在废弃风险。
内容的提问来源于stack exchange,提问作者Benedikt
相关产品推荐
相关产品推荐

