jQuery 3 中的新增功能汇总介绍


Posted in Javascript onJune 12, 2016

从jQuery 震撼整个 Web ,至今已有十年了,我们有很好的理由一直坚持使用维护它。jQuery为用户提供了 DOM 进行操作,执行 Ajax 请求,创建动画等等,极为友好的接口。此外,与 DOM API 不同的是,jQuery 采用了 复合模式(composite pattern)。 正因为如此,你可以在一个jQuery集合上调用jQuery方法,而不用担心集合包含的元素数量(零,一个或多个)。

在未来的几周内,随着 jQuery 3 的发布,jQuery 会到达一个重要的里程碑。jQuery 3 修复了很多 bug,增加了新的方法,弃用并移除了一些功能,并改变了一些功能的行为。在这篇文章中,我重点讲解jQuery 3所带来的一些最大的变化。

新特性(New Features)

在下面的章节中,我将讨论jQuery 3中新增的重要特性。

for…of 循环

jQuery 3 将提供for...of循环语句,可以用来遍历一个jQuery集合所有的 DOM 元素。这种新的迭代器ECMAScript 2015(又名的ECMAScript6)规范的一部分。它能实现对可遍历对象(包括 Array、Map、Set 等)的循环。

当使用这个新的迭代方法时,您每次接收的值不是一个jQuery集合,而是一个DOM元素。当你对一个jQuery集合执行操作时,这个新的迭代方法可以少许改善你的代码。

为了理解这个迭代方法是如何工作的,假设你想给页面中每个input元素分配一个 ID。在 jQuery 3 之前,你可以这样写:

var $inputs = $('input');
 
for(var i = 0; i < $inputs.length; i++) {
  $inputs[i].id = 'input-' + i;
}

而在 jQuery 3 中,你可以这样写:

var $inputs = $('input');
var i = 0; 
 
for(var input of $inputs) {
  input.id = 'input-' + i++;
}

$.get() 和 $.post()的新签名

jQuery 3 为 $.get() 和 $.post() 工具函数增加了新签名,为的是使得它们和 $.ajax() 的接口风格保持一致。新签名是这样的:

$.get([settings])
 
$.post([settings])

settings 是一个可以具有许多属性的对象。这是对象和 提供给$.ajax() 的对象 是相同的。更多详细的介绍,详细介绍,请参考 $.ajax()页面。
传递给$.get() 和 $.post() 的对象,跟传递给 $.ajax() 的对象相比,唯一的区别是前者 method 属性总是会被忽略。其原因是,$.get() 和 $.post() 都有一个预设的HTTP方法来执行Ajax请求( $.get() 用 GET,而 $.post() 用 POST)。一般说来,你不要用 $.get()尝试发送 POST 请求。

考虑下面这段代码:

$.get({
  url: 'https://www.audero.it',
  method: 'POST' // This property is ignored
});

尽管设置了method属性,该语句还是不能发送 POST 请求,而只能发送 GET 请求。

采用 requestAnimationFrame() 来实现动画

所有现代浏览器,包括Internet Explorer10及以上版本,都支持 requestAnimationFrame。jQuery 3 将会在内部采用这个 API 来实现动画,以便达到更流畅、更省CPU资源的动画效果。

unwrap()

jQuery 3 为 unwrap() 方法增加了一个可选的选择器参数。这个方法的新签名为:

unwrap([selector])

有了这一变化,你就可以传入包含一个选择器表达式的字符串,在父元素内进行匹配。如果存在匹配,匹配的子元素将被解包;否则,不进行任何操作。

被变更的特性

jQuery 3 还修改了一些特性的行为。

:visible 和 :hidden

jQuery 3修改了 :visible 与 :hidden 过滤器的含义。只要元素具有任何布局盒,包括那些宽度和/或高度为0的情况,则元素被认为是:visible。比如说,br 元素和没有内容的内联元素进可以通过 :visible 过滤器进行选择。

所以,假如页面有如下标记:

<div></div>
<br />

然后执行下面的语句:

console.log($('body :visible').length);

在 jQuery 1.x 和 2.x 中,你得到的结果会是 0;但在 jQuery 3 中,你会得到 2。

data()

另一个重要变化是跟 data() 方法的行为有关。调整主要是为了让该方法符合 Dataset API 规范。jQuery 3 将所有属性的键都改为驼峰式大小写形式。要理解这个变化,先看下面这个例子。

<div id="container"></div>

如果你使用 jQuery 3 之前的版本,你可以写如下代码:

var $elem = $('#container');
 
$elem.data({
  'my-property': 'hello'
});
console.log($elem.data());

您将在控制台上获得如下结果:

{my-property: "hello"}

而在jQuery 3 中,你会获得如下结果:

{myProperty: "hello"}

请注意,在 jQuery 3 中,属性名已经变成了驼峰形式,没有横杠(连字符);而在以前的版本中,属性名会保持全小写,并原样保留横杠(连字符)。

Deferred 对象

jQuery 3改变了Deferred 对象的行为,Promise 对象的前身,改善与 Promise/A+ 提案的兼容性。这个对象及其历史非常有意思,你可以读读官方文档,或者看看我的书 《jQuery 实战,第 3 版》,这本书也涵盖了 jQuery 3。

在 jQuery 1.x 和 2.x 中,传入 Deferred 中的回调函数中如果出现未捕获异常,会导致程序停止执行。而原生的 Promise 对象并非如此,它会抛出异常,并不断向上冒泡,直至到达 window.onerror(通常)。如果你没有定义一个函数来处理这个错误事件的话(通常我们都不会这么做),则会显示异常消息,程序终止执行。

jQuery 3 会遵循原生的 Promise 对象的模式。因此,抛出的异常将被视为一个失败状态(rejection),从而执行失败回调。完成之后,整个进程就继续执行,后续的成功回调将被执行。

为了让你更好地理解这个差异,让我们来看一个小例子。考虑下面的代码:

var deferred = $.Deferred();
 
deferred
 .then(function() {
  throw new Error('An error');
 })
 .then(
  function() {
   console.log('Success 1');
  },
  function() {
   console.log('Failure 1');
  }
 )
 .then(
  function() {
   console.log('Success 2');
  },
  function() {
   console.log('Failure 2');
  }
 );
 
deferred.resolve();

在 jQuery 1.x 和 2.x 中,只执行第一个函数(抛出错误的函数)会被执行到。此外,由于我们没有为 window.onerror 定义任何事件处理函数,所以控制台将输出消息:“Uncaught Error: An error”,而且程序的执行将中止。

而在 jQuery 3 中,行为则完全不同的。你将在控制台中看到 “Failure 1” 和 “Success 2” 两条消息。异常将会被第一个失败回调处理,一旦被处理,则继续执行下面的成功函数。

SVG 文档

没有哪一个 jQuery 版本,包括 jQuery 3,正式支持 SVG 文档。不过事实上有很多方法是可以正常工作的,另外一些方法,比如操作类名的方法,已经在 jQuery 3 中进行了更新,因此也适用。因此,在未来的版本中,你应该可以放心使用诸如 addClass() 和 hasClass() 这样的方法来操作 SVG 文档了。

已废弃、已移除的方法和属性

除了前面说的改进,jQuery 也移除、废弃了一些特性。

废弃bind(),unbind(),delegate()和undelegate()

jQuery 以前引入的 on() 方法提供了统一的访问接口,取代  bind()、delegate() 以及 live() 方法。与此同时,jQuery 用 off() 方法来取代 unbind()、undelegated() 及 die() 方法。bind()、delegate()、unbind() 和 undelegate() 今后不建议使用,但是并没有采取进一步的行动。

jQuery 3 已经废弃这些方法,并计划在未来的版本(可能是 jQuery 4)中移除它们,要坚持在项目中使用 on() 和 off() 方法,这样你就不用担心未来版本的变更了。

移除 load(), unload() 和 error()方法

jQuery 3 彻底抛弃了已经废弃的 load()、unload() 和 error() 方法。这些方法在很早以前(从 jQuery 1.8 开始)就已经被标记为废弃了,但仍一直存在。如果你正在使用的插件仍然依赖这些方法,那么升级到 jQuery 3 的时候,代码就会出错。因此,在升级过程中要注意。

移除 context, support 和 selector

jQuery 3 彻底抛弃了已经废弃的 context、support 和 selector 属性。如前所述,如果项目中仍然使用着这些属性,或者某个插件仍在依赖这些属性,那么更新到 jQuery 3 时,代码就会出错。

Bugs 修复

jQuery 3 修复了以前版本中的一些重大 Bug。在下面的章节中,我将着重介绍其中两处,因为这两处会对你的编码产生重大影响

width() 和 height()的返回值不再四舍五入

jQuery 3 修复了 width()、height() 和其它相关方法中的一个 bug。这些方法的返回值将不再四舍五入取整到像素了,因为,这使得在某些情况下很难,对元素进行定位。

要理解这个问题,让我们假设你有一个具有100像素的宽度的容器元素,这个元素有宽度均为三分之一(即 33.333333%)的3个子元素:

<div class="container">
  <div>My name</div>
  <div>is</div>
  <div>Aurelio De Rosa</div>
</div>

在 jQuery 3 以前的版本中,如果你尝试通过以下代码来获取子元素的宽度……

$('.container div').width();

……那么你得到结果将是 33。原因在于 jQuery 会将 33.33333 这个值四舍五入取整。而在 jQuery 3 中,这个 Bug 已经得到修复,你的结果会更精确(比如会得到浮点数)。

wrapAll()

jQuery的新版本中还修复 wrapAll() 方法的一个bug,这个bug会在传递一个函数给 wrapAll() 方法时发生。在 jQuery 3 以前的版本中,当一个函数被传给 wrapAll() 方法时,它会把 jQuery 集合中的每个元素单独包裹起来。换句话说,这种行为和把一个函数传给 wrap() 时的行为是完全一样的。

除了修复这个问题,因为这种函数在 jQuery 3 中只会被调用一次,所以jQuery 集合元素的索引不可能被传入。最后,该函数上下文(this)将指向 jQuery 集合中的第一个元素。

下载 jQuery 3

您可以从jQuery CDN获取文件,或者直接访问链接:

https://code.jquery.com/jquery-3.0.0.js
https://code.jquery.com/jquery-3.0.0.min.js
您也可以从以下npm获得更新:

npm install jquery@3.0.0

总结

很多人在说jQuery 已死,认为在现代网页开发中已经没有一席之地了。然而,jQuery 的开发仍在继续,客观的统计数据(在排名前一百万名的网站中占有率高达 78.5%)驳斥这些说法。

在本文中,我已经带你了解了一遍 jQuery 3 将会带来的一些重大变化。或许你已经注意到了,这个版本是可能对你现有的项目产生太大的影响,因为没有引入太多许多重大更改。尽管如此,仍然需要注意一些因素,比如 Deferred 对象的改进。就像更新第三方依赖所经常要面的那样,对项目一定要做一个复查,从而防止意外行为或功能崩溃的情况出现。

Javascript 相关文章推荐
JavaScript设置FieldSet展开与收缩
May 15 Javascript
jQuery实现图片信息的浮动显示实例代码
Aug 28 Javascript
可选择和输入的下拉列表框示例
Nov 05 Javascript
jquery统计输入文字的个数并对其进行判断
Jan 07 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
Jan 08 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
Jun 24 Javascript
AngularJS读取JSON及XML文件的方法示例
May 25 Javascript
layui中layer前端组件实现图片显示功能的方法分析
Oct 13 Javascript
jquery动态添加带有样式的HTML标签元素方法
Feb 24 jQuery
用node开发并发布一个cli工具的方法步骤
Jan 03 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
JavaScript_ECMA5数组新特性详解
Jun 12 #Javascript
喜大普奔!jQuery发布 3.0 最终版
Jun 12 #Javascript
浅谈JavaScript变量的自动转换和语句
Jun 12 #Javascript
浅谈jquery点击label触发2次的问题
Jun 12 #Javascript
Bootstrap学习笔记之js组件(4)
Jun 12 #Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 #Javascript
JavaScript手机振动API
Jun 11 #Javascript
You might like
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
jscript之List Excel Color Values
2007/06/13 Javascript
JS Array对象入门分析
2008/10/30 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
python中的字典操作及字典函数
2018/01/03 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
Python 错误和异常代码详解
2018/01/29 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
python 两个数据库postgresql对比
2019/10/21 Python
python验证码图片处理(二值化)
2019/11/01 Python
Python实现数值积分方式
2019/11/20 Python
Pycharm调试程序技巧小结
2020/08/08 Python
Django配置跨域并开发测试接口
2020/11/04 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
普通大学毕业生自荐信
2013/11/04 职场文书
农村党员一句话承诺
2014/05/30 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
初中运动会前导词
2015/07/20 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
带你学习MySQL执行计划
2021/05/31 MySQL
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL