让我们看看jQuery 3.0有什么新玩意

704 查看

作为迄今为止最流行的 JavaScript 库,jQuery 为无数的 Web 开发者带来了福利。 jQuery 从 2006 年诞生至今,已经被许许多多的 Web 开发者运用在项目中,极大地方便了开发。

时间回到 2015 年 7 月, jQuery 3.0 发布了第一个测试版———这是长久以来的一次重要发布。让我们一起来看看 jQuery 中有什么新的东东,能帮我们更愉快地玩耍。

show() 和 hide()

show() 和 hide() 这两个函数的工作方式发生了重要的变化。 jQuery 这么做当然有他的理由。在过去,使用hide()会把元素的 CSS 属性 display设置为none,而使用show()会把这个元素清除。这么做就容易乱套。举几个例子:

  1. 如果一个元素的属性设为了display:inline ,而在另一个样式表中想通过使用show()方法,把属性变成 display:block,这种做法会破坏代码。
  2. 当我们设计响应式网站,进行媒体查询时,可能会通过使用display或者visibility属性来控制元素是否可见。这么做也会干扰show()hide()方法。

除了以上说的这两个以外,还能举出很多 jQuery 团队不得不填这个坑的例子。恶果就是运行效率下降、性能低下,所以 jQuery 团队推出了一种简单的模型。

这样一来,一旦把元素设置成display:none ,那么不管接下来你使用什么方法,show()slideDown()fadeIn() 还是其它类似的方法,你都没法让这个元素显示出来。控制元素可见性的最好方法是使用 addClass()removeClass() 方法。或者我们也可以在调用 ready() 的期间,调用元素的 hide() 方法。

用简单的例子说明一下:

 

.data() 的关键字命名

为了顺应 HTML5 数据集合的标准,jQuery 团队 改变了 .data() 的运行机制。如果 data-* 属性中的关键字中包含数字的话,这个数字不再参与转化。看看下面这个例子:

在 jQuery 2.1.4 中 :

控制台并没有显示出这个对象。

在 jQuery 3.0.0 中 :

由于数字不再转化成驼峰表示,所以关键字被转化成了 foo-42-name ,控制台输出了结果。可以在 fiddle 上观看演示 http://jsfiddle.net/nWCKt/25/ 。你可以改变 jQuery 版本,看看结果有什么不同。

同样道理,如果想通过不带参数的 data()方法来显示所有的 data 内容的话,我们发现如果在 data-* 属性中的关键名中,短线“-”后紧跟着一个数字的话,新旧版本的 jQuery 中参数的个数是不同的,正如上面的例子。

HTML:

JavaScript:

在 jQuery 3.0中,会显示对象{foo-42Name: “namebar”, foo-42Yes: “yesbar”}。但是在之前的版本中则只显示一个空的对象{}。

部分浏览器会返回 width 和 height 的像素值。现在不论是 .width(), .height(), .css(“width”), 还是 .css(“height”) ,只要是支持的浏览器, jQuery 都将返回十进制数。对于一直使用像素值设计网页的朋友们,可谓一件值得庆幸的好消息。

去掉了 .load()、 .unload() 和 .error() 方法

这些方法早都是老掉牙过时的了,现在终于从 jQuery 3.0.0 测试版中移除了。推荐做法是使用 .on() 方法来处理相应的事件。举一个简单的例子:

HTML:

老掉牙的做法(现在已经抛弃了这种做法)

现在推荐的做法:

jQuery 对象终于支持迭代了

从现在起,你可以用 ES2015 中的 for-of 对 jQuery 对象进行迭代。所以,你可以写出这样的代码:

(源代码请戳这里)

jQuery 动画现在在后台使用 requestAnimationFrame API

所有的现代浏览器现在都支持 requestAnimationFrame (详见: http://caniuse.com/#search=requestAnimationFrame)。由于 requestAnimationFrame 的普及度如此之广,jQuery 使用这个 API 来执行动画操作。它的优点包括支持更平滑的动画和更少的 CPU 密集型动画(也就是说能节省移动设备的电量)。

.unwrap() 方法的增强

.unwrap() 方法可以让你移除 DOM 中匹配元素的父节点,但这个方法在以前都不能接收参数。如果想基于父节点的条件来执行 .unwrap() 的话,就会遇到麻烦。

在 jQuery 3.0.0 测试版中, jQuery 3.0.0 alpha能接受 jQuery 选择器的参数,这个问题也就迎刃而解了。

将 jQuery.Deferred 更新成可兼容 Promises/A+

promise 是一个异步操作的的最终结果 —— 它指的是这样一个对象,它能保证在将来产生一个结果。和 promise 互动的主要方式是通过 then 方法,then 方法注册了回调函数。在 JavaScript 中使用 Promise 来实现异步已经变得越来越流行。Promises/A+ 是交互的 JavaScript promises 的一个开放标准。(更多详细信息,请戳这里:https://promisesaplus.com/

在 jQuery 文件中, Deferred 对象是一个可链接适用对象,通过调用jQuery.Deferred() 方法创建。它能注册多个回调函数到回调队列中,引发回调队列,并能传递每个同步或异步函数的成果获失败状态。在 jquery 3.0.0 测试版中,更新了jQuery.Deferred 对象,来兼容 Promises/A+ 和 ES2015 Promises。所以, .then()方法也有了重大的变化。

更好的错误处理能力

这版的 jQuery 能更好地处理错误事例 —— 被忽略的不正确的请求,抛出错误。

比如:根据相关标准文件, offset属性代表了匹配元素中第一个元素的坐标。如果你想获取 window 的 offest 属性值的话,老版本的 jQuery 回返回结果{top: 0, left: 0} ,并没有报错。但是我们知道 window 的 offset 属性本身是没意义的。所以在 3.0 测试版中,更正了这个错误,获取 window 的 offest 属性值的话就会报错

另外一个例子: $("#") 现在会报错,而不再是返回一个长度为 0 的集合。

定制选择器( 比如 :visible )速度的大幅度提升

在 DOM 中多次使用 :visible 等等选择器的性能已经有了很大的提升。这其实是缓存发挥了作用 —— 所以在第一处使用选择器的地方,性能并没有提升。但是,在后面每个调用选择器的地方,性能都得到了巨大的提升,缓存在这里发挥着功不可没的作用。 jQuery 团队的 Timmy Willison 指出由于缓存的作用, :visible 选择器性能提升了大约 17 倍。

以上都是新版中的重要更新。完整的更新列表请参见官方博客: http://blog.jquery.com/2015/07/13/jquery-3-0-and-jquery-compat-3-0-alpha-versions-released/

下载新版本的途径

本次发布了两个版本:

  1. jQuery 3.0, 支持现代浏览器 : https://code.jquery.com/jquery-3.0.0-alpha1.js
  2. jQuery Compat 3.0, 还能兼容支持 IE8 : https://code.jquery.com/jquery-compat-3.0.0-alpha1.js

同时也可以通过 npm 安装

安装指令:

欢迎试用新版本,可以在 https://github.com/jquery/jquery 网站反馈信息。真的值得一用哦!

Web 开发的更多实战

本文属于本文属于微软公司 web 开发系列文章,该系列关注实践 JavaScript 学习、开源项目以及 Microsoft Edge 浏览器和新版 EdgeHTML 渲染引擎的最佳互操作实践。

我们欢迎你在装有 Microsoft Edge 的浏览器和设备上测试 —— Microsoft Edge 是 Windows 10 的默认浏览器, dev.microsoftedge.com 网站提供了许多相关的免费工具:

更多深入的学习请移步大神们的文章:

我们社区的开源项目:

更多的免费工具和后端 web 开发工具: