jQuery AJAX 教程:从入门到精通
目录
- 什么是 AJAX?
- 为什么使用 jQuery 的 AJAX?
- 核心方法:
$.ajax() - 快捷方法:
$.get(),$.post(),$.load() - 处理服务器响应
- 发送数据到服务器
- 处理错误
- 实战案例:用户名实时验证
- 现代替代方案:Fetch API
什么是 AJAX?
AJAX (Asynchronous JavaScript and XML) 不是一种新的编程语言,而是一种使用现有技术组合的新方法。

- Asynchronous (异步): 可以在不重新加载整个网页的情况下,与服务器交换数据并更新网页的部分内容,这是它与传统表单提交最大的区别。
- JavaScript: 通过 JavaScript 来执行操作。
- And (和): 连接词。
- XML (eXtensible Markup Language): 早期 AJAX 主要使用 XML 来交换数据,但现在,JSON 由于其更轻量、更易于解析,已经成为主流的数据交换格式。
AJAX 让网页可以“偷偷”地与服务器通信,获取数据,然后动态地更新页面内容,为用户提供流畅的体验。
为什么使用 jQuery 的 AJAX?
虽然我们可以使用原生的 JavaScript XMLHttpRequest 对象来实现 AJAX,但它代码冗长、兼容性处理复杂、回调函数嵌套容易造成“回调地狱”。
jQuery 封装了 XMLHttpRequest,提供了简洁、强大且跨浏览器兼容的 API,让 AJAX 操作变得异常简单。
优点:

- 语法简洁:代码量大大减少。
- 跨浏览器兼容:无需担心不同浏览器的兼容性问题。
- 链式调用:可以更优雅地组织代码。
- 丰富的快捷方法:针对常见场景提供了更简单的方法。
核心方法:$.ajax()
$.ajax() 是 jQuery 中最底层、功能最强大的 AJAX 方法,所有其他快捷方法(如 $.get, $.post)在内部都是通过调用它来实现的。
基本语法:
$.ajax({
name1: value1,
name2: value2,
// ... 更多配置项
});
常用配置项:
| 配置项 | 类型/默认值 | 描述 |
|---|---|---|
url |
String |
请求发送的 URL 地址。(必需) |
method |
String ('GET') |
请求方法,如 'GET', 'POST', 'PUT', 'DELETE'。 |
data |
Object 或 String |
发送到服务器的数据,如果是对象,会自动转换为 URL 编码的字符串。 |
dataType |
String ('text') |
预期服务器返回的数据类型,常见值:'text', 'json', 'html', 'xml'。 |
success |
Function |
请求成功时的回调函数,接收返回的数据、状态文本和 jqXHR 对象。 |
error |
Function |
请求失败时的回调函数,接收 jqXHR 对象、状态文本和错误对象。 |
complete |
Function |
请求完成(无论成功或失败)时执行的回调函数。 |
async |
Boolean (true) |
是否异步执行,默认为 true,设为 false 将变为同步请求,会阻塞页面。 |
cache |
Boolean (true, for GET) |
是否缓存 GET 请求的结果,设为 false 可以防止缓存。 |
timeout |
Number |
请求超时时间(毫秒),如果超过这个时间请求未完成,则取消请求。 |
示例:

$.ajax({
url: 'https://api.example.com/data',
method: 'GET',
dataType: 'json',
success: function(response) {
console.log('请求成功!', response);
// 在这里处理返回的数据,并更新页面
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('请求失败!', textStatus, errorThrown);
// 在这里处理错误,例如显示错误信息
},
complete: function() {
console.log('请求完成!');
// 无论成功失败,都会执行,常用于关闭加载动画
}
});
快捷方法
对于最常见的 GET 和 POST 请求,jQuery 提供了更简洁的快捷方法。
$.get()
用于执行 GET 请求。
语法:
$.get(url, [data], [callback], [dataType]);
示例:
// 从服务器获取一个 HTML 片段并插入到 #result 元素中
$.get('fetch_content.html', function(data) {
$('#result').html(data);
});
// 发送数据并获取 JSON 响应
$.get('search.php', { keyword: 'jquery' }, function(response) {
console.log(response.results);
}, 'json');
$.post()
用于执行 POST 请求。
语法:
$.post(url, [data], [callback], [dataType]);
示例:
// 向服务器提交表单数据
$.post('submit.php',
{ username: 'john_doe', email: 'john@example.com' },
function(response) {
console.log('提交成功!服务器返回:', response);
},
'json'
);
$.load()
这是一个非常特殊的快捷方法,专门用于从服务器加载 HTML 片段并插入到 DOM 元素中。
语法:
$(selector).load(url, [data], [callback]);
强大之处: 可以在 URL 后面使用一个空格加上一个选择器,来只加载服务器返回 HTML 中的特定部分。
示例:
<!-- 假设服务器返回的 full_page.html 内容如下 -->
<div id="main-content">
<h1>页面标题</h1>
<div id="user-profile">
<p>用户名:张三</p>
<p>等级:VIP</p>
</div>
</div>
<!-- 我们只想加载 #user-profile 部分 -->
$('#profile-container').load('full_page.html #user-profile');
处理服务器响应
服务器返回的数据可以通过回调函数来处理。$.ajax() 的 success 回调和 $.get/$.post 的第二个回调函数都接收响应数据作为第一个参数。
dataType: 'json': 如果设置了dataType: 'json',jQuery 会自动将返回的 JSON 字符串解析成一个 JavaScript 对象,你直接使用即可。dataType: 'html': 返回纯 HTML 字符串,可以直接用.html()方法插入到页面中。dataType: 'text': 返回纯文本。
示例:
$.ajax({
url: 'get_user_info.php',
dataType: 'json',
success: function(user) {
// user 现在是一个 JavaScript 对象
$('#username').text(user.name);
$('#avatar').attr('src', user.avatar_url);
}
});
发送数据到服务器
通过 data 属性发送数据。
- GET 请求: 数据会被附加到 URL 的查询字符串中,如
url?name=John&age=30。 - POST 请求: 数据会被包含在请求体中,不会显示在 URL 中。
示例:
// GET 请求发送数据
$.get('search.php', { q: 'jquery ajax', page: 1 }, function(data) {
// ...
});
// POST 请求发送数据
$.post('api/create_user.php',
{
name: 'Peter',
email: 'peter@example.com',
is_active: true
},
function(response) {
// ...
}
);
处理错误**
健壮的应用必须能够处理错误,使用 error 回调函数来捕获请求过程中可能发生的错误。
错误回调函数接收三个参数:
jqXHR: jQuery 的 XMLHttpRequest 对象,包含错误信息。textStatus: 描述状态的字符串,如"timeout","error","abort","parsererror"。errorThrown: 抛出的异常对象(如果有)。
常见错误类型:
error: 请求失败,如 404 (Not Found) 或 500 (Server Error)。timeout: 请求超时。abort: 请求被手动取消。parsererror: 服务器返回的数据无法被解析(期望 JSON 但返回了 HTML)。
示例:
$.ajax({
url: 'a_non_existent_page.php',
success: function() {
console.log('这行不会执行');
},
error: function(jqXHR, textStatus, errorThrown) {
if (textStatus === 'timeout') {
alert('请求超时,请检查网络!');
} else if (textStatus === 'parsererror') {
alert('数据解析错误,服务器返回格式可能不正确。');
} else {
alert('发生错误: ' + textStatus + ', ' + errorThrown);
// 可以显示更友好的错误信息给用户
$('#error-message').text('抱歉,加载失败,请稍后重试。');
}
}
});
实战案例:用户名实时验证
这是一个非常经典的应用场景:当用户在注册表单中输入用户名时,页面立即向服务器发送请求,检查该用户名是否已被占用。
HTML 结构:
<form>
<div>
<label for="username">用户名:</label>
<input type="text" id="username" placeholder="请输入用户名">
<!-- 用于显示验证结果 -->
<span id="username-status"></span>
</div>
<button type="submit">注册</button>
</form>
jQuery 代码:
$(document).ready(function() {
$('#username').on('input', function() { // 当输入框内容发生变化时触发
var username = $(this).val().trim(); // 获取输入值并去除首尾空格
// 如果用户名为空,则不做任何操作
if (username === '') {
$('#username-status').text('');
return;
}
// 发送 AJAX 请求
$.ajax({
url: 'check_username.php', // 后端验证脚本
method: 'GET',
data: { username: username }, // 发送用户名
dataType: 'json',
success: function(response) {
if (response.exists) {
// 用户名已存在
$('#username-status').text('❌ 用户名已被占用').css('color', 'red');
} else {
// 用户名可用
$('#username-status').text('✅ 用户名可用').css('color', 'green');
}
},
error: function() {
$('#username-status').text('❌ 验证失败,请稍后重试').css('color', 'orange');
}
});
});
});
后端 check_username.php (伪代码):
<?php
// 假设我们有一个数据库连接
// $db = new PDO(...);
$username = $_GET['username'];
// 查询数据库
$stmt = $db->prepare("SELECT id FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
// 返回 JSON 响应
header('Content-Type: application/json');
if ($user) {
echo json_encode(['exists' => true]);
} else {
echo json_encode(['exists' => false]);
}
?>
现代替代方案:Fetch API
随着原生 JavaScript 的发展,Fetch API 已经成为现代 Web 开发中进行网络请求的标准,它基于 Promise,语法更现代,是 XMLHttpRequest 的替代品。
Fetch API 的优势:
- 基于 Promise,避免了回调地狱。
- 更简洁的语法。
- 支持流式处理,对大数据更友好。
- 是 Web 标准的一部分,不依赖任何库。
Fetch API 示例:
// 使用 Fetch API 实现 GET 请求
fetch('https://api.example.com/data')
.then(response => {
// 检查响应状态码
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
// 解析 JSON 数据
return response.json();
})
.then(data => {
console.log('请求成功!', data);
})
.catch(error => {
console.error('请求失败!', error);
});
// 使用 Fetch API 实现 POST 请求
fetch('https://api.example.com/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ name: 'Fetch User', age: 25 }),
})
.then(response => response.json())
.then(data => console.log('提交成功!', data))
.catch(error => console.error('提交失败!', error));
虽然 jQuery AJAX 依然非常有用,尤其是在维护旧项目或需要快速实现功能时,但对于新项目,特别是使用现代框架(如 Vue, React, Angular)的项目,强烈推荐使用 Fetch API。
| 特性 | jQuery AJAX | Fetch API |
|---|---|---|
| 兼容性 | 极好,兼容所有主流浏览器 | 现代浏览器,IE 不支持(可用 polyfill) |
| 语法 | 回调函数,简单直接 | 基于 Promise,更现代 |
| 依赖 | 需要 jQuery 库 | 原生 JavaScript,无依赖 |
| 功能 | 功能全面,封装了各种场景 | 功能强大,更底层,更灵活 |
| 推荐场景 | 旧项目维护、快速开发、需要兼容性 | 新项目、现代框架、追求最佳实践 |
通过这份教程,你应该已经掌握了 jQuery AJAX 的核心用法,理解其“异步”和“不刷新页面更新数据”的核心思想,比记住所有 API 更为重要,在实际开发中,根据项目需求和技术栈选择最合适的工具。
