AJAX 是什么?
AJAX(Asynchronous JavaScript and XML)是一种使用 JavaScript 在无需重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容的技术。它是创建异步 Web 应用的核心技术。
核心特点:
- 异步通信:浏览器在后台与服务器通信,用户无需等待
- 局部更新:只更新页面中需要变化的部分
- 无需插件:基于原生 JavaScript,无需额外插件
实现 AJAX 请求的几种方式
1. 使用原生 XMLHttpRequest(传统方式)
// 创建 XMLHttpRequest 对象
const xhr = new XMLHttpRequest();
// 配置请求
xhr.open('GET', 'https://api.example.com/data', true); // true 表示异步
// 设置请求头(可选)
xhr.setRequestHeader('Content-Type', 'application/json');
// 处理响应
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();
2. 使用 Fetch API(现代方式,推荐)
// GET 请求
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('网络响应不正常');
}
return response.json(); // 解析 JSON
})
.then(data => {
console.log('成功:', data);
})
.catch(error => {
console.error('错误:', error);
});
// POST 请求
fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: '张三',
age: 25
})
})
.then(response => response.json())
.then(data => console.log(data));
3. 使用 async/await(更简洁)
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTP 错误: ${response.status}`);
}
const data = await response.json();
console.log('数据:', data);
return data;
} catch (error) {
console.error('请求失败:', error);
}
}
// 调用
fetchData();
4. 使用 axios(第三方库,功能更强大)
// 首先需要引入 axios
// <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
// GET 请求
axios.get('https://api.example.com/data')
.then(response => {
console.log('数据:', response.data);
})
.catch(error => {
console.error('错误:', error);
});
// POST 请求
axios.post('https://api.example.com/data', {
name: '李四',
age: 30
})
.then(response => {
console.log('响应:', response.data);
});
完整的 AJAX 封装示例
class AjaxRequest {
constructor(baseURL = '') {
this.baseURL = baseURL;
}
async request(url, options = {}) {
const defaultOptions = {
headers: {
'Content-Type': 'application/json',
},
...options
};
try {
const response = await fetch(`${this.baseURL}${url}`, defaultOptions);
// 检查响应状态
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
// 根据内容类型解析响应
const contentType = response.headers.get('content-type');
let data;
if (contentType && contentType.includes('application/json')) {
data = await response.json();
} else {
data = await response.text();
}
return {
success: true,
data,
status: response.status,
headers: response.headers
};
} catch (error) {
console.error('AJAX 请求失败:', error);
return {
success: false,
error: error.message
};
}
}
get(url, params = {}) {
// 构建查询字符串
const queryString = new URLSearchParams(params).toString();
const fullUrl = queryString ? `${url}?${queryString}` : url;
return this.request(fullUrl, {
method: 'GET'
});
}
post(url, data = {}) {
return this.request(url, {
method: 'POST',
body: JSON.stringify(data)
});
}
put(url, data = {}) {
return this.request(url, {
method: 'PUT',
body: JSON.stringify(data)
});
}
delete(url) {
return this.request(url, {
method: 'DELETE'
});
}
}
// 使用示例
const api = new AjaxRequest('https://api.example.com');
// 获取数据
api.get('/users')
.then(result => {
if (result.success) {
console.log('用户数据:', result.data);
}
});
// 提交数据
api.post('/users', { name: '王五', age: 28 })
.then(result => {
if (result.success) {
console.log('创建成功:', result.data);
}
});
关键注意事项
- 跨域请求:需要服务器设置 CORS(跨源资源共享)头
- 错误处理:始终要处理可能的错误
- 超时设置:为长时间请求设置超时
- 安全性:验证和清理用户输入
- 取消请求:使用 AbortController 取消进行中的请求
现代 Web 开发中,推荐使用 Fetch API 或 axios,它们提供了更简洁的语法和更好的错误处理机制。