时机已到。在今天,jQuery 的十周年纪念日,jQuery 3.0 已达到 beta 状态。上周,我们宣布了 1.x 和 2.x 分支的最后一次次要版本。这些分支将继续接收补丁一段时间(即仅修复主要回归或错误);jQuery 3.0 是未来。如果您需要 IE6-8 支持,您可以继续使用最新的 1.12 版本。
jQuery Compat 的消亡

如果您阅读了 jQuery 3.0 alpha 博客文章,您可能还记得我们宣布了一个名为“jQuery Compat”的东西。您可以忘记它。1 月 12 日,微软 停止支持 IE8、IE9 和 IE10。我们不会走那么远,但我们正在停止支持 IE8。随着 IE8,jQuery Compat 也随之消失,甚至在我们发布最终版本之前。从现在开始,只会有一个 jQuery!
尽管 3.0 版本号,我们预计这些版本不应该给您升级现有代码带来太多麻烦。是的,有一些“破坏性更改”证明了主要版本号的提升,但我们希望破坏性不会真正影响太多人。jQuery Migrate 3.0 插件(发布时)将帮助您识别代码中的兼容性问题。您的反馈将对我们非常有帮助,因此请在您的现有代码和插件上尝试它!
您可以从 jQuery CDN 获取文件,或直接链接到它们
https://code.jqueryjs.cn/jquery-3.0.0-beta1.js
https://code.jqueryjs.cn/jquery-3.0.0-beta1.min.js
您还可以从 npm 获取 beta 版本
npm install jquery@3.0.0-beta1
主要变更
以下只是这些版本中主要新功能、改进和错误修复的亮点。完整的更改列表可在我们的 GitHub 错误跟踪器上找到。
.show() 和 .hide() 方法
在 jQuery 3.0 alpha 中,我们尝试将这些方法视为一个内联显示无移除器 (.show()) 和一个内联显示无添加器 (.hide())。这样做的好处是大大简化了这些方法并提高了性能(它需要的计算量少得多)。但是,这证明对我们的用户来说是个问题。删除内联 display:none 并不总是显示元素(如果元素被样式表隐藏,例如),这太常见了。我们意识到我们无法为 jQuery 插件提供一种简单的方法来确保显示一个元素。
我们已经恢复了该更改,并且我们保留的对 show 和 hide 方法的更改应该对您的代码影响更小。事实上,即使恢复了,我们 大大提高了隐藏许多元素的性能。
关于 .data() 名称的特殊情况
我们已经更新了我们的 .data() 实现,使其更接近 HTML5 dataset 规范。现在所有键都从 kebab-case 转换为 camelCase,无论访问方法如何,并且数字不再参与转换。例如,我们不再区分 “foo-bar” 和 “fooBar”,但会区分 “foo-42” 和 “foo42”。这些更改主要会在通过不带参数调用 .data() 来获取所有数据时,或者尝试使用转换后的键(.data(“foo42”))而不是原始键(.data(“foo-42”))访问数据时生效。
https://github.com/jquery/jquery/issues/1751
jQuery.Deferred 现在与 Promises/A+ 兼容
jQuery.Deferred 对象已更新,以兼容 Promises/A+ 和 ES2015 Promises,并通过 Promises/A+ Compliance Test Suite 验证。这意味着我们需要对 .then() 方法进行一些重大更改
- 在
.then()回调中抛出的异常现在将成为拒绝值。 以前,异常会一直冒泡,中止回调执行并不可逆地锁定父级和子级 Deferred 对象。 - 由
.then()创建的 Deferred 的解析状态现在由其回调控制——异常成为拒绝值,而非 thenable 的返回值成为完成值。 以前,拒绝处理程序中的返回值会成为拒绝值。 - 回调始终异步调用。 以前,它们会在绑定或解析时立即调用,以两者中较晚者为准。
- 进度回调函数不再能解析与其绑定的 Deferred 对象。
考虑以下示例,其中父级 Deferred 被拒绝,并且子级回调会生成一个异常
var parent = jQuery.Deferred();
var child = parent.then( null, function() {
return "bar";
});
var callback = function( state ) {
return function( value ) {
console.log( state, value );
throw new Error( "baz" );
};
};
var grandchildren = [
child.then( callback( "fulfilled" ), callback( "rejected" ) ),
child.then( callback( "fulfilled" ), callback( "rejected" ) )
];
parent.reject( "foo" );
console.log( "parent resolved" );
从 jQuery 3.0 开始,这将首先记录“parent resolved”,然后调用任何回调,每个子级回调将记录“fulfilled bar”,并且孙级对象将使用 Error “baz” 被拒绝。 在以前的版本中,它会记录“rejected bar”(子级 Deferred 被拒绝而不是完成)一次,然后立即以未捕获的 Error “baz” 终止(未记录“parent resolved”,并且孙级对象未解析)。
虽然捕获异常对于浏览器内调试具有优势,但使用拒绝回调来处理它们更具声明性(即明确性)。 请记住,这意味着您有责任始终为使用 promise 时添加至少一个拒绝回调。 否则,任何错误都将被忽略。
可以通过使用现在已弃用的 .pipe() 方法(其具有相同的签名)来恢复旧行为。
我们还构建了一个插件,以帮助调试兼容 Promises/A+ 的 Deferred 对象。如果您发现存在一些被吞噬的幽灵错误,请查看 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.ajax 中的特殊 Deferred 方法
jqXHR 对象是一个 Promise,但也有额外的属性和方法。随着用户越来越多地采用 Promise 模式进行异步工作,例如 AJAX,为 jQuery.ajax 返回的 Promise 拥有具有重复方法名的特殊情况越来越不可取。因此,这些已弃用的名称已被删除。请使用相应的 done, fail, always 方法,而不是特殊的 success, error, complete。
请注意,这不会对同名的 success, error, complete 回调函数 产生任何影响,这些回调函数仍然存在且未被弃用。这只会影响 Promise 方法!它也不会删除或弃用 abort 方法。
https://github.com/jquery/jquery/issues/2084
错误案例不会静默失败
也许在某个深刻的时刻,您会想知道:“窗口的偏移量是多少?” 然后您可能意识到这是一个疯狂的问题——窗口怎么可能拥有偏移量?
过去,jQuery 有时会尝试让像这样的一些情况返回某些内容,而不是抛出错误。在这种情况下,要求窗口的偏移量,到目前为止的答案一直是 { top: 0, left: 0 }。在 jQuery 3.0 的这个 beta 版本中,我们正在试验让这些情况抛出错误的想法,这样疯狂的请求就不会被默默地忽略。请尝试 beta 版本,看看是否有任何代码依赖 jQuery 来掩盖无效输入的问题。
https://github.com/jquery/jquery/issues/1784
.width(), .height(), .css(“width”) 和 .css(“height”) 返回十进制值(只要浏览器这样做)
以前,jQuery 在获取宽度和高度时会四舍五入值。一些浏览器返回子像素值——例如 IE 和 Firefox——有时用户在依赖这些值进行布局时需要这种精度。我们预计此更改不会对您的代码产生重大影响,但如果产生影响,请告知我们。
https://github.com/jquery/jquery/issues/1724
删除了已弃用的事件别名
.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,但与现有代码存在 严重的兼容性问题,因此我们不得不将其回滚。 我们认为我们已经通过在浏览器选项卡不可见时暂停动画解决了大多数这些问题。 尽管如此,任何依赖于动画始终以近乎实时运行的代码都在做出不切实际的假设。
.unwrap( selector )
在 jQuery 3.0 之前,.unwrap() 方法不接受任何参数。selector 参数提供了一种指定要删除哪些包装器的途径。
https://github.com/jquery/jquery/issues/1744
jQuery.fn.domManip 不可访问
jQuery.dir、jQuery.sibling、jQuery.buildFragment、jQuery.access 和 jQuery.swap 在 jQuery 1.12 和 2.2 中已被私有化。这些方法以及 jQuery.fn.domManip 始终仅供内部使用,并且从未记录过。我们终于使它们私有,以避免混淆。
https://github.com/jquery/jquery/pull/2182
https://github.com/jquery/jquery/issues/2224
https://github.com/jquery/jquery/issues/2225
某些 jQuery 自定义选择器的速度大幅提升
感谢 Google 的 Paul Irish 的侦探工作,我们确定了一些可以跳过大量额外工作的情况,当在同一文档中使用像 :visible 这样的自定义选择器多次时。 该特定案例现在快了 17 倍!
请记住,即使有了这项改进,像 :visible 和 :hidden 这样的选择器也可能很昂贵,因为它们依赖于浏览器来确定元素是否实际显示在页面上。 在最坏的情况下,这可能需要完全重新计算 CSS 样式和页面布局! 虽然我们通常不阻止使用它们,但我们建议测试您的页面,以确定这些选择器是否会导致性能问题。
此更改实际上已包含在 1.12/2.2 中,但我们想重申一下 jQuery 3.0。