You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XMLHttpRequest()和JavaScript捕获GET请求的404错误

解决XMLHttpRequest无法捕获404状态的问题

你的问题出在同步XMLHttpRequest的异常处理上:当请求遇到网络错误(比如跨域、DNS解析失败、服务器无法连接)时,同步请求会直接抛出DOMException,代码根本执行不到检查http.status的步骤;而且同步请求会阻塞主线程,是现代浏览器不推荐的写法。

修改方案(推荐异步请求)

改用异步请求,通过事件监听处理请求结果和错误,这样既能捕获404状态,也能处理网络层面的错误:

const imgURL = document.querySelectorAll('img');

imgURL.forEach(e => {
  const url = e.getAttribute('src');
  const http = new XMLHttpRequest();

  // 异步请求(第三个参数默认true,可省略)
  http.open('GET', url);

  // 请求完成后触发(无论成功或失败)
  http.addEventListener('load', () => {
    if (http.status === 404) {
      console.log('图片404错误:', url);
    } else if (http.status >= 200 && http.status < 300) {
      console.log('图片加载正常:', url);
    } else {
      console.log('其他HTTP错误:', http.status, url);
    }
  });

  // 处理网络错误(比如无法连接服务器、跨域)
  http.addEventListener('error', () => {
    console.log('网络请求失败,无法加载:', url);
  });

  http.send();
});

关键说明

  • 异步请求优势:不会阻塞页面主线程,符合现代浏览器的性能要求
  • load事件:用于获取HTTP响应状态,包括404、500等服务器返回的状态码
  • error事件:处理网络层面的错误,这类情况没有HTTP状态码(请求未到达服务器)

若必须使用同步请求(不推荐)

如果因特殊需求要保留同步请求,需要用try-catch包裹send()调用,捕获抛出的异常:

const imgURL = document.querySelectorAll('img');

imgURL.forEach(e => {
  const url = e.getAttribute('src');
  const http = new XMLHttpRequest();

  http.open('GET', url, false);
  
  try {
    http.send();
    if (http.status === 404) {
      console.log('You got an ERROR!');
    }
  } catch (err) {
    console.log('请求发送失败:', err.message);
  }
});

注意:同步请求会阻塞页面交互,在多数场景下不建议使用。

内容的提问来源于stack exchange,提问作者BraulioPortela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:45:49