1. 什么是 AJAX?
AJAX(Asynchronous JavaScript and XML)是一种无需刷新页面即可与服务器交换数据的技术,核心特点:
- 异步通信:不阻塞页面交互
- 局部更新:只刷新部分页面内容
- 数据格式:现代多用 JSON(早期用 XML)
典型应用场景:
- 实时搜索(如百度输入时的联想词)
- 无限滚动(如微博动态加载)
- 表单提交(如注册时用户名查重)
2. AJAX 工作原理
3. 原生 JavaScript 实现 AJAX
(1) 创建 XMLHttpRequest 对象
let xhr = new XMLHttpRequest();
(2) 配置请求
xhr.open('GET', 'https://api.example.com/data', true); // true 表示异步
(3) 设置回调函数
xhr.onload = function() {
if (xhr.status >= 200 && xhr.status < 300) {
console.log(JSON.parse(xhr.responseText));
} else {
console.error('请求失败:', xhr.statusText);
}
};
xhr.onerror = function() {
console.error('网络错误');
};
(4) 发送请求
xhr.send();
(5) POST 请求示例(带数据)
xhr.open('POST', 'https://api.example.com/users', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({ name: "Alice", age: 25 }));
4. Fetch API(现代替代方案)
更简洁的 Promise-based API:
// GET 请求
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
// POST 请求
fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: "Bob" })
});
5. jQuery 实现 AJAX(简化版)
$.ajax({
url: 'https://api.example.com/data',
type: 'GET',
success: function(data) {
console.log(data);
},
error: function(error) {
console.error(error);
}
});
// 更简洁的写法
$.get('https://api.example.com/data', function(data) {
console.log(data);
});
6. 实际应用案例
(1) 实时搜索
document.getElementById('search').addEventListener('input', function(e) {
fetch(`/search?q=${e.target.value}`)
.then(res => res.json())
.then(results => {
document.getElementById('results').innerHTML =
results.map(item => `<li>${item}</li>`).join('');
});
});
(2) 表单异步提交
document.forms['register'].addEventListener('submit', function(e) {
e.preventDefault();
fetch('/register', {
method: 'POST',
body: new FormData(this)
}).then(response => {
if (response.ok) alert('注册成功!');
});
});
7. 关键注意事项
- 跨域问题:
- 解决方案:CORS(需服务器设置
Access-Control-Allow-Origin
)
Access-Control-Allow-Origin: *
- 解决方案:CORS(需服务器设置
- 错误处理:
- 始终检查
response.ok
或xhr.status
- 始终检查
- 性能优化:
- 使用防抖(debounce)技术避免频繁请求
let timer; input.addEventListener('input', () => { clearTimeout(timer); timer = setTimeout(() => { /* AJAX请求 */ }, 300); });
8. AJAX 调试技巧
- 浏览器开发者工具:
- Network 面板查看请求/响应
- 过滤 XHR 请求类型
- 在线测试工具:
- Postman
- httpbin.org(免费测试接口)
9. 现代替代方案
- Axios(推荐库):
axios.get('https://api.example.com/data') .then(response => console.log(response.data));
- WebSocket:适合实时双向通信(如聊天室)