说明
- 本文为翻译文章,原文在这里
- 本文作者:Aurelio De Rosa
- 本文总结了jQuery3新特性,作为jQuery开发者的参考
引言
- jQuery影响网页开发已经有十年的时间,它一路走来源于它的诸多优势。 jQuery为用户提供了一个易于使用的与DOM交互方式,比如:执行Ajax请求,创建动画,等等。此外,不同于纯DOM的API,jQuery实现了复合模式。正因为如此,你在不用知道元素数量的前提下,可以方便调用一个jQuery集合或是一个jQuery方法。
- 在未来的几个星期,一个重要的时间节点将要到来,jQuery将发布版本3,其中修复了很多的bug,增加了新的方法,弃用并删除了一些功能,改变了一些功能的行为。在这篇文章中,我将讲解jQuery3引入的最重要的变化。
新特性
- 在下面的章节,我将讨论jQuery3中添加的最重要的特性。
FOR…OF LOOP
- jQuery3将提供for…of 循环来遍历一个jQuery集合的DOM元素。这种新的迭代器是ECMAScript 2015(又名的ECMAScript6)规范的一部分。它可以让你方便的迭代对象(包括阵列,地图,设置,等等)。
- 当使用这种新的迭代方式的时候,您会收到一个不是jQuery的集合,从中仅可以在同一时间访问一个DOM元素。这个迭代器将使你可以在一个jQuery集合执行操作的方式略有提升。
- 为了理解这个迭代器是如何工作的,我们举个例子。比如你想分配一个ID给页面的每个输入元素。 jQuery的3之前你可以这样写:
1 | var $inputs = $('input'); |
- 在jQuery3中可以这样写:
1 | var $inputs = $('input');var i = 0; |
$.GET()
AND $.POST()
的新属性
- jQuery3增加了
$.get()
和$.post()
的新属性,他们是ajax的具体实现。添加新的属性是:
1 | $.get([settings]) |
- setting是一个对象,可以拥有许多属性。你可以给$.ajax()提供相同的对象。要了解更多内容,请参阅$.ajax()。
- 在给
$.get()
、$.post()
传送对象和给$.ajax()
传送对象的最大的区别是方法的属性始终被忽略掉。产生这种情况的原因是$.get()
、$.post()
对象有一个预设的HTTP方法来执行Ajax请求(GET方法对应$.get()
、POST方法对应$.post()
)。最基本的一个原则是,你不能尝试通过$.get()
去发送POST请求。
1 | $.get({ |
- 尽管显式设置了请求的方法为POST,这段代码仍将发出GET而非POST请求。
使用REQUESTANIMATIONFRAME()播放动画
- 所有现代浏览器,包括Internet Explorer10及以上,都支持requestAnimationFrame。在实际操作中,jQuery3播放动画时,使用这个API将使得动画的播放更加平滑,而且消耗更少的CPU资源。
UNWRAP()
- jQuery3对于unwrap()函数增加了一个可选的选择参数。该方法现在可以这么使用:
1 | unwrap([selector]) |
- 由于这种变化,你可以在unwrap函数中添加选择器。如果选择器存在匹配的DOM对象,则匹配的子元素是展开;否则,不进行操作。
未来的变化
- jQuery3还修改了它的一些功能的行为。
VISIBLE 和 :HIDDEN
- 新版的jQuery更改了:visible 和:hidden的含义,如果元素存在盒模型(包括那些宽度和高度为零的盒模型),这样的元素将被认为是:visible的。例如,
元素和一些没有内容的行内元素在jQuery3中就会被:visible选择器选中。所以,如果您页面上结构如下:
1 | <div></div> |
- 而且您写了如下的代码:
1 | console.log($('body :visible').length); |
- 在jQuery1和jQuery2中,您将获取0,在jQuery3中,您将获得2.
DATA()
- 另一个重要变化是关于data()方法的。它已被更改为符合 Dataset API specifications的方法。 jQuery3将所有属性的key值变更为camel case。要理解这种变化,请考虑以下代码:
1 | <div id="container"></div> |
- 如果您使用的是jQuery3之前的版本,你可以这么写:
1 | var $elem = $('#container'); |
- 在控制台你将得到如下输出:
1 | {my-property: "hello"} |
- 但是如果您使用jQuery3,将得到:
1 | {myProperty: "hello"} |
- 注意,jQuery3属性的名称是camel case的,没有“-”符号,而以前的版本则有。
THE DEFERRED OBJECT
- jQuery3改变了递延对象的行为,是Promise对象的先驱,以提高其与promise/ A+对象的兼容性。这个对象和它的历史是很有趣的。为了更多地了解它,你可以阅读官方文档或阅读我的书,涵盖jQuery3的知识点。
- 在jQuery1.x和2.x中,回调函数中的未捕获异常被传递给一个异常中止程序的执行。不同于原生的Promise 对象,它会一层一层抛出异常,直到它达到window.onerror对象。如果你还没有为此函数定义事件(这是一种罕见的情况),异常消息会显示出来,程序流被终止。
- jQuery3遵循和原生的Promise对象相同的模式。因此,引发的异常被转换成一个rejection 对象并且执行失败情况下的回调函数。一旦完成,该过程继续,并且随后执行成功情况下的回调函数。
- 为了帮助您了解这种差异,让我们看一个小例子。考虑下面的代码:
1 | var deferred = $.Deferred(); |
- 在jQuery1和jQuery2中,只有第一个函数(抛出异常的那个函数)被执行。另外,因为我们没有定义任何window.onerror的处理函数,控制台消息将输出“Uncaught Error: An error”,程序执行将中止。
- 在jQuery3中,程序的行为是完全不同的。你会看到控制台消息显示“Failure 1”和“Success 2”。该异常由第一个失败处理函数来处理,一旦它已经被处理,接下来成功的函数可以被执行。
SVG 文件
- 没有jQuery版本,包括jQuery3,正式支持SVG文件。然而事实是,许多方法都可以工作,比如那些操纵类名称的函数,已在jQuery3中被更新。因此,在这个即将到来的jQuery版本,你就可以使用SVG文档的方法,如addClass()和hasClass()方法。
方法和属性已过时或删除
- 到目前我们介绍了jQuery3新增的功能,同时它也移除和弃用的几个功能。
弃用 BIND(), UNBIND(), DELEGATE() UNDELEGATE()方法
- on()方法以前曾经介绍过,是用来为提供一个统一的接口来代替jQuery的bind()、delegate()和 live()方法。同时,jQuery建议用off()提供的统一的接口来代替unbind(),undelegated()和die()方法。
- jQuery3弃用了所有的这些方法,将来的版本也不会重新使用。请在你的项目中专注于使用on() 和off()。
弃用LOAD(), UNLOAD() 和 ERROR()方法
- jQuery3弃用了LOAD(), UNLOAD() 和 ERROR()方法。这些方法其实早在jQuery1.8中就被弃用了,但并未被绝对禁止使用。如果你正在使用依赖于一个或一个以上的这些方法,升级到jQuery3则会破坏你的代码的可用性。因此,在决定升级前要注意。
弃用CONTEXT, SUPPORT 和 SELECTOR属性
- jQuery3 弃用了context, support和 selector属性。正如我在上一节中提到的,如果你还在项目中使用它们,升级到jQuery3会破坏你的代码的可用性。
Bug的修正
- jQuery3修复了以前版本中的一些重要的错误。在下面的部分,我将重点讲解两方面,这将使您的工作方式的巨大变化。
对于 width() 和height()函数不会有更多的四舍五入
- jQuery3修复了包括width()和height()等相关函数的bug。这些方法将不再舍入到最近的像素,这使得它在某些情况下难以定位。
- 要理解这个问题,举例来说,你有一个有100像素宽的容器元素,分成三等份,每一份为宽度为整体的三分之一(即33.333333%),在jQuery历史版本中,如果你要按照下面的代码获取每一份的宽度,你将会得到四舍五入后的宽度33像素。jQuery3中修复了这个bug,你将会得到一个浮点数。
1 | div class="container"> |
1 | $('.container div').width(); |
- WRAPALL()函数
- jQuery的新版本修复了一个wrapAll()方法的错误。在jQuery3之前的版本中,当向wrapAll()传递函数时,它独立包装jQuery的集合中的元素。换句话说,它的行为和向wrap()传递函数作用相同。
- 为了解决这个问题,因为函数被在jQuery3中仅仅被调用了1次,它没有通过jQuery的集合传递元素的索引。最后,函数上下文(this对象)将引用jQuery集合中的第一个元素。
下载jQuery3测试版本1
可通过如下URL下载
也可用npm下载:
1 | npm install jquery@3.0.0-beta1 |
结论
- 很多人说,jQuery已死,现代Web开发不会用到jQuery了。然而,它的发展仍在继续,但其78.5%的使用率的统计结果违背了这些说法。
- 在这篇文章中,我已经带您领略了jQuery3的新特性。正如您可能已经注意到,这个版本不会打破任何现有的项目,因为它不会引入许多重大更改。尽管如此,有一些更改在升级前需要牢记。第三方的依赖升级前,该项目的审查会帮助你发现任何异常行为或损坏的功能。
再次声明
- 本文是这篇文章的翻译,作者是Aurelio De Rosa,译者是饮水思源。
- 非常感谢作者分享jQuery3新特性,让我们对jQuery有了全新的认识和体验。