目录

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

什么是 AJAX?

AJAX (Asynchronous JavaScript and XML) 不是一门新的编程语言,而是一种使用现有技术组合、创建更好更快、更动态的网页应用的技术。

ajax教程 jquery
(图片来源网络,侵删)

核心思想: 在不重新加载整个网页的情况下,与服务器交换数据并更新网页的某一部分。

工作流程:

  1. 用户在网页上进行某个操作(如点击按钮)。
  2. JavaScript 创建一个 XMLHttpRequest 对象(jQuery 在背后帮我们做了)。
  3. 该对象向 Web 服务器发送一个异步请求。
  4. 服务器处理请求,并返回数据(通常是 JSON 或 XML 格式)。
  5. 浏览器接收数据,并由 JavaScript 动态更新网页内容。

结果: 页面响应更快,用户体验更流畅,感觉就像一个桌面应用程序。


为什么使用 jQuery 处理 AJAX?

虽然原生 JavaScript 也可以实现 AJAX,但使用 jQuery 有巨大优势:

  • 语法简洁: jQuery 将复杂的原生 XMLHttpRequest 对象封装成简单易用的方法。
  • 跨浏览器兼容: 你无需担心不同浏览器(如 IE, Chrome, Firefox)之间的兼容性问题,jQuery 已经帮你处理好了。
  • 链式调用: 可以像搭积木一样组合不同的操作。
  • 丰富的回调函数: 方便地在请求的不同阶段(成功、失败、完成)执行代码。
  • 便捷的工具函数:$.get()$.post(),让常见操作一行代码搞定。

核心方法:$.ajax()

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

基本语法:

$.ajax({
  url: "请求的URL地址",
  method: "请求方法", // GET 或 POST
  data: { /* 要发送的数据 */ },
  dataType: "服务器返回的数据类型", // 如 "json", "html", "text"
  success: function(response) {
    // 请求成功后执行的回调函数
    // response 是服务器返回的数据
  },
  error: function(xhr, status, error) {
    // 请求失败后执行的回调函数
    // xhr: XMLHttpRequest 对象
    // status: 错误状态
    // error: 错误信息
  },
  complete: function(xhr, status) {
    // 请求完成后执行的回调函数(无论成功或失败)
  }
});

快捷方法:$.get()$.post()

对于最常见的 GET 和 POST 请求,jQuery 提供了更简单的快捷方法。

$.get(): 用于发送 GET 请求

GET 请求通常用于从服务器获取数据,数据会附加在 URL 后面。

语法: $.get(url, data, success(response, status, xhr), dataType);

示例:

$.get(
  "api/users",       // URL
  { page: 1, limit: 10 }, // 发送到服务器的数据 (会拼接到 URL 后面)
  function(data) {   // 成功回调
    console.log("获取用户数据成功:", data);
  },
  "json"            // 期望返回的数据类型
);

$.post(): 用于发送 POST 请求

POST 请求通常用于向服务器提交数据,数据在请求体中发送,更安全,且可以发送更大的数据。

语法: $.post(url, data, success(response, status, xhr), dataType);

示例:

$.post(
  "api/users",        // URL
  { name: "张三", email: "zhangsan@example.com" }, // 要发送的数据
  function(response) { // 成功回调
    console.log("用户创建成功:", response);
  },
  "json"              // 期望返回的数据类型
);

实战案例:动态加载用户列表

让我们通过一个完整的例子来学习,假设我们有一个按钮,点击后从服务器加载用户列表并显示在页面上。

准备:

  1. HTML (index.html):

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <title>jQuery AJAX 示例</title>
      <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
      <style>
        body { font-family: sans-serif; }
        #user-list { list-style-type: none; padding: 0; }
        #user-list li { background: #f4f4f4; margin: 5px 0; padding: 10px; border-radius: 5px; }
        button { padding: 10px 15px; font-size: 16px; cursor: pointer; }
        .loading { color: #888; }
      </style>
    </head>
    <body>
      <h1>用户列表</h1>
      <button id="load-users">加载用户</button>
      <ul id="user-list"></ul>
      <div id="message"></div>
      <script src="app.js"></script>
    </body>
    </html>
  2. 模拟后端服务 (server.js): 为了演示,我们使用一个简单的 Node.js + Express 服务器来提供模拟数据,如果你没有 Node.js 环境,可以直接使用一个静态的 JSON 文件或在线 API。

    # 1. 安装 Express
    npm install express
    # 2. 创建 server.js 文件
    // server.js
    const express = require('express');
    const app = express();
    const port = 3000;
    // 模拟用户数据
    const users = [
      { id: 1, name: '李雷', email: 'lilei@example.com' },
      { id: 2, name: '韩梅梅', email: 'hanmeimei@example.com' },
      { id: 3, name: '王伟', email: 'wangwei@example.com' }
    ];
    app.get('/api/users', (req, res) => {
      // 模拟网络延迟
      setTimeout(() => {
        res.json(users);
      }, 1000);
    });
    app.listen(port, () => {
      console.log(`服务器运行在 http://localhost:${port}`);
    });

    运行服务器:node server.js

  3. 前端 JavaScript (app.js): 这是核心的 AJAX 逻辑。

    $(document).ready(function() {
      // 当点击按钮时
      $('#load-users').on('click', function() {
        const $button = $(this);
        const $userList = $('#user-list');
        const $message = $('#message');
        // 禁用按钮,防止重复点击
        $button.prop('disabled', true);
        $message.text('').removeClass('error').addClass('loading');
        // 使用 $.get() 发送 AJAX 请求
        $.get('http://localhost:3000/api/users', function(data) {
          // 请求成功
          $userList.empty(); // 清空列表
          $message.text('加载成功!');
          // 遍历返回的数据并添加到列表中
          $.each(data, function(index, user) {
            $userList.append(`<li>ID: ${user.id} - 姓名: ${user.name} - 邮箱: ${user.email}</li>`);
          });
        }).fail(function(xhr, status, error) {
          // 请求失败
          $message.text('加载失败: ' + error).addClass('error');
          console.error("AJAX Error:", status, error);
        }).always(function() {
          // 无论成功失败,都会执行
          $button.prop('disabled', false); // 重新启用按钮
        });
      });
    });

运行流程:

  1. 点击“加载用户”按钮。
  2. $.get()http://localhost:3000/api/users 发送请求。
  3. 服务器响应,返回 JSON 格式的用户数组。
  4. success 回调函数被触发,数据被解析为 JavaScript 对象。
  5. 使用 $.each 遍历用户数组,动态生成 <li> 元素并添加到 <ul> 中。
  6. fail 回调用于处理请求失败的情况(服务器宕机或 URL 错误)。
  7. always 回调确保按钮在请求结束后被重新启用。

处理服务器响应

服务器返回的数据类型由 dataType 选项或 jQuery 的智能猜测决定。

  • "json": 如果返回的是 application/json,jQuery 会自动将响应字符串解析为 JavaScript 对象,这是最常用的类型。
  • "text": 直接返回原始字符串。
  • "html": 返回 HTML 片段,可以直接插入到 DOM 中。
  • "script": 返回 JavaScript 代码,并自动执行。

示例:

$.get("api/data.php", { id: 123 }, function(html) {
  // 假设 dataType 是 "html",或者服务器返回的是 HTML
  $('#result-container').html(html);
}, "html");

发送数据到服务器

除了在 URL 中传递数据(GET),你还可以通过 data 选项发送数据。

GET 请求 (数据在 URL 中):

$.get("api/search", { query: "jquery", page: 1 });
// 实际请求 URL: /api/search?query=jquery&page=1

POST 请求 (数据在请求体中):

$.post("api/submit-form", {
  username: "john_doe",
  password: "123456"
}, function(response) {
  console.log("表单提交成功:", response);
});

处理错误**

使用 fail 回调(或 error 回调,在 $.ajax 中)来捕获和处理错误。

常见错误原因:

  • URL 错误:404 Not Found。
  • 网络问题:服务器无响应。
  • 服务器内部错误:500 Internal Server Error。
  • 跨域问题:浏览器的同源策略阻止了请求(需要服务器配置 CORS)。

示例:

$.ajax({
  url: "/api/non-existent-endpoint",
  method: "GET",
  success: function(data) {
    console.log(data);
  },
  error: function(xhr, status, error) {
    // xhr.status 可以获取 HTTP 状态码
    if (xhr.status === 404) {
      alert("请求的资源不存在!");
    } else {
      alert("发生错误: " + error);
    }
  }
});

现代替代方案:Fetch API

虽然 jQuery 依然强大,但在现代前端开发中,浏览器内置的 Fetch API 已经成为新的标准,它基于 Promise,语法更现代,是学习原生 JavaScript 的重要一环。

Fetch API 示例 (对比 jQuery):

// --- jQuery AJAX ---
$.get('/api/data', function(data) {
  console.log(data);
});
// --- Fetch API ---
fetch('/api/data')
  .then(response => {
    // 检查响应是否成功
    if (!response.ok) {
      throw new Error('网络响应不正常');
    }
    // 将响应体解析为 JSON
    return response.json();
  })
  .then(data => {
    // 获取到最终的 JSON 数据
    console.log(data);
  })
  .catch(error => {
    // 捕获网络错误或解析错误
    console.error('Fetch 错误:', error);
  });

Fetch 的优点:

  • 原生支持,无需引入库。
  • 基于 Promise,更符合现代异步编程模式。
  • 更灵活,可以轻松处理流式数据。

Fetch 的缺点:

  • 对旧浏览器(如 IE11)支持不佳。
  • 错误处理机制不同(只有网络错误会进入 catch,HTTP 404/500 不会)。
  • 默认不发送 cookies,需要配置。

特性 jQuery AJAX Fetch API
兼容性 极好,支持所有主流浏览器,包括旧版 IE。 现代浏览器,IE 不支持。
语法 回调函数风格,简洁直观。 基于 Promise,链式调用,更现代。
依赖 需要 jQuery 库。 浏览器内置,无依赖。
错误处理 fail 回调统一处理所有错误。 只捕获网络错误,需手动检查 response.ok
功能 功能强大,封装了常用场景。 功能灵活,是底层 API。

学习建议:

  1. 对于初学者或维护旧项目: jQuery AJAX 是一个非常好的起点,它能让你快速理解 AJAX 的核心概念,而不会被底层细节困扰。
  2. 对于现代前端开发: Fetch API 是必须掌握的技能,它更轻量、更强大,是未来趋势,建议在掌握 jQuery AJAX 后,积极学习和使用 Fetch API。

希望这份详细的教程能帮助你彻底理解并掌握 jQuery AJAX!