从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 对象的改进。就像更新第三方依赖所经常要面的那样,对项目一定要做一个复查,从而防止意外行为或功能崩溃的情况出现。
TypeScript 3.0 TypeScript 2.9 TypeScript 2.8 TypeScript 2.7 TypeScript 2.6 TypeScript 2.5 TypeScript 2.4 TypeScript 2.3 TypeScript 2.2 TypeScript 2.1 TypeScript 2.0 TypeScript 1.8 TypeScript 1.7 TypeS
更丰富的工作区工具 文档中的多个画板可以创建包含多达 100 个不同尺寸画板的多页文件。创建的多个画板,可以重叠、平铺或堆叠在一起。也可以单独或统一保存、导出和打印画板。多个画板将代替 “裁剪区域 ”工具。(请参阅第 31 页的 “使用多个画板 ”。) 资源 以选项卡形式排列的文档窗口和 “文档排列 ”面板 将多页文档以选项卡排列的形式显示或将其并排打开,这样就可以轻松进行比较或将项目从一个文档拖
3.1 与Nginx配置相关功能总体介绍 camel-admin与Nginx配置有关的功能主要有:站点管理,业务集群管理,Nginx集群管理。 这三个功能,与camel-admin界面导航栏及Nginx配置文件的对应关系如下: 站点管理: 对应Nginx配置中的server块 业务集群管理: 对应Nginx配置中的upstream块 Nginx集群管理管理: 不对应Nginx配置,对应着Nginx
了解 Illustrator 最新版本的新增功能。 Illustrator 2018 年 10 月版(版本 23.0)为设计人员和插图制作人员推出了一些激动人心的新功能。请阅读下文以了解这些新增功能的快速介绍以及提供详细信息的资源链接。 任意形状渐变 由 Adobe Sensei 提供支持 Illustrator 现在提供一个新的叫做任意形状的渐变类型,它提供了新的颜色混合功能,可以创建更自然
主要新增功能 2019 年 6 月版(版本 9.1) 用户界面更新 体验菜单栏、标签和评级的外观增强功能。使用“图像背景”滑块调整背景对比度。 代理服务器支持 可在代理环境中使用 Creative Cloud 库、Adobe Stock、Adobe Portfolio 和 Adobe Stock Contributor 等服务。 修复的问题 查找针对堆栈问题以及 PDF 输出颜色问题的修复。 透明
了解 Photoshop 最新版本的新增功能。 Photoshop 2018 年 10 月版(版本 20.0)推出了一些令设计人员、数字摄影师和插图制作人员心动无比的新增功能。请继续阅读有关这些新增功能的快速介绍以及包含了更多信息的资源链接。 注意: 现在,通过新增的自动更新功能,无论何时推出新版本,Creative Cloud 应用程序都会自动进行升级。您可以使用 Creative Cloud