Ajax入门

Ajax入门

_

一,什么是AJAX

AJAX 是 Asynchronous JavaScript and XML 的缩写,直译为“异步的 JavaScript 和 XML”。

  • 异步(Asynchronous):这是最核心的特性。指浏览器发送请求后,不必等待服务器响应,可以继续执行其他操作(如滚动、点击)。当服务器返回数据时,浏览器会通过回调函数来处理。
  • JavaScript:负责发起请求和处理服务器返回的数据。
  • XML:最初服务器返回的数据格式是 XML。但如今,JSON 已经几乎完全取代了 XML,因为它更轻量、更易解析。

简单来说,AJAX 是一种在网页不刷新的情况下,与服务器交换数据并更新部分页面内容的技术。

二,AJAX使用方式

2.1 三种主流实现方式

方式适用场景学习建议
Fetch API现代浏览器,项目首选⭐⭐⭐⭐⭐ 必学
Axios 库复杂项目,需拦截器/取消请求⭐⭐⭐⭐ 常用
XMLHttpRequest兼容老旧浏览器⭐⭐ 了解即可

好的,既然你已经了解了 AJAX 是什么,那我们来上手实际操作。我会从最基础的原生方式讲到现代最常用的方式,并附上可直接运行的代码示例。

2.2 Fetch API

这是浏览器原生支持的,基于 Promise,语法简洁。

GET 请求

// 获取用户列表
fetch('https://api.example.com/users')
  .then(response => {
    // 检查响应是否成功
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return response.json(); // 解析 JSON
  })
  .then(data => {
    console.log('用户数据:', data);
    // 在这里更新页面
    renderUserList(data);
  })
  .catch(error => {
    console.error('请求失败:', error);
    alert('加载失败,请稍后重试');
  });

// 模拟渲染函数
function renderUserList(users) {
  const list = document.getElementById('userList');
  list.innerHTML = users.map(u => `<li>${u.name}</li>`).join('');
}

POST 请求

// 提交新用户
const newUser = {
  name: '张三',
  email: 'zhangsan@example.com'
};

fetch('https://api.example.com/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    // 如需认证,加 Authorization 头
    // 'Authorization': 'Bearer your-token'
  },
  body: JSON.stringify(newUser) // 转成 JSON 字符串
})
.then(response => response.json())
.then(data => {
  console.log('创建成功:', data);
  // 刷新列表或跳转
})
.catch(error => console.error('提交失败:', error));

带参数的 GET 请求

// 方式1:直接拼接到 URL
const userId = 123;
fetch(`https://api.example.com/users/${userId}`)

// 方式2:使用 URLSearchParams(推荐,自动编码)
const params = new URLSearchParams({
  page: 1,
  limit: 10,
  keyword: '搜索词'
});
fetch(`https://api.example.com/users?${params}`)

2.2 Axios

需要先安装:npm install axios 或在 HTML 中用 CDN 引入。

<!-- 在 HTML 中引入 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

GET 请求

// GET 请求
axios.get('https://api.example.com/users', {
  params: {
    page: 1,
    limit: 10
  }
})
.then(response => {
  console.log('数据:', response.data); // Axios 自动解析 JSON
})
.catch(error => {
  console.error('错误:', error.response?.data || error.message);
});

POST 请求

// POST 请求(自动 JSON 序列化)
axios.post('https://api.example.com/users', {
  name: '李四',
  email: 'lisi@example.com'
})
.then(response => {
  console.log('创建成功:', response.data);
});

Axios 的独特优势

// 1. 拦截器(统一处理 token、错误)
axios.interceptors.request.use(config => {
  config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
  return config;
});

// 2. 并发请求
Promise.all([
  axios.get('/api/users'),
  axios.get('/api/posts')
]).then(([usersRes, postsRes]) => {
  console.log('用户和文章都加载完了');
});

// 3. 取消请求(防抖搜索场景)
const cancelToken = axios.CancelToken;
const source = cancelToken.source();
axios.get('/api/search', { cancelToken: source.token });
// 取消上次未完成的请求
source.cancel('取消请求');

2.3 XMLHttpRequest

这是最原始的方式,代码较繁琐,但部分老项目还在用。

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/users', true); // true=异步

// 监听状态变化
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4) { // 请求完成
    if (xhr.status === 200) {
      const data = JSON.parse(xhr.responseText);
      console.log('数据:', data);
    } else {
      console.error('请求失败:', xhr.status);
    }
  }
};

xhr.send();

三,常见问题

3.1 跨域问题怎么办?

  • 开发环境:配置代理(Vite/Webpack devServer)。
  • 生产环境:后端配置 CORS 头。
// 后端 Node.js 示例(Express)
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT');

3.2 如何处理错误?

// Fetch 最佳实践:统一错误处理
async function fetchData(url) {
  try {
    const res = await fetch(url);
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    return await res.json();
  } catch (err) {
    // 上报错误到监控系统
    console.error('API 错误:', err);
    // 显示用户友好的提示
    showToast('网络异常,请稍后重试');
    throw err; // 继续抛出,让调用方处理
  }
}
JS异步编程 2026-08-21
Fetch详解 2026-08-24

© 2026 日志记录