jQuery 3.0 现已发布!此版本自 2014 年 10 月开始开发。我们着手创建一个更精简、更快的 jQuery 版本(同时考虑向后兼容性)。我们删除了所有旧的 IE 解决方法,并在有意义的地方利用了一些更现代的 Web API。它是 2.x 分支的延续,但包含了一些我们认为早就该进行的重大更改。虽然 1.12 和 2.2 分支将继续在一段时间内接收关键支持补丁,但它们不会获得任何新功能或重大修订。jQuery 3.0 是 jQuery 的未来。如果您需要 IE6-8 支持,您可以继续使用最新的 1.12 版本。
尽管版本号为 3.0,但我们预计这些版本在升级现有代码时不会造成太大麻烦。是的,有一些“重大更改”证明了重大版本号的提升,但我们希望这些中断实际上不会影响太多人。
为了帮助升级,我们提供了一个全新的 3.0 升级指南。并且 jQuery Migrate 3.0 插件 将帮助您识别代码中的兼容性问题。您对更改的反馈将极大地帮助我们,所以请在您现有的代码和插件上试用它!
您可以从 jQuery CDN 获取文件,或直接链接到它们
https://code.jqueryjs.cn/jquery-3.0.0.js
https://code.jqueryjs.cn/jquery-3.0.0.min.js
您还可以从 npm 获取发布版本
npm install jquery@3.0.0
此外,我们还发布了 jQuery Migrate 3.0。我们强烈建议您使用它来解决 jQuery 3.0 中的任何重大更改问题。您可以从此处获取这些文件
https://code.jqueryjs.cn/jquery-migrate-3.0.0.js
https://code.jqueryjs.cn/jquery-migrate-3.0.0.min.js
npm install jquery-migrate@3.0.0
有关在 jQuery Migrate 的帮助下将 jQuery 1.x 和 2.x 页面升级到 jQuery 3.0 的更多信息,请参阅 jQuery Migrate 1.4.1 博客文章。
精简版本
最后,我们在这次版本中添加了一些新内容。有时候你不需要 AJAX,或者你更喜欢使用专注于 AJAX 请求的众多独立库之一。而且通常情况下,使用 CSS 和类操作的组合来完成所有网页动画会更简单。除了包含 AJAX 和效果模块的 jQuery 正式版,我们还发布了一个“精简版”,该版本排除了这些模块。总的来说,它排除了 AJAX、效果和当前已弃用的代码。如今,jQuery 的大小很少会成为加载性能的顾虑,但精简版本比正式版压缩后小约 6KB——23.6KB 对比 30KB。这些文件也可以在 npm 包和 CDN 上获取。
https://code.jqueryjs.cn/jquery-3.0.0.slim.js
https://code.jqueryjs.cn/jquery-3.0.0.slim.min.js
此版本是使用我们的自定义构建 API 创建的,该 API 允许您排除或包含任何您喜欢的模块。有关更多信息,请查看 jQuery README。
与 jQuery UI 和 jQuery Mobile 的兼容性
虽然大多数功能都能正常工作,但 jQuery UI 和 jQuery Mobile 在即将发布的版本中会解决一些问题。如果您发现问题,请记住它可能已经在上游得到解决,并且使用 jQuery Migrate 3.0 插件 应该可以解决问题。预计很快发布。
主要变化
以下是这些版本中主要新功能、改进和错误修复的亮点,您可以在 3.0 升级指南 中了解更多详细信息。已修复问题的完整列表可在我们的 GitHub 错误跟踪器 上找到。如果您阅读了 3.0.0-rc1 的博客文章,以下功能与之相同。
jQuery.Deferred 现在与 Promises/A+ 兼容
jQuery.Deferred 对象已更新以与 Promises/A+ 和 ES2015 Promises 兼容,并已通过 Promises/A+ 兼容性测试套件 验证。这意味着我们需要对 .then()
方法进行一些重大更改。可以通过将 .then()
的任何使用替换为现在已弃用的 .pipe()
方法(它具有相同的签名)来恢复旧的行为。
- 在
.then()
回调中抛出的异常现在将成为拒绝值。以前,异常会一直冒泡到顶部,中止回调执行。任何依赖于抛出异常的延迟解析的延迟都不会解析。
示例:未捕获的异常与拒绝值
var deferred = jQuery.Deferred();
deferred.then(function() {
console.log("first callback");
throw new Error("error in callback");
})
.then(function() {
console.log("second callback");
}, function(err) {
console.log("rejection callback", err instanceof Error);
});
deferred.resolve();
以前,会记录“第一个回调”,并且会抛出错误。所有执行都已停止。不会记录“第二个回调”或“拒绝回调”。新的、符合标准的行为是,您现在将看到记录了“拒绝回调”和 true
。err
是第一个回调的拒绝值。
- 通过
.then()
创建的延迟的解析状态现在由其回调控制——异常变为拒绝值,非 thenable 返回值变为履行值。以前,拒绝处理程序的返回值变为拒绝值。
示例:来自拒绝回调的返回值
var deferred = jQuery.Deferred();
deferred.then(null, function(value) {
console.log("rejection callback 1", value);
return "value2";
})
.then(function(value) {
console.log("success callback 2", value);
throw new Error("exception value");
}, function(value) {
console.log("rejection callback 2", value);
})
.then(null, function(value) {
console.log("rejection callback 3", value);
});
deferred.reject("value1");
以前,这将记录“拒绝回调 1 值 1”、“拒绝回调 2 值 2”和“拒绝回调 3 未定义”。
新的、符合标准的行为是,这将记录“拒绝回调 1 值 1”、“成功回调 2 值 2”和“拒绝回调 3 [对象 Error]”。
- 回调始终异步调用,即使延迟已解析也是如此。以前,这些回调在绑定时同步执行。
示例:异步与同步
var deferred = jQuery.Deferred();
deferred.resolve();
deferred.then(function() {
console.log("success callback");
});
console.log("after binding");
以前,这将记录“成功回调”然后记录“绑定后”。现在,它将记录“绑定后”,然后记录“成功回调”。
重要提示:虽然捕获的异常在浏览器内调试中具有优势,但使用拒绝回调来处理异常要明确得多。请记住,这将责任交给了您,要求您在处理 promise 时始终添加至少一个拒绝回调。否则,一些错误可能会被忽视。
我们构建了一个插件来帮助调试与 Promises/A+ 兼容的 Deferred。如果您在控制台上没有看到足够的信息来确定错误的来源,请查看 jQuery Deferred Reporter 插件。
jQuery.when
也已更新,可以接受任何 thenable 对象,包括本机 Promise 对象。
https://github.com/jquery/jquery/issues/1722
https://github.com/jquery/jquery/issues/2102
向 Deferred 添加了 .catch()
catch()
方法已添加到 promise 对象中,作为 .then(null, fn)
的别名。
https://github.com/jquery/jquery/issues/2102
错误情况不会默默地失败
也许在一个深刻的时刻,您想知道,“窗口的偏移量是多少?” 然后你可能意识到这是一个疯狂的问题——窗口怎么能有偏移量呢?
在过去,jQuery 有时会尝试让这些情况返回某些东西,而不是让它们抛出错误。在这种特定情况下,询问窗口的偏移量,目前的答案是 { top: 0, left: 0 }
使用 jQuery 3.0,此类情况将抛出错误,以便不会默默地忽略疯狂的请求。请尝试使用此版本,看看是否有任何代码依赖于 jQuery 来掩盖无效输入的问题。
https://github.com/jquery/jquery/issues/1784
删除已弃用的事件别名
.load
、.unload
和 .error
自 jQuery 1.8 以来已弃用,现在不再存在。使用 .on()
注册侦听器。
https://github.com/jquery/jquery/issues/2286
动画现在使用 requestAnimationFrame
在支持 requestAnimationFrame
API 的平台上,该 API 几乎无处不在,除了 IE9 和 Android<4.4,jQuery 现在将在执行动画时使用该 API。这应该会导致动画更流畅,并使用更少的 CPU 时间——并且在移动设备上也能节省电池电量。
jQuery 在几年前尝试使用 requestAnimationFrame
,但存在与现有代码的 严重兼容性问题,因此我们不得不将其撤回。我们认为通过在浏览器选项卡不可见时暂停动画,我们已经解决了大多数问题。尽管如此,任何依赖于动画始终以近乎实时的速度运行的代码都是一个不切实际的假设。
一些 jQuery 自定义选择器的大幅提速
感谢 Google 的 Paul Irish 的调查工作,我们发现了一些情况,即在同一个文档中多次使用 :visible
等自定义选择器时,我们可以跳过大量额外工作。现在,这种情况快了 17 倍!
请记住,即使有了这项改进,:visible
和 :hidden
等选择器也可能很昂贵,因为它们依赖于浏览器来确定元素是否真的显示在页面上。在最坏的情况下,这可能需要对 CSS 样式和页面布局进行完全重新计算!虽然我们不鼓励在大多数情况下使用它们,但我们建议测试您的页面以确定这些选择器是否会导致性能问题。
此更改实际上已包含在 1.12/2.2 中,但我们希望在 jQuery 3.0 中重申这一点。
https://github.com/jquery/jquery/issues/2042
如上所述,升级指南 现在可供任何准备尝试此版本的人使用。除了在升级方面有所帮助之外,它还列出了更多值得注意的更改。
感谢
感谢所有通过代码贡献、问题报告等帮助发布此版本的人,包括但不限于 Jason Bedard、Fredrik Blomqvist、Leonardo Braga、Ralin Chimev、Jon Dufresne、Oleg Gaidarenko、Richard Gibson、Michał Gołębiowski、Scott González、Zack Hall、Alexander K、Martijn W. van der Lee、Alexander Lisianoi、Steve Mao、Dave Methvin、Jha Naman、Jae Sung Park、Todor Prikumov、William Robinet、Felipe Sateler、Damian Senn、Josh Soref、Jun Sun、Christophe Tafani-Dereeper、Vitaliy Terziev、Joe Trumbull、Bernhard M. Wiedemann、Devin Wilson 和 Henry Wong。
更改日志
Ajax
属性
CSS
核心
延迟
尺寸
文档
效果
事件
活动
操作
偏移量
- 解决严格模式下的 ClientRect “无设置器” 异常 (3befe59)
选择器
序列化
支持
测试
- 考虑 Safari 9.1 (234a2d8)
- 将 attributes.js 中的选择限制为 #qunit-fixture (ddb2c06)
- 将 Edge 的 clearCloneStyle 预期支持设置为 true (28f0329)
- 修复 Android 5.0 的默认 Chrome 浏览器和 Yandex.Browser 中的 Deferred 测试 (5c01cb1)
- 为 jQuery.isPlainObject 添加额外的测试 (728ea2f)
- 构建:更新 QUnit 并修复错误的测试 (b97c8d3)
- 修复 Android 4.4 中的操作测试 (0b0d4c6)
- 删除一个属性测试的副作用 (f9ea869)
- 考虑新的偏移量测试 (f52fa81)
- 使 iframe 测试在检查 isReady 后等待 (08d73d7)
- 重构 testIframe() 以使其更 DRY 并更加一致 (e5ffcb0)
- 将 jQuery.when 的同步假设弱化到 jQuery.ready.then (f496182)
- 测试视图之外的元素位置 (#2909, a2f63ff)
- 使捕获 Safari 9.0/9.1 的正则表达式更加稳健 (7f2ebd2)
遍历