核心Ajax方法:$.ajax()
$.ajax() 是 jQuery 中所有 Ajax 请求的基础方法,提供了一套完整且可配置的接口。其基本语法为 $.ajax( url [, settings ] ) 或 $.ajax( [settings ] ),通过一个 settings 对象来定义请求的各项参数。该方法返回一个 jqXHR 对象,该对象实现了 Promise 接口,可用于链式回调。
| 版本 | 变更说明 |
|---|---|
| 1.0 | 引入基础 Ajax 功能,包括 $.ajax()、$.get()、$.post() 和 load() 方法。 |
| 1.2 | 引入 JSONP 支持,允许跨域请求。 |
| 1.4 | 增加对 jqXHR 对象的支持,并引入 $.param() 方法的增强版本。 |
| 1.5 | $.ajax() 返回的 jqXHR 对象实现了 Promise 接口,增加了 .then()、.done()、.fail() 等方法。 |
| 1.9 | 移除了 $.ajax() 的 jsonp 和 script 类型的特殊处理,使其更规范化。 |
| 3.0 | 增强了 Promise 兼容性,jqXHR 对象遵循 Promises/A+ 标准。$.ajax() 的 success、error、complete 回调仍可用,但推荐使用 .done()、.fail()、.always()。 |
| 4.0 | 增加了对二进制数据(包括 FormData)的原生支持,无需手动禁用 processData。移除了 JSONP 的自动推断逻辑,不再将包含回调参数的 JSON 请求自动转为 JSONP。改进了对 Trusted Types 和 CSP 的支持,异步脚本请求优先使用 <script> 标签以避免 CSP 错误。部分 Ajax 全局事件别名被弃用。 |
常用配置选项
$.ajax() 的 settings 对象包含大量选项,用于精细控制请求。以下表格列举了最常用的核心选项。
| 选项 | 说明 | 引入/变更版本 |
|---|---|---|
url | 字符串,指定请求的目标 URL。 | 1.0 |
type / method | 字符串,指定 HTTP 方法,如 "GET"、"POST"、"PUT"、"DELETE"。从 1.9.0 起,推荐使用 method。 | 1.0 (type), 1.9.0 (method) |
data | 对象、字符串或数组,表示发送到服务器的数据。如果是对象,jQuery 会将其转换为查询字符串。对于 GET 请求,数据会附加到 URL 后。 | 1.0 |
processData | 布尔值,默认为 true,表示将非字符串的 data 转换为查询字符串。如果发送 FormData 或其他二进制数据,应设为 false。 | 1.0 (行为在 4.0 优化) |
contentType | 字符串,指定发送数据到服务器时使用的 HTTP 内容类型。默认为 "application/x-www-form-urlencoded; charset=UTF-8"。设为 false 可避免设置任何类型,常用于发送 FormData。 | 1.0 |
dataType | 字符串,指定期望从服务器返回的数据类型。可取值包括 "xml"、"html"、"script"、"json"、"jsonp"、"text"。如果未指定,jQuery 会智能推断。 | 1.0 |
headers | 对象,包含要随请求发送的额外 HTTP 头信息。 | 1.5 |
async | 布尔值,默认为 true,表示请求是异步的。从 jQuery 3.0 开始,不推荐使用同步请求,因其对用户体验有负面影响。 | 1.0 |
timeout | 数字,设置请求的超时时间(毫秒)。 | 1.0 |
beforeSend | 函数,在发送请求之前调用,允许修改 jqXHR 对象。返回 false 可取消请求。 | 1.0 |
success | 函数,请求成功完成后调用。函数接收三个参数:返回的数据、状态文本字符串、jqXHR 对象。 | 1.0 |
error | 函数,请求失败时调用。函数接收三个参数:jqXHR 对象、状态文本字符串、错误异常对象。 | 1.0 |
complete | 函数,请求完成后(无论成功或失败)调用。函数接收两个参数:jqXHR 对象、状态文本字符串。 | 1.0 |
context | 对象,用于设置所有 Ajax 相关回调函数中的 this 值。 | 1.1.1 |
global | 布尔值,默认为 true,表示是否触发全局 Ajax 事件。 | 1.0 |
xhr | 函数,用于创建 XMLHttpRequest 对象的回调函数,可在其中进行自定义配置,如添加 withCredentials。 | 1.5.1 |
scriptAttrs | 对象,用于定义当使用 <script> 标签传输(如跨域脚本请求)时,附加到该标签上的属性。 | 4.0 |
crossDomain | 布尔值,默认为 false(同域),设为 true 可强制将请求视为跨域。 | 1.5 |
username / password | 字符串,用于响应需要 HTTP 身份验证的请求。 | 1.0 |
便捷方法
jQuery 提供了多个基于 $.ajax() 封装的便捷方法,用于简化常见类型的 Ajax 请求。这些方法接收较少的参数,并预设了合适的请求类型或数据处理方式。
| 方法 | 说明 | 版本引入 |
|---|---|---|
$.get() | 使用 HTTP GET 方法从服务器加载数据。语法为 $.get( url [, data ] [, success ] [, dataType ] )。 | 1.0 |
$.post() | 使用 HTTP POST 方法向服务器发送数据。语法为 $.post( url [, data ] [, success ] [, dataType ] )。 | 1.0 |
$.getJSON() | 使用 GET 方法加载 JSON 数据,等同于 $.get() 并将 dataType 设为 "json"。 | 1.0 |
$.getScript() | 使用 GET 方法加载并执行一个 JavaScript 文件。 | 1.0 |
load() | 从服务器加载 HTML 内容,并直接将返回的内容插入到匹配的元素中。语法为 .load( url [, data ] [, complete ] )。 | 1.0 |
元素级Ajax:load()
load() 方法是一个与 DOM 操作紧密结合的便捷 Ajax 方法。它执行一个 Ajax GET 请求(如果提供了 data 对象,则为 POST 请求),然后将返回的 HTML 字符串直接设置为匹配元素的内容。其强大之处在于,可以在 url 后附加一个空格和 jQuery 选择器,来过滤返回的 HTML,只插入匹配的部分。例如,$('#result').load('/page.html #container') 会从 /page.html 加载内容,但只插入 id 为 container 的元素内容。
全局Ajax事件
jQuery 提供了一组全局 Ajax 事件,可以在任何元素上监听,用于在应用的全局层面处理与 Ajax 请求相关的反馈,例如显示或隐藏全局的加载指示器。这些事件可以通过 .on() 方法绑定到 document 或其他永久存在的元素上。
| 事件 | 说明 | 版本引入 |
|---|---|---|
ajaxStart | 当第一个 Ajax 请求开始时触发。 | 1.0 |
ajaxSend | 在每个 Ajax 请求将要被发送之前触发。 | 1.0 |
ajaxSuccess | 在每个 Ajax 请求成功完成时触发。 | 1.0 |
ajaxError | 在每个 Ajax 请求失败时触发。 | 1.0 |
ajaxComplete | 在每个 Ajax 请求完成时(无论成功或失败)触发。 | 1.0 |
ajaxStop | 当所有 Ajax 请求都已完成时触发。 | 1.0 |
表单序列化
表单序列化方法用于将表单元素的值转换成适合 URL 查询字符串或 Ajax 请求体的格式。
| 方法 | 说明 | 版本引入 |
|---|---|---|
.serialize() | 将一组表单元素编码为查询字符串。 | 1.0 |
.serializeArray() | 将一组表单元素编码为一个由名称和值对象组成的数组。 | 1.2 |
$.param() | 创建一个数组或普通对象的序列化表示形式,可用于 URL 查询字符串或 Ajax 请求。 | 1.2 |
低级接口与工具
除了核心请求方法,jQuery 还提供了一些底层工具函数,用于预处理或直接操作 Ajax 流程。
| 方法 | 说明 | 版本引入 |
|---|---|---|
$.ajaxPrefilter() | 在每个请求被 $.ajax() 处理之前,对请求选项进行修改或添加自定义处理。 | 1.5 |
$.ajaxTransport() | 创建一个对象,定义如何实际传输 Ajax 数据,用于扩展或替换内置传输机制。 | 1.5 |
$.ajaxSetup() | 为将来的 Ajax 请求设置默认值。不推荐使用,因为它会全局影响所有请求,可能导致难以预料的副作用。 | 1.1 |
跨域请求处理
jQuery 主要通过两种机制处理跨域请求:JSONP 和 CORS。
JSONP(JSON with Padding)通过动态创建 <script> 标签来加载数据,仅支持 GET 请求。通过在 $.ajax() 中设置 dataType: "jsonp" 来启用。jQuery 会自动处理回调函数。需要注意的是,从 jQuery 4.0 开始,移除了将普通 JSON 请求自动提升为 JSONP 的逻辑,必须显式指定 dataType: "jsonp" 才能发起 JSONP 请求。
CORS(Cross-Origin Resource Sharing)是一种更现代、更强大的机制,需要服务器在响应头中设置正确的 Access-Control-Allow-Origin 等字段。jQuery 对于 CORS 的支持与标准 XHR 一致。对于跨域的异步脚本请求,jQuery 4.0 优先使用 <script> 标签,以更好地遵守 CSP 规则,除非指定了自定义的 headers 选项(此时会回退到 XHR)。
版本演进与迁移要点
jQuery 的 Ajax 模块在多个主要版本中经历了重要变革。理解这些变化对于升级和维护旧项目至关重要。
| 版本 | 主要变更 | 迁移建议 |
|---|---|---|
| 1.x | 奠定了 Ajax 模块的基础,引入核心方法和 JSONP 支持。 | 对于非常旧的版本(<1.5),jqXHR 对象不完整,需注意回调处理。 |
| 1.5 | jqXHR 对象实现 Promise 接口,引入预处理和传输机制。 | 可开始使用 .done()、.fail() 等 Promise 风格回调。 |
| 3.0 | 增强 Promise 兼容性,弃用同步请求。 | 优先使用异步请求,用 .done()/.fail() 替代 success/error。 |
| 4.0 | 重大变更:原生支持二进制数据(包括 FormData)。移除 JSONP 自动推断。对跨域脚本请求优先使用 <script> 标签以符合 CSP。部分全局事件别名被弃用。 | 检查所有涉及二进制数据发送的代码,确保不再依赖 processData: false 的旧有变通方式。明确设置 dataType: "jsonp" 而非依赖自动转换。测试 CSP 相关代码。 |
jQuery Ajax 参考手册系统地梳理了从核心配置、便捷方法、全局事件到跨域处理的完整知识体系。从 1.0 版本引入基础功能,到 4.0 版本对现代 Web 标准(如二进制数据、CSP)的全面拥抱,jQuery Ajax 模块始终致力于为开发者提供强大、统一且跨浏览器的异步通信方案。这份手册旨在作为日常开发中的快速查阅工具,帮助开发者高效应对各种数据交互场景。
