jQuery 的横空出世,至今已有十个年头了,而它的长盛不衰显然不是没有理由的。jQuery 提供了极为友好的接口,使得开发者们可以方便地进行 DOM 操作、发起 Ajax 请求、生成动画……不一而足。此外,与 DOM API 不同的是,jQuery 采用了 。这意味着你可以在任何一个 jQuery 集合身上调用 jQuery 方法,而不用关心它到底包含了几个元素(不管是零个、一个或多个,都没问题)。
在未来的几周内,jQuery 就将抵达一个重要的里程碑——正式发布 3.0 版本。jQuery 3 修复了大量的 bug,增加了新的方法,同时移除了一些接口,并修改了少量接口的行为。在这篇文章中,我将为大家重点讲解 jQuery 3 所引入的那些最重要的变化。
New Features 新增特性In the following sections I’ll discuss the most important features added in jQuery 3.
我们先来讨论 jQuery 3 中最重要的几个新增特性。
for...of 循环在 jQuery 3 中,我们可以用 for...of 循环语句来迭代一个 jQuery 集合中的所有 DOM 元素。这种新的迭代方法是 ECMAScript 2015(即 ES6)规范中的一部分。这个方法可以对 “可迭代对象”(比如 Array、Map、Set 等)进行循环。
当使用这种新的迭代方法时,你在循环体内每次拿到的值并不是一个 jQuery 对象,而是一个 DOM 元素(译注:这一点跟 .each() 方法类似)。当你在对一个 jQuery 集合进行操作时,这个新的迭代方法可以少许改善你的代码。
为了搞清楚这种迭代方法到底是怎么工作的,我们来假设一个场景——你需要给页面中的每个 input 元素分配一个 ID。在 jQuery 3 之前,你可能会这样写:
var $inputs = $('input'); for(var i = 0; i < $inputs.length; i++) { $inputs[i].id = 'input-' + i; }
In jQuery 3 you can write:
而在 jQuery 3 中,你就可以这样写了:
var $inputs = $('input'); var i = 0; for(var input of $inputs) { input.id = 'input-' + i++; }
(译注:其实 jQuery 自己是有个 .each() 方法的,可读性也不赖。)
$.get() 和 $.post() 函数的新签名jQuery 3 为 $.get() 和 $.post() 这两个工具函数增加了新签名,从而使得它们和 $.ajax() 的接口风格保持一致。新签名是这样的:
$.get([settings]) $.post([settings])
settings 是一个对象,它包含多个属性。它的格式和你以前传给 $.ajax() 的参数格式是一样的。如果你想更清楚地了解这个参数对象,请参考 中的相关描述。
$.get() 和 $.post() 的参数对象与传给 $.ajax() 的参数相比,唯一的区别就是前者的 method 属性总是会被忽略。原因其实也很简单,$.get() 和 $.post() 本身就已经预设了发起 Ajax 请求的 HTTP 方法了(显然 $.get() 就是 GET,而 $.post() 就是 POST)。也就是说,正常人类应该是不会想用 $.get() 方法来发送一个 POST 请求的。
Consider the following code:
假设有以下一段代码:
$.get({ url: 'https://www.audero.it', method: 'POST' // This property is ignored // 这个属性将被忽略 });
Despite the method property, this statement won’t send a POST request but a GET request.
不管我们把 method 属性写成什么,这个请求总是会以 GET 的方式发出去的。
采用 requestAnimationFrame() 来实现动画所有现代浏览器(包括 IE10 及以上)。jQuery 3 将会在内部采用这个 API 来实现动画,以便达到更流畅、更省资源的动画效果。
unwrap() 方法jQuery 3 为 unwrap() 方法增加了一个可选的 selector 参数。这个方法的新签名是这样的:
unwrap([selector])
有了这个特性,你就可以给这个方法传入一个包含选择符表达式的字符串,用它来在父元素内进行匹配。如果存在匹配的子元素,则这个子元素的父层将被解除;如果没有匹配,则不进行操作。
Features Changed 有变更的特性jQuery 3 还修改了一些特性的行为。
:visible 和 :hiddenjQuery 3 将会修改 :visible 和 :hidden 过滤器的含义。只要元素具有任何布局盒,哪怕宽高为零,也会被认为是 :visible。举个例子,br 元素和不包含内容的行内元素现在都会被 :visible 这个过滤器选中。
因此,如果你的页面中包含如下的结构:
<div></div> <br />
然后运行以下语句:
console.log($('body :visible').length);
在 jQuery 1.x 和 2.x 中,你得到的结果会是 0;但在 jQuery 3 中,你会得到 2。
data() 方法