jQuery AJAX 教程:从入门到精通

目录

  1. 什么是 AJAX?
  2. 为什么使用 jQuery 的 AJAX?
  3. 核心方法:$.ajax()
  4. 快捷方法:$.get(), $.post(), $.load()
  5. 处理服务器响应
  6. 发送数据到服务器
  7. 处理错误
  8. 实战案例:用户名实时验证
  9. 现代替代方案:Fetch API

什么是 AJAX?

AJAX (Asynchronous JavaScript and XML) 不是一种新的编程语言,而是一种使用现有技术组合的新方法

jquery ajax教程使用
(图片来源网络,侵删)
  • Asynchronous (异步): 可以在不重新加载整个网页的情况下,与服务器交换数据并更新网页的部分内容,这是它与传统表单提交最大的区别。
  • JavaScript: 通过 JavaScript 来执行操作。
  • And (和): 连接词。
  • XML (eXtensible Markup Language): 早期 AJAX 主要使用 XML 来交换数据,但现在,JSON 由于其更轻量、更易于解析,已经成为主流的数据交换格式。

AJAX 让网页可以“偷偷”地与服务器通信,获取数据,然后动态地更新页面内容,为用户提供流畅的体验。


为什么使用 jQuery 的 AJAX?

虽然我们可以使用原生的 JavaScript XMLHttpRequest 对象来实现 AJAX,但它代码冗长、兼容性处理复杂、回调函数嵌套容易造成“回调地狱”。

jQuery 封装了 XMLHttpRequest,提供了简洁、强大且跨浏览器兼容的 API,让 AJAX 操作变得异常简单。

优点:

jquery ajax教程使用
(图片来源网络,侵删)
  • 语法简洁:代码量大大减少。
  • 跨浏览器兼容:无需担心不同浏览器的兼容性问题。
  • 链式调用:可以更优雅地组织代码。
  • 丰富的快捷方法:针对常见场景提供了更简单的方法。

核心方法:$.ajax()

$.ajax() 是 jQuery 中最底层、功能最强大的 AJAX 方法,所有其他快捷方法(如 $.get, $.post)在内部都是通过调用它来实现的。

基本语法:

$.ajax({
  name1: value1,
  name2: value2,
  // ... 更多配置项
});

常用配置项:

配置项 类型/默认值 描述
url String 请求发送的 URL 地址。(必需)
method String ('GET') 请求方法,如 'GET', 'POST', 'PUT', 'DELETE'
data ObjectString 发送到服务器的数据,如果是对象,会自动转换为 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 请求超时时间(毫秒),如果超过这个时间请求未完成,则取消请求。

示例:

jquery ajax教程使用
(图片来源网络,侵删)
$.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 回调函数来捕获请求过程中可能发生的错误。

错误回调函数接收三个参数:

  1. jqXHR: jQuery 的 XMLHttpRequest 对象,包含错误信息。
  2. textStatus: 描述状态的字符串,如 "timeout", "error", "abort", "parsererror"
  3. 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 更为重要,在实际开发中,根据项目需求和技术栈选择最合适的工具。