jQuery 3.0 现在发布了!这个版本的工作已经进行了自 2014 年 10 月以来。我们着手创建一个更精简、更快速的 jQuery 版本(同时考虑到向后兼容性)。我们删除了所有旧的 IE 解决方法,并在有意义的情况下利用了一些更现代的网络 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 的大小很少成为加载性能问题,但精简版本比常规版本小约 6k gzip 字节 – 23.6k 与 30k。这些文件也可用在 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+ Compliance Test Suite 验证。这意味着我们需要对 .then() 方法进行一些重大更改。可以通过用现在已弃用的 .pipe() 方法(具有相同的签名)替换任何 .then() 的使用来恢复旧行为。
- 在
.then() 回调中抛出的异常现在变成拒绝值。以前,异常会一直冒泡,从而中止回调执行。任何依赖于抛出异常的 deferred 的 deferred 都将永远无法解决。
示例:未捕获的异常与拒绝值
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() 创建的 Deferred 的解析状态现在由其回调控制——异常成为拒绝值,而非 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");
之前,这会记录“rejection callback 1 value1”、“rejection callback 2 value2”和“rejection callback 3 undefined”。
新的、符合标准的行为是,这会记录“rejection callback 1 value1”、“成功 callback 2 value2”和“rejection callback 3 [object Error]”。
- 回调始终异步调用,即使 Deferred 已经解决。 之前,这些回调在绑定时同步执行。
示例:异步与同步
var deferred = jQuery.Deferred();
deferred.resolve();
deferred.then(function() {
console.log("success callback");
});
console.log("after binding");
之前,这会记录“success callback”然后“after binding”。 现在,它会记录“after binding”然后“success callback”。
重要提示:虽然捕获的异常对于浏览器内调试具有优势,但使用拒绝回调处理它们更具声明性(即显式性)。 请记住,这意味着您必须始终为使用 promise 的情况添加至少一个拒绝回调。 否则,某些错误可能会被忽略。
我们构建了一个插件来帮助调试兼容 Promises/A+ 的 Deferreds。 如果您在控制台中看不到足够的信息来确定错误的来源,请查看 jQuery Deferred Reporter Plugin。
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 的平台上,几乎所有平台都支持 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
核心
Deferred
Dimensions
文档
Effects
事件
活动
操作
Offset
- 解决严格模式 ClientRect “无 setter” 异常 (3befe59)
选择器
序列化
支持
Tests
- 考虑 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)
Traversing