news 2026/5/10 21:03:02

原生 AJAX 揭秘:如何使用 XHR 发起请求

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
原生 AJAX 揭秘:如何使用 XHR 发起请求

🚀 原生 AJAX 揭秘:如何使用 XHR 发起请求

🤔 什么是 XHR?

XMLHttpRequest是浏览器提供的一个内置对象,允许我们在后台与服务器交换数据。这意味着我们可以在不重新加载整个页面的情况下,更新网页的一部分。这就是著名的AJAX(Asynchronous JavaScript and XML) 技术的核心。

通俗比喻
如果把浏览器比作一家餐厅:

  • 传统页面刷新:你点完菜,必须离开餐厅,等厨房做好后,再重新进门坐下吃(整个页面重载)。
  • XHR (AJAX):你坐在座位上,派服务员(XHR 对象)去厨房催菜或加菜。菜做好了,服务员直接端到你桌上(局部更新),你不需要离开座位。

📂 目录

  1. 🛠️ 发起请求的标准五步法
  2. 💻 代码实战:GET 与 POST
  3. 📊 核心概念:readyState状态详解
  4. ⚠️ 常见陷阱与最佳实践
  5. 🔄 XHR vs Fetch:该选哪个?
  6. 💡 总结

1. 🛠️ 发起请求的标准五步法

使用 XHR 发起一个请求,通常遵循以下五个标准步骤。你可以把它当作一个模板来记忆。

第一步:创建对象

constxhr=newXMLHttpRequest();

第二步:配置请求

使用open()方法初始化请求。

// open(method, url, async)xhr.open('GET','https://api.example.com/data',true);
  • method: 请求类型 (GET,POST,PUT等)。
  • url: 请求地址。
  • async: 是否异步(默认为true强烈建议保持异步,否则会阻塞页面)。

第三步:设置回调(监听状态变化)

在发送之前,先告诉 XHR:“当状态改变时,该做什么”。

xhr.onreadystatechange=function(){// 处理逻辑写在这里};

第四步:发送请求

xhr.send();// GET 请求通常传 null 或不传// xhr.send(data); // POST 请求传入数据

第五步:处理响应

在回调函数中,检查状态码并获取数据。


2. 💻 代码实战:GET 与 POST

场景一:发起 GET 请求

constxhr=newXMLHttpRequest();// 1. 配置xhr.open('GET','https://jsonplaceholder.typicode.com/todos/1',true);// 2. 监听状态xhr.onreadystatechange=function(){// readyState === 4 表示请求完成// status === 200 表示 HTTP 成功if(xhr.readyState===4&&xhr.status===200){console.log('请求成功!');console.log(JSON.parse(xhr.responseText));// 解析 JSON 数据}elseif(xhr.readyState===4){console.error('请求失败,状态码:',xhr.status);}};// 3. 发送xhr.send();

场景二:发起 POST 请求(提交表单数据)

POST 请求通常需要设置请求头,并发送数据体。

constxhr=newXMLHttpRequest();// 1. 配置xhr.open('POST','https://jsonplaceholder.typicode.com/posts',true);// 2. 设置请求头(告诉服务器发送的是 JSON 格式)xhr.setRequestHeader('Content-Type','application/json;charset=UTF-8');// 3. 监听状态xhr.onreadystatechange=function(){if(xhr.readyState===4&&xhr.status===201){// 201 Createdconsole.log('创建成功!');console.log(JSON.parse(xhr.responseText));}};// 4. 发送数据constdata=JSON.stringify({title:'Foo',body:'Bar',userId:1});xhr.send(data);

3. 📊 核心概念:readyState状态详解

xhr.readyState是一个整数,表示请求当前的阶段。理解它是处理异步逻辑的关键。

状态常量含义说明
0UNSENT未初始化对象已创建,但未调用open()
1OPENED已打开已调用open(),但未调用send()
2HEADERS_RECEIVED头已接收已调用send(),且已接收到响应头
3LOADING加载中响应体正在下载中(responseText已有部分数据)
4DONE完成整个请求过程结束,数据接收完毕

重点
我们最关心的是readyState === 4。只有在这个状态下,xhr.responseText才是完整可用的。


4. ⚠️ 常见陷阱与最佳实践

❌ 陷阱 1:忘记检查 status

只判断readyState === 4是不够的。如果服务器返回 404 或 500,readyState也是 4,但请求实际上是失败的。

// ✅ 正确写法if(xhr.readyState===4){if(xhr.status>=200&&xhr.status<300){// 成功处理}else{// 错误处理}}

❌ 陷阱 2:回调地狱与代码冗余

如果有多个请求依赖,XHR 的嵌套回调会让代码难以维护(Callback Hell)。

✅ 最佳实践
在现代开发中,如果必须用原生 JS,建议将 XHR封装成 Promise,或者直接使用fetch

// 封装成 Promise 的简单示例functionrequest(url){returnnewPromise((resolve,reject)=>{constxhr=newXMLHttpRequest();xhr.open('GET',url);xhr.onload=()=>{if(xhr.status===200)resolve(JSON.parse(xhr.responseText));elsereject(newError(xhr.statusText));};xhr.onerror=()=>reject(newError('Network Error'));xhr.send();});}// 使用 async/await 调用,代码更清晰asyncfunctiongetData(){try{constdata=awaitrequest('https://api.example.com/data');console.log(data);}catch(error){console.error(error);}}

❌ 陷阱 3:跨域问题 (CORS)

XHR 同样受浏览器的同源策略限制。如果请求跨域接口,后端必须配置正确的 CORS 头(如Access-Control-Allow-Origin),否则前端会报错。


5. 🔄 XHR vs Fetch:该选哪个?

特性XMLHttpRequest(XHR)fetchAPI
出现时间古老 (IE5 时代)现代 (ES6+)
语法风格基于事件回调基于Promise
代码简洁度较繁琐简洁优雅
错误处理需手动检查 status网络错误才 reject,HTTP 错误需手动检查
进度监控✅ 原生支持 (onprogress)❌ 需借助 ReadableStream (较复杂)
兼容性✅ 极好 (包括 IE)❌ IE 不支持 (需 polyfill)

建议

  • 新项目:首选fetchaxios
  • 需要上传进度条:XHR 依然有优势,或者使用axios(底层基于 XHR)。
  • 维护老项目/兼容 IE:必须掌握 XHR。

💡 总结

步骤关键代码作用
1. 创建new XMLHttpRequest()实例化对象
2. 配置xhr.open('GET', url)设定方法和地址
3. 监听xhr.onreadystatechange绑定状态变化回调
4. 发送xhr.send(body)发出请求
5. 判断readyState === 4 && status === 200确认成功并处理数据

🚀 博主寄语
虽然fetch是未来,但XHR是过去和现在的桥梁。
理解 XHR 的工作原理,能让你更深入地理解 HTTP 请求的生命周期、异步编程模型以及浏览器的网络机制。

记住口诀
新建对象 Open 配,
监听状态别嫌累。
Send 发送等回应,
四二零零才到位。

希望这篇文档能帮你彻底搞懂 XHR 请求!如果有疑问,欢迎在评论区留言。👇

喜欢这篇文章吗?记得点赞、收藏、转发哦!❤️

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 20:52:25

3步精通DLSS Swapper:游戏性能优化终极指南

3步精通DLSS Swapper&#xff1a;游戏性能优化终极指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专业的游戏性能优化工具&#xff0c;专为管理NVIDIA DLSS、AMD FSR和Intel XeSS动态链接库文件…

作者头像 李华
网站建设 2026/5/10 20:42:07

高效解决OFD文件兼容性问题:Ofd2Pdf免费开源转换工具完全指南

高效解决OFD文件兼容性问题&#xff1a;Ofd2Pdf免费开源转换工具完全指南 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 你是否曾因收到OFD格式的电子发票而无法在手机或普通电脑上打开&#xff1f;…

作者头像 李华
网站建设 2026/5/10 20:35:53

如何快速完成OFD转PDF:开源工具Ofd2Pdf三步上手教程

如何快速完成OFD转PDF&#xff1a;开源工具Ofd2Pdf三步上手教程 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf OFD转PDF是许多中国用户在处理电子发票、政府公文和电子证照时经常遇到的需求。Ofd2Pd…

作者头像 李华
网站建设 2026/5/10 20:29:22

长期使用后回顾 Taotoken 在多模型聚合与统一计费上带来的便利

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用后回顾 Taotoken 在多模型聚合与统一计费上带来的便利 作为一名长期使用 Taotoken 平台的开发者&#xff0c;在超过半年的…

作者头像 李华
网站建设 2026/5/10 20:25:43

2026届必备的十大降AI率助手解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 现今&#xff0c;人工智能内容生成愈发普及&#xff0c;接着各类AI检测系统就出现了。这些检…

作者头像 李华