6,997字
30–44 分钟

概览

目录

jQuery Ajax 是一套用于执行异步HTTP请求(Ajax)的强大工具集,其核心是 $.ajax() 方法。该方法作为所有便捷Ajax方法(如 $.get()$.post())的基础,提供了一个灵活且可配置的接口,用于与服务器交换数据并更新页面部分内容,而无需重新加载整个页面。本章节将深入解析 $.ajax() 的语法、核心配置项、回调函数以及如何处理不同的数据类型,旨在全面展现 jQuery交互 中这一关键技术的原理与应用。

$.ajax():核心方法

$.ajax() 是 jQuery 中所有 Ajax 操作的基础。它执行一个异步的HTTP(Ajax)请求,通过一个单一的设置对象进行配置,提供了对请求细节的完全控制。

语法

jQuery.ajax( [settings ] )
  • settings:一个选项对象,用于配置 Ajax 请求。包含url、method、data、callback等关键属性。所有设置都是可选的,默认值在 jQuery.ajaxSetup() 中定义。

常用配置项

$.ajax() 方法接受一个包含大量键值对的对象,以定义请求的行为。以下列举了最常用的一些配置项。

配置项类型描述
urlString发送请求的地址。
method / typeStringHTTP 请求方法 (例如: "POST", "GET", "PUT", "DELETE")。默认: "GET"
dataPlainObject / String / Array发送到服务器的数据。如果是对象,jQuery 会将其转换为查询字符串(除非 processData 设为 false)。
dataTypeString期望从服务器返回的数据类型。如果不指定,jQuery 会智能判断。常见值:"xml", "html", "script", "json", "jsonp", "text"
contentTypeString发送信息至服务器时内容编码类型。默认: "application/x-www-form-urlencoded; charset=UTF-8"
headersPlainObject一个对象,包含要随请求一起发送的额外头键/值对。
asyncBoolean默认值 true。是否执行异步请求。同步请求已不推荐使用。
cacheBoolean默认值 truedataType'script''jsonp' 时默认为 false。是否缓存请求结果。
processDataBoolean默认值 true。默认情况下,传入的 data 选项如果是对象,会被转换为查询字符串。如果想发送其他类型(如 FormDataDocument),需设为 false
crossDomainBoolean默认值,同域请求为 false,跨域请求为 true。如果你想在同一域上强制执行跨域请求(如 JSONP),请设置为 true
xhrFunction用于创建 XMLHttpRequest 对象的回调。
username, passwordString用于响应 HTTP 访问认证请求的用户名和密码。

回调函数

$.ajax() 返回一个 jqXHR 对象,该对象实现了 Promise 接口,允许链式绑定回调函数。也可以在设置对象中直接定义回调。

回调方法 (Promise风格)设置对象属性描述
.done()success请求成功完成后调用。函数接收三个参数:返回的数据、状态描述字符串、jqXHR 对象。
.fail()error请求失败时调用。函数接收三个参数:jqXHR 对象、错误描述字符串、可选的异常对象(如果发生了错误)。
.always()complete请求完成后(无论成功或失败)调用。函数接收两个参数:jqXHR 对象、状态描述字符串。

示例:基础 GET 请求

以下示例展示了如何使用 $.ajax() 发起一个简单的 GET 请求,获取一段文本并显示在页面上。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>$.ajax() 基础示例 - GET</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
</head>
<body>
    <button id="loadData">加载数据</button>
    <div id="result" style="border:1px solid #ccc; padding:10px; margin-top:10px;"></div>

    <script>
        $('#loadData').on('click', function() {
            var $resultDiv = $('#result');
            $resultDiv.text('加载中...');

            $.ajax({
                url: 'https://api.github.com/repos/jquery/jquery/issues', // 示例API
                method: 'GET',
                dataType: 'json', // 期望返回JSON
                success: function(data) {
                    var firstIssue = data[0];
                    $resultDiv.html('首个Issue标题: <strong>' + firstIssue.title + '</strong>');
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    $resultDiv.text('请求失败: ' + textStatus);
                }
            });
        });
    </script>
</body>
</html>

在这个示例中,点击按钮后,$.ajax() 被调用,向 GitHub API 发起一个 GET 请求。请求成功后,success 回调被触发,将获取到的数据中的第一个 issue 标题显示在页面上。如果请求失败,error 回调会显示错误信息。这体现了 jQuery Ajax 在处理异步 jQuery交互 时的核心模式。

dataType 与数据处理

dataType 选项告知 jQuery 期望从服务器返回什么样的数据。jQuery 会尝试根据这个值来解析返回的数据。理解这一点对于正确处理服务器响应至关重要。

  • "json":将响应解析为 JSON 对象。这是最常见的数据格式。如果解析失败,error 回调会被触发。
  • "html":将响应解析为纯文本 HTML。通常用于直接插入到 DOM 元素中。
  • "xml":将响应解析为 XML 文档,可以使用 jQuery 的遍历方法(如 .find())进行处理。
  • "text":将响应作为纯文本字符串返回,不进行任何解析。
  • "script":将响应作为 JavaScript 执行,并将其视为纯文本返回。
  • "jsonp":以 JSONP 形式发起请求,用于跨域请求。jQuery 会自动在 URL 中添加一个回调函数参数。

示例:处理 JSON 和 HTML 数据

以下示例展示了如何根据 dataType 分别处理来自不同 API 的 JSON 和 HTML 响应。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>$.ajax() dataType 示例</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
</head>
<body>
    <button id="getJson">获取用户 (JSON)</button>
    <button id="getHtml">获取片段 (HTML)</button>
    <div id="output" style="border:1px solid #aaa; padding:15px; margin-top:15px;"></div>

    <script>
        var $output = $('#output');

        $('#getJson').on('click', function() {
            $.ajax({
                url: 'https://jsonplaceholder.typicode.com/users/1',
                method: 'GET',
                dataType: 'json',
                success: function(user) {
                    var html = '<h3>' + user.name + '</h3>' +
                               '<p>邮箱: ' + user.email + '</p>' +
                               '<p>电话: ' + user.phone + '</p>';
                    $output.html(html);
                },
                error: function() {
                    $output.text('JSON 请求失败');
                }
            });
        });

        $('#getHtml').on('click', function() {
            // 假设服务器返回一段 HTML 片段,例如 <p><strong>Hello</strong> from server!</p>
            // 这里用一个模拟请求来演示,实际应用中应指向真实返回HTML的端点
            $.ajax({
                url: '/api/html-content', // 示例URL
                method: 'GET',
                dataType: 'html',
                success: function(htmlContent) {
                    $output.html(htmlContent); // 直接将HTML插入
                },
                error: function() {
                    $output.html('<p style="color:red;">HTML 片段加载失败</p>');
                }
            });
        });
    </script>
</body>
</html>

此示例清晰地表明,通过设定 dataType,jQuery 会自动处理响应内容。对于 JSON 数据,可以像操作普通 JavaScript 对象一样访问其属性;对于 HTML 数据,则可以将其直接插入 DOM。这种灵活性是 jQuery Ajax 简化 jQuery交互 开发的重要体现。

全局 Ajax 事件与默认设置

jQuery 提供了一组全局 Ajax 事件处理函数,可以在页面中的任何 Ajax 请求生命周期中触发,非常适合显示加载指示器或处理全局错误。同时,$.ajaxSetup() 可以用来为所有后续的 Ajax 请求设置默认值。

全局事件

全局事件可以在任何 Ajax 请求开始时、结束时、成功时等阶段被触发。它们需要绑定到特定的 DOM 元素上,通常是 document

  • $(document).ajaxStart(handler):当第一个 Ajax 请求开始时触发。
  • $(document).ajaxStop(handler):当所有 Ajax 请求都完成时触发。
  • $(document).ajaxSend(handler):在每个 Ajax 请求发送之前触发。
  • $(document).ajaxSuccess(handler):在每个 Ajax 请求成功完成后触发。
  • $(document).ajaxError(handler):在每个 Ajax 请求失败时触发。
  • $(document).ajaxComplete(handler):在每个 Ajax 请求完成(无论成功或失败)时触发。

$.ajaxSetup()

此方法用于设置全局默认的 Ajax 选项。但需注意,其影响范围广,在大型项目中需谨慎使用,以避免意外地影响其他模块。

语法

jQuery.ajaxSetup( settings )
  • settings:一个对象,其属性定义了后续所有 $.ajax() 调用的默认选项。

示例:全局加载指示器与默认配置

以下示例展示了如何利用全局事件显示和隐藏一个全局的加载动画,并通过 $.ajaxSetup() 设置一个通用的基础 URL 和错误处理。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>全局 Ajax 事件与 $.ajaxSetup 示例</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <style>
        #loading-indicator { display: none; position: fixed; top: 10px; right: 10px; background: #f0f0f0; padding: 5px; border: 1px solid #ccc; }
    </style>
</head>
<body>
    <div id="loading-indicator">加载中...</div>
    <button id="loadPost">加载文章 1</button>
    <button id="loadAnother">加载文章 2</button>
    <div id="post-container"></div>

    <script>
        // 设置全局默认值
        $.ajaxSetup({
            baseURL: 'https://jsonplaceholder.typicode.com/', // 注意:$.ajaxSetup 不支持 baseURL,这里仅作演示概念
            timeout: 5000,
            error: function(jqXHR, textStatus) {
                $('#post-container').html('<p style="color:red;">请求出错: ' + textStatus + '</p>');
            }
        });

        // 绑定全局事件
        $(document).ajaxStart(function() {
            $('#loading-indicator').show();
        }).ajaxStop(function() {
            $('#loading-indicator').hide();
        }).ajaxError(function(event, jqXHR, settings, errorThrown) {
            console.log('全局错误捕获: ' + errorThrown);
        });

        // 发送请求
        function loadPost(id) {
            $.ajax({
                url: 'https://jsonplaceholder.typicode.com/posts/' + id,
                dataType: 'json',
                success: function(post) {
                    $('#post-container').html('<h3>' + post.title + '</h3><p>' + post.body + '</p>');
                }
            });
        }

        $('#loadPost').on('click', function() { loadPost(1); });
        $('#loadAnother').on('click', function() { loadPost(2); });
    </script>
</body>
</html>

在这个综合示例中,当任何 $.ajax() 请求开始时,ajaxStart 事件触发,显示加载指示器;所有请求结束后,ajaxStop 触发,隐藏指示器。通过 $.ajaxSetup() 设置的默认 error 回调为所有请求提供了一个基础错误处理。这种全局管理方式极大地简化了 jQuery Ajax 在复杂页面中的状态管理和 jQuery交互 的一致性。

版本变更记录

版本变更内容
1.0引入 jQuery.ajax() 基础方法。
1.2引入便捷方法 jQuery.get()jQuery.post()
1.4增强对 JSONP 的支持,引入 jQuery.getJSON()
1.5重大重构jQuery.ajax() 返回 jqXHR 对象,实现 Promise 接口,支持链式回调(.done().fail().always())。
1.9移除了 jQuery.ajax() 中已废弃的选项,如 jsonpscriptCharset 的某些用法。
3.0jqXHR.success()jqXHR.error()jqXHR.complete() 回调被正式弃用,推荐使用 Promise 风格的方法(.done() 等)。
4.0增加对二进制数据(包括 FormData)的自动支持。移除 JSONP 自动提升逻辑(即将 JSON 请求自动转换为 JSONP)。默认情况下,脚本请求使用 <script> 标签以避免 CSP 错误,同时支持 Trusted Types。

浏览器兼容性

jQuery 的 Ajax 功能基于浏览器的 XMLHttpRequest (XHR) 对象,其兼容性覆盖了几乎所有现代及历史浏览器。以下为 jQuery 核心所支持的最低浏览器版本。

浏览器最低支持版本
Chrome30+
Edge12+
Firefox25+
Opera18+
Safari7+
Chrome Android30+
Firefox for Android25+
Opera Android18+
Safari on iOS7+
Samsung Internet4.0+
WebView Android4.4+
WebView on iOS7+

注:对于 IE6-8,jQuery 1.x 系列提供了基于 ActiveXObject 的兼容支持,但现代开发中建议使用 polyfill 或升级用户浏览器。jQuery 4.x 已放弃对 IE 10 及更早版本的支持,但仍兼容 IE11。

$.ajax() 作为 jQuery Ajax 体系中的基石,提供了构建丰富且动态 jQuery交互 所需的全部控制力。从配置单个请求到管理全局事件,其设计兼顾了简洁与强大。通过结合 Promise 风格的异步处理和对多种数据类型的自动解析,它极大地简化了客户端与服务器之间的数据通信,使开发者能够专注于构建流畅、响应式的用户体验。