时机已到。在今天,jQuery 的 10 周年纪念日,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 数据集规范。现在,所有键都将从 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+ 兼容性测试套件 进行验证。这意味着我们需要对 `.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 开始,这将在调用任何回调之前记录“父级已解析”,然后每个子级回调将记录“fulfilled bar”,子孙节点将被拒绝,并带有错误“baz”。在以前的版本中,这将记录一次“rejected bar”(子级 Deferred 被拒绝而不是已完成),然后立即终止,并带有未捕获的错误“baz”(“父级已解析”未被记录,子孙节点保持未解析)。
虽然捕获的异常在浏览器内调试方面有优势,但使用拒绝回调来处理它们更具声明性(即显式)。请记住,这将责任放在您身上,要求您在使用 promises 时始终添加至少一个拒绝回调。否则,任何错误都将不会被注意到。
可以通过将 .then()
的使用替换为现在已弃用的 .pipe()
方法(具有相同的签名)来恢复旧的行为。
我们还创建了一个插件来帮助调试与 Promises/A+ 兼容的 Deferreds。如果您发现存在被吞噬的幽灵错误,请查看 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.ajax 中删除特殊情况的 Deferred 方法。
jqXHR 对象是一个 Promise,但也具有额外的 method。随着用户越来越多地采用 Promise 模式来处理 AJAX 等异步工作,在 jQuery.ajax 返回的 Promise 中拥有带有重复方法名的特殊情况的想法越来越糟糕。因此,这些已弃用的名称已被删除。请勿使用特殊情况的 `success, error, complete`,而是使用相应的 `done, fail, always` 方法。
请注意,这不会对同名的 `success, error, complete` 回调产生任何影响,这些回调仍然存在,并且不会被弃用。这仅影响 Promise 方法!它也不会删除或弃用 `abort` 方法。
https://github.com/jquery/jquery/issues/2084
错误情况不会静默失败
也许在某个深刻的时刻,您会想,“窗口的偏移量是多少?”然后你可能意识到这是一个疯狂的问题——窗口怎么可能有偏移量?
在过去,jQuery 有时尝试使这些情况返回一些东西,而不是让它们抛出错误。在这种特定情况下,请求窗口的偏移量,到目前为止的答案是 `{ top: 0, left: 0 }
`。在 jQuery 3.0 的这个测试版中,我们正在尝试让这些情况抛出错误,以便不会默默地忽略疯狂的请求。请尝试使用测试版,并查看是否有任何代码依赖 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。
https://github.com/jquery/jquery/issues/2042