jQuery 3.0 Beta 版发布
时间到了。在 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()
实现以更 closely 匹配 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 的解析状态现在由其回调控制 - 异常会变成拒绝值,非可 then 的返回值会变成履行值。以前,拒绝处理程序中的返回值会变成 *拒绝* 值。 - 回调总是异步调用。以前,它们会在绑定或解析后立即调用,以最后发生者为准。
- 进度回调不再能够解析它们绑定的 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 开始,这将记录“父级已解析”,然后调用 *任何* 回调,每个子级回调将记录“已履行 bar”,而孙子级将被 Error “baz” 拒绝。在以前的版本中,这会记录一次“已拒绝 bar”(子级 Deferred 已被拒绝而不是已履行),然后立即终止并出现未捕获的 Error “baz”(“父级已解析”未被记录,孙子级也未被解析)。
虽然捕获的异常对浏览器内调试有优势,但使用拒绝回调处理它们更具声明性(即显式)。请记住,这要求您在使用 Promise 时始终添加至少一个拒绝回调。否则,任何错误都不会被发现。
可以通过用现在已弃用的 .pipe()
方法(具有相同的签名)替换 .then()
的使用来恢复旧行为。
我们还创建了一个插件来帮助调试与 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()
方法已添加为 promise 对象的别名,用于 .then(null, fn)
。
https://github.com/jquery/jquery/issues/2102
已删除 jQuery.ajax 中的特殊情况 Deferred 方法
jqXHR 对象是一个 Promise,但也有额外的 method。随着用户越来越接受使用 Promise 模式进行异步工作(例如 AJAX),为 jQuery.ajax 返回的 Promise 拥有带重复 method 名称的特殊情况的想法越来越糟糕。因此,这些已弃用的名称已被删除。不再使用特殊情况的 success、error、complete
,而是使用相应的 done、fail、always
method。
请注意,这不会对同名的 success、error、complete
*回调* 产生任何影响,它们仍然存在并且没有被弃用。这只会影响 Promise method!它也不会删除或弃用 abort
method。
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()
method 不接受任何参数。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 中被私有化。这些 method 以及 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
您认为什么时候会停止对 IE9 和 IE10 的支持?
您讨论过这个吗?是否有任何计划?
顺便说一句,微软并没有完全放弃IE9或IE10。它们在Vista上都支持了一年左右。也许这就是jQuery仍然支持IE9等的原因。
我希望你们能开始让jQuery变得更精简。
https://mathiasbynens.be/demo/jquery-size
它又变得太大了,正在慢慢变大。:(
@Phill 我认为你读错了。jQuery现在比1.5.2版本小多了。但实际上,那个页面的目的是证明gzip的重要性,它让大小的增减变得微不足道。
我很抱歉你们也没有放弃对IE9或IE10的支持。即使微软没有这样做,你们也应该这样做,因为这是像jQuery基金会这样的组织帮助塑造互联网未来的责任,通过树立榜样。
@César 这是让你的库变得毫无意义的最快方法。
@César Couto,为什么jQuery应该在其他任何人都放弃支持之前放弃支持呢?许多人,比如我,使用jQuery来让我的javascript在旧浏览器上运行(对于需要它的网站),以及处理一些跨浏览器问题。
但另一方面,我想我可以只使用旧版本的jQuery来处理那些需要旧浏览器兼容性的网站。
@Tyler,@Brian,你们难道没有看出@César Couto是在讽刺吗?
太棒了!,这些重大改变是为获得更高性能付出的微不足道的代价,再见 Internet Explorer !!!
@Arun - 不,这并不明显。有些人就是这么疯狂。
很多使用依赖于某些CSS自定义选择器的可视化编辑器的拖放功能。对于这些开销有什么解决方案吗?
@Guillermo Ignacio Enriquez Gutierrez
> 微软并没有完全放弃IE9或IE10。它们在Vista上都支持了一年左右。
不是都支持,只有IE 9 支持(直到2017年4月)。IE 10 不再支持任何消费者版本的Windows。
这个版本让我非常失望。
考虑到jQuery 1.12.0和2.2.0的发布,我们可以再等6个月发布3.0分支。
3.0分支支持IE 9-11是不可理解的,以前的版本已经满足了这一需求。
当发布一个不向后兼容的版本时,我们应该利用这个机会“推倒重来”,重建基础。
我们需要等到现在的浏览器90%支持ES2015(对于Edge、Chrome和可能不再使用的Firefox的下一版本来说已经成为现实)才能从jQuery中删除所有在ES2015中已有的内容,并发布一个尽可能精简的版本,剔除所有过时的部分。
当ES2015中已经有原生的Promise/A+时,jQuery.Deferred还有何用?同样,对于AJAX事务和jqXHR对象的那些令人难以置信的方法来说也是如此。
@Daniel Hagnoul,用英语发帖就这么难吗,还是你只是在说反话?
天哪,v2就像昨天的事一样!
好的。
感谢更新,以及多年来为这个伟大项目做出贡献的人们的努力。我很好奇jQuery现在在移动浏览器上的表现如何。上面评论中提到的性能是否指的是台式机/笔记本电脑上的浏览器,还是移动浏览器?在哪里可以测试jQuery在自己电脑上的性能?
迫不及待地想看到新的.show()和.hide()方法的实际效果,在这个版本之前,我在使用它们时遇到了一些麻烦!
Promises/A+ 兼容性的另一个重要方面是,任何可执行 then 的对象在从`.then()`回调返回时都会被同化。
这意味着创建了一个具有`then`方法的对象的promise的代码将失效,但也意味着你可以安全地从*任何*实现中返回promise(无需使用deferred反模式进行包装)。
这也意味着你不能再用另一个Deferred来满足Deferred了 - 希望你以前从来没有这样做过。
顺便说一句,我们会看到像$.Deferred.resolve或$.Deferred.all这样的ES6风格的东西吗?这些在正确的promise实现中是标准的。
Promises/A+ 兼容性的另一个重要方面是,任何可执行 then 的对象在从`.then()`回调返回时都会被同化。
我也投票支持在jQuery3中放弃对IE9/10的支持。
需要IE9/10支持的网站可以永远使用jQuery 2.2。
我一直都在期待它。
我也投票支持在jQuery3中放弃对IE9/10的支持。
需要IE9/10支持的网站可以永远使用jQuery 2.2。
承诺行为描述的一部分可能很容易被误解
“从 jQuery 3.0 开始,这将在调用任何回调之前记录“父级已解析”,然后每个子级回调将记录“已完成 bar”,而子孙将被拒绝并出现错误“baz”。"
子孙确实会被拒绝,但在示例中没有任何记录表明这一点,因为“拒绝”回调仅在子级被拒绝时才会被调用。我认为该描述很容易被误读为子孙会记录“拒绝 baz”。(我误读了,而且由于该读法不符合 Promise A+ 规范,我不得不去验证该行为确实是符合规范的)。
澄清这一点可能很有用:实现回调中的异常会变成链条下游的拒绝,但它们不会在同一级别调用拒绝回调。
Taze Kavrulmu? Kahve https://www.kahvesel.com/
Taze kavrulmus kahve, 3. dalga kahve demleme ekipmanlari https://www.kahvesel.com/
太好了,我们期待最终版本。
不错!
IE 10 支持吗?