欢迎来到 jQuery 3.0 的发布候选版本!这是我们预期作为 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 获取发布候选版本
npm install jquery@3.0.0-rc1
此外,我们还有 jQuery Migrate 3.0 的发布候选版本。我们强烈建议使用它来解决 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 错误跟踪器上提供了已修复问题的完整列表: https://github.com/jquery/jquery/issues?q=is%3Aissue+milestone%3A3.0.0.
jQuery.Deferred 现在与 Promises/A+ 兼容
jQuery.Deferred 对象已更新以与 Promises/A+ 和 ES2015 Promises 兼容,并已通过 Promises/A+ 兼容性测试套件 验证。这意味着我们需要对 .then()
方法进行一些重大更改
- 在
.then()
回调中抛出的异常现在成为拒绝值。以前,异常会一直冒泡到最上层,中止回调执行并不可逆地锁定父 Deferred 对象和子 Deferred 对象。 - 由
.then()
创建的 Deferred 的解析状态现在由其回调控制——异常成为拒绝值,不可 then 的返回值成为履行值。以前,拒绝处理程序的返回值成为拒绝值。 - 回调始终异步调用。以前,它们会在绑定或解析时立即调用,以最后发生的事件为准。
考虑以下示例,其中父 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 开始,这将先记录“父级已解析”,然后再调用任何回调,每个子回调将随后记录“已履行 bar”,孙子回调将被拒绝,错误信息为“baz”。在以前的版本中,这将记录“拒绝 bar”(子 Deferred 已被拒绝而不是履行)一次,然后立即终止,出现未捕获的错误“baz”(未记录“父级已解析”,孙子回调保持未解析状态)。
虽然捕获的异常在浏览器内调试方面有优势,但使用拒绝回调来处理异常更具声明性(即更明确)。请记住,这要求您在使用承诺时始终添加至少一个拒绝回调。否则,任何错误都将无法被注意到。
可以通过将 .then()
的使用替换为现在已弃用的 .pipe()
方法(具有相同的签名)来恢复旧行为。
我们还构建了一个插件来帮助调试与 Promises/A+ 兼容的 Deferred。如果您在控制台中看不到足够的信息来确定错误的来源,请查看 jQuery Deferred Reporter 插件。
jQuery.when
也已更新,可以接受任何可 then 的对象,包括原生 Promise 对象。
https://github.com/jquery/jquery/issues/1722
https://github.com/jquery/jquery/issues/2102
将 .catch() 添加到 Deferred
catch()
方法已添加到承诺对象中,作为 .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
如上所述,升级指南 现在可供任何准备尝试此版本的人使用。除了在升级方面提供帮助外,它还列出了更多值得注意的更改。