从零开始掌握XMLHttpRequest的实战技巧与常见坑点解析

UX子晨 前端 阅读 2,214
赞 23 收藏
二维码
手机扫码查看
反馈

先看效果,再看代码

咱们直接上干货,先来个简单的例子,看看XMLHttpRequest到底是怎么工作的。这个例子就是一个基本的GET请求,从一个API获取数据然后展示在页面上。

从零开始掌握XMLHttpRequest的实战技巧与常见坑点解析

首先,我们需要创建一个XMLHttpRequest对象,然后设置一些属性,最后发送请求并处理响应。听起来挺复杂,但实际操作起来很简单。

// 创建一个新的XMLHttpRequest对象
const xhr = new XMLHttpRequest();

// 配置请求
xhr.open('GET', 'https://jztheme.com/api/data');

// 设置回调函数
xhr.onload = function() {
  if (xhr.status === 200) {
    // 请求成功,处理响应数据
    const data = JSON.parse(xhr.responseText);
    console.log(data);
  } else {
    // 请求失败,处理错误
    console.error('请求失败: ' + xhr.status);
  }
};

// 发送请求
xhr.send();

上面这段代码展示了如何使用XMLHttpRequest发起一个GET请求,并处理响应数据。简单吧?接下来我们来看看更多的用法和场景。

POST请求:提交表单数据

POST请求也是常用的,特别是在提交表单数据时。这里我写了个简单的例子,演示如何通过POST请求提交表单数据。

// 创建一个新的XMLHttpRequest对象
const xhr = new XMLHttpRequest();

// 配置请求
xhr.open('POST', 'https://jztheme.com/api/submit');

// 设置请求头
xhr.setRequestHeader('Content-Type', 'application/json');

// 设置回调函数
xhr.onload = function() {
  if (xhr.status === 200) {
    // 请求成功,处理响应数据
    const response = JSON.parse(xhr.responseText);
    console.log(response);
  } else {
    // 请求失败,处理错误
    console.error('请求失败: ' + xhr.status);
  }
};

// 准备要提交的数据
const formData = {
  name: '张三',
  email: 'zhangsan@example.com'
};

// 发送请求
xhr.send(JSON.stringify(formData));

这个例子展示了如何通过POST请求提交表单数据。记得设置请求头Content-Typeapplication/json,这样服务器才能正确解析你提交的数据。

踩坑提醒:这三点一定注意

在实际开发过程中,我踩过不少坑,这里总结一下常见的几个问题,希望对你有帮助。

  • 跨域问题: 如果你的请求是跨域的(比如前端域名和后端API不在同一个域名下),可能会遇到跨域问题。解决方法是在服务器端设置CORS(跨域资源共享)头,或者使用JSONP(不过JSONP只能用于GET请求)。亲测有效的方法是让后端同学帮你配置CORS头。
  • 请求超时: 默认情况下,XMLHttpRequest没有超时设置。如果请求一直不返回,前端会一直等待,用户体验非常差。建议你在发送请求前设置超时时间,比如:
// 设置超时时间为5秒
xhr.timeout = 5000;

// 设置超时回调函数
xhr.ontimeout = function() {
  console.error('请求超时');
};
  • 错误处理: 处理错误是必须的,否则一旦请求失败,用户可能完全不知道发生了什么。建议在onerror回调中处理错误情况,比如:
xhr.onerror = function() {
  console.error('请求出错');
};

高级技巧:监听请求进度

有时候,我们需要知道请求的进度,特别是在上传大文件时。XMLHttpRequest提供了一个onprogress事件,可以用来监听请求的进度。下面是一个例子:

// 创建一个新的XMLHttpRequest对象
const xhr = new XMLHttpRequest();

// 配置请求
xhr.open('POST', 'https://jztheme.com/api/upload');

// 设置请求头
xhr.setRequestHeader('Content-Type', 'multipart/form-data');

// 设置进度回调函数
xhr.upload.onprogress = function(event) {
  if (event.lengthComputable) {
    const percentComplete = (event.loaded / event.total) * 100;
    console.log(上传进度: ${percentComplete.toFixed(2)}%);
  }
};

// 设置完成回调函数
xhr.onload = function() {
  if (xhr.status === 200) {
    console.log('上传成功');
  } else {
    console.error('上传失败: ' + xhr.status);
  }
};

// 设置错误回调函数
xhr.onerror = function() {
  console.error('上传出错');
};

// 准备要上传的文件
const fileInput = document.querySelector('input[type="file"]');
const file = fileInput.files[0];

// 创建FormData对象
const formData = new FormData();
formData.append('file', file);

// 发送请求
xhr.send(formData);

这个例子展示了如何监听文件上传的进度。通过xhr.upload.onprogress事件,我们可以实时获取上传的进度,并在控制台中显示出来。

结尾:这个技术的拓展用法还有很多

以上就是我对XMLHttpRequest的一些实战经验分享。其实这个技术的拓展用法还有很多,比如异步加载图片、动态加载CSS等。后续我会继续分享这类博客,如果你有更好的实现方式或遇到什么问题,欢迎在评论区交流。

希望这篇博客对你有帮助,我们一起进步!

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论
A. 子晴
A. 子晴 Lv1
作者的学习思路很值得借鉴,我已经把它用到了自己的学习计划中,效果显著。
点赞 1
2026-03-04 23:25