欢迎来到 jQuery 3.0 的 Release Candidate!这是我们预计发布为 jQuery 3.0 最终版本的代码(除非发现重大错误或回归)。发布后,jQuery 3.0 将成为 jQuery 的唯一版本。1.12 和 2.2 分支将继续接收关键支持补丁一段时间,但不会获得任何新功能或重大修订。请注意,jQuery 3.0 不支持 IE6-8。如果您需要 IE6-8 支持,可以继续使用最新的 1.12 版本。
尽管版本号为 3.0,我们预计这些发布在升级现有代码时不会带来太多麻烦。是的,有一些“破坏性更改”证明了主要版本号的提升,但我们希望这些破坏不会影响太多人。
为了协助升级,我们有一个全新的 3.0 升级指南。并且 jQuery Migrate 3.0-rc 插件将帮助您识别代码中的兼容性问题。您对这些更改的反馈将对我们非常有帮助,请在您的现有代码和插件上尝试一下!
您可以从 jQuery CDN 获取文件,或直接链接到它们
https://code.jqueryjs.cn/jquery-3.0.0-rc1.js
https://code.jqueryjs.cn/jquery-3.0.0-rc1.min.js
您也可以从 npm 获取 Release Candidate
npm install jquery@3.0.0-rc1
此外,我们还发布了 jQuery Migrate 3.0 的 Release Candidate。我们强烈建议使用它来解决 jQuery 3.0 中破坏性更改的任何问题。您可以在这里获取这些文件
https://code.jqueryjs.cn/jquery-migrate-3.0.0-rc1.js
https://code.jqueryjs.cn/jquery-migrate-3.0.0-rc1.min.js
npm install jquery-migrate@3.0.0-rc1
有关如何使用 jQuery Migrate 将您的 jQuery 1.x 和 2.x 页面升级到 jQuery 3.0 的更多信息,请参阅 昨天的 jQuery Migrate 博客文章。
主要变更
以下只是这些发布中主要新功能、改进和错误修复的亮点,您可以在 3.0 升级指南中了解更多详细信息。完整的修复问题列表可在我们的 GitHub 错误跟踪器上找到。
jQuery.Deferred 现在与 Promises/A+ 兼容
jQuery.Deferred 对象已更新,与 Promises/A+ 和 ES2015 Promises 兼容,并通过 Promises/A+ Compliance Test Suite 进行了验证。这意味着我们需要对 .then() 方法进行一些重大更改
- 在
.then()回调中抛出的异常现在将成为拒绝值。 以前,异常会一直冒泡,中止回调执行并不可逆地锁定父级和子级 Deferred 对象。 - 由
.then()创建的 Deferred 的解析状态现在由其回调控制——异常成为拒绝值,而非 thenable 的返回值成为完成值。 以前,拒绝处理程序中的返回值会成为拒绝值。 - 回调始终异步调用。 以前,它们会在绑定或解析时立即调用,以两者中较晚者为准。
考虑以下示例,其中父级 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 有时会尝试让像这样的一些案例返回某些内容,而不是抛出错误。 在询问窗口偏移量的特定案例中,到目前为止的答案一直是 { 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
如上所述,升级指南现在可供任何准备尝试此版本的人使用。 除了有助于升级之外,它还列出了更多值得注意的更改。