热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jQuery3.0带来哪些新特性

2016年6月9日jQuery官方团队发布了jQuery3.0的最终版本,这是一个重要的里程碑。jQuery作为驰骋web界已有十年的大神之作,其在前端领域的深远影响和贡献已无法形容

2016年6月9日 jQuery 官方团队发布了 jQuery 3.0 的最终版本,这是一个重要的里程碑。jQuery 作为驰骋 web 界 已有十年的大神之作,其在前端领域的深远影响和贡献已无法形容。

jquery-official-website

jQuery 让开发者更便利的操作 DOM、执行 AJAX 请求 以及创建炫酷的 动画 等。另外,它还实现了 “复合模式” composite pattern,你可以在元素集合 或单个元素上 调用 jQuery 方法。

jQuery3 修复了很多bug,增加了一些新方法,弃用了一些旧方法,对一些方法的行为做了优化和更改。现在 最新最稳定的版本是 jQuery-3.1.0,让我们一起来具体瞧瞧 jQuery3 带来哪些最重要的变化:

新特性

for…of 循环

jQuery3 提供了遍历 jQuery 集合中 DOM 元素 使用最新 for…of 方法的可能性,这个最新的迭代器 是ECMAScript 2015 (ES6) 规范中的部分。当你使用  for…of 循环时,你所遍历得到的值并不是一个 jQuery集合,而是一个 DOM 元素。这个迭代器 能在一定程序上 稍稍提高你操作 DOM 的效率。

为了了解这个迭代器是如何工作的,让我们假设 你想为页面上每个 input 元素设置一个 id,在 jQuery3 之前,你可能会这样写:

var $inputs = $('input');

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

在jQuery3中,你可以这样写:

var $inputs = $('input');
var i = 0;

// input 的值并不是一个 jQuery 对象,而是一个原生 dom 节点
for(var input of $inputs) {
input.id = 'input-' + i++; // 等同于:先+i 再i++
}

关于 for…of,想进一步了解 请看 深入学习迭代器和for-of循环。

$.get() 和 $.post() 增加了新的参数类型 [settings]

jQuery3 为 $.get() 和 $.post() 方法增加了新的参数类型 [settings],[settings] 是一个对象 同样可以提供给 $.ajax() 方法。

// 以前我们通常这样写:
$.post('test.php', { name: 'David Guetta', age: 49 }, function (data) {
console.log(data);
});

// jQuery3 中可以这样写:
$.post({
url: 'test.php',
data: { name: 'David Guetta', age: 49 },
success: function (data) {
console.log(data);
}
});

和 $.ajax() 唯一不同的是:如果 $.get() 和 $.post() 的 [settings] 中传递了 method 属性,method 的属性值将被忽略掉,原因是 $.get() 和 $.post() 都有预设的 HTTP 方法来执行 Ajax 请求($.get() 是GET,$.post() 是 POST)

思考下面的代码:

// 不管你将 method 的值设为 'GET' 或 'POST' 都会被忽略,$.get() 也不会发起 POST 请求的
$.get({
url: 'https://www.audero.it',
method: 'POST'
});

动画使用了 requestAnimationFrame()

jQuery 之前使用 setInterval 通过不断更新元素的 CSS 属性 产生动画,每次更新时 会迫使浏览器对页面进行重绘 (reflow),一般显示器 16.7ms 刷新一次 如果在这间隔期间有其他的 setInterval 请求,就会导致”帧”丢失,造成动画卡顿。而 requestAnimationFrame 会根据浏览器的绘制时间 对动画进行不断优化,使动画流畅并减少对CPU资源的消耗。

现在,几乎所有的现代浏览器 包括 IE-10 及以上版本,都支持 requestAnimationFrame,jQuery3 将会在内部使用这个 API 执行动画。

unwrap()

jQuery3 为 unwrap() 方法增加了一个可选参数 selector,你可以通过这个字符串选择器匹配元素的父元素 如果匹配到 则移除父元素 否则就不移除:

<div class="wrap"><p>p>div>

<div><p>p>div>
// 移除 p 元素的 class="wrap" 的父元素,上面 html 中 只有第一个 div 会被移除
$('p').unwrap('.wrap');

改变的特性

:visible 和 :hidden

新版的 jQuery 修改了 :visible 和 :hidden 过滤器的定义。任何可用于布局的元素 即使它们的高度宽度为0,都会被认为是 :visible,例如:br 元素和没有内容的内联元素,现在都会被 :visible 过滤器匹配。

思考下面代码:

<div>div>
<br>
<span>span>
// 在 jQuery1.x 中控制台输出 1
// 在 jQuery3 中控制台输出 3
// 区别在于:jQuery3 中 内联元素也会被 :visible 过滤器匹配
console.log($('body :visible').length);

data()

另一个重要的变化是有关data()方法的行为。jQuery3 严格遵守 Dataset API 规范。将所有data-属性的键都转成驼峰式命名方式。下面的代码展示了这个变化:

<div id="container">div>

如果你使用的是 jQuery3 之前的版本,你可能会这样写:

var $elem = $('#container');

$elem.data({
'my-property': 'hello'
});

console.log($elem.data());

控制台会输出:

{my-property: "hello"}

但使用了 jQuery3,控制台会输出:

{myProperty: "hello"}

注意:在 jQuery3 中属性名已经变成了驼峰式,在以前的版本中,对于自定义 data 属性,你可能会这样写:data-my-property,但在版本3中,建议改成驼峰式:data-myProperty

Deferred 对象

deferred 对象是由jQuery创造的回调函数解决方案,defer 中文译为”延迟”,所以 deferred 对象的含义就是”延迟”到未来某个点再执行。jQuery3 改变了 deferred 对象的行为,deferred 对象其实是 ES6 Promise 对象的前身,这次改变提高了 deferred 对象本身对 Promise/A+ 提案的兼容性。

在 jQuery1.x 和 2.x 中,传递给 deferred 的回调函数内如果出现未捕获的异常,就会阻断程序的执行。不像原生 Promise 对象那样会抛出异常冒泡至 window.onerror(通常冒泡到这里)。如果你没有定义一个函数处理错误事件(通常我们是会处理的),那么异常信息就会显示并且程序会终止执行。

jQuery3 遵循原生 Promise 对象的模式。因此,抛出的异常被当作失败,接着失败回调函数被执行。一旦失败回调函数执行完成,进程就会继续,下面的成功回调函数将被执行。

为了帮助你理解两者的区别,看一个小例子:

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();

在 jQuery1 和 jQuery2 中,当执行到第一个函数就停止了。控制台会输出“Uncaught Error: An error”,程序会终止执行:

jquery-3-deferred-1

jQuery3 中,行为是完全不同的。控制台输出 “Failure 1” 和 “Success 2”,异常被第一个失败回调函数处理,并且一旦被处理,随后的成功回调函数也会被执行。

jquery-3-deferred-2

SVG

包括 jQuery3 在内 至今没有任何版本的 jQuery 正式支持 SVG documents,然而 还是有很多方法可以正常使用的,在之前的 jQuery 的版本中 不能正常使用类名操作,但 jQuery3 中可以了,你可以在新版本中放心使用 addClass() hasClass() 方法了。

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

废弃了 bind()、unbind()、delegate() 和 undelegate()

可能有人搞不明白”废弃”和”移除”这两词的区别,”废弃” 是指一些方法还在存在于 jQuery 源码中,但是已经提供了新方法来替换那些方法,而 “移除” 就是一些方法已经从 jQuery 源码中删除了。

jQuery 在1.7版本 就引入了 on() 方法,它提供了统一的接口来替换 bind()、delegate() 和 live() 方法,与此同时 提供了 off() 方法替换 unbind()、undelegated() 和 die() 方法。建议使用 on() 和 off() 来替代它们。

jQuery3 废弃的这些方法 打算在未来的版本中(也许是 jQuery4)移除它们。所以你在项目中使用 on() 和 off() 方法,就不用担心未来的版本更新问题。

移除了 load()、unload() 和 error() 方法

其实在 jQuery1.8 时,这些方法就被废弃了,但当时还存在于 jQuery 源码中,从 jQuery3 开始,这些方法就被彻底移除了。如果你使用的第三方插件 依赖了这些方法,将会报错。因此,升级时,还是注意下吧。

移除 context、support 和 selector 属性

jQuery3 移除了已经废弃的 context、support 和 selector 属性。

Bug 修复

jQuery3 修复了以前版本中被认为存在的重大bug,尤其是 width(),height() 和 wrapAll()。

移除了 load()、unload() 和 error() 方法

width() 和 height() 及所有其它相关方法 将不再将结果的像素值四舍五入到一个整数值,因为四舍五入后在某些情况下很难对元素进行定位。

为了理解,假设页面里有一个宽度为100px的容器元素,它里面包含三个宽度为三分之一(33.3333%)的元素:

<div class="container">
<div>My namediv>
<div>isdiv>
<div>Aurelio De Rosadiv>
div>
.container div {
width: 33.3333%;
}

然后去获取 “.container” 元素内部的 div 宽度:

var width = $('.container div').width()
console.log(width);

在 jQuery3 之前的版本,你得到的 width 值是33,因为 jQuery 将33.3333这个值四舍五入了,在 jQuery3 中,这个 bug 被修复了,你会得到一个更精确的值(浮点数)。

jquery-3-bug-1

下载 jQuery3

读了这篇文章,你肯定想要尝试下载 jQuery3。可以访问下面两个官方url来下载,目前最新最稳定的是 jQuery-3.1.0:

  • Non-minified version:https://code.jquery.com/jquery-3.1.0.min.js
  • Minified version:https://code.jquery.com/jquery-3.1.0.js

有人认为随着web前端技术的发展,jQuery将会沉默,然而它缺一直在持续发展进化,有项官方数据:在排名前100万的网站中 jQuery 的使用率高达78.5%,很显然 这个数据反驳了这些说法。快到2016年末了,可能对于已经使用 jQuery 五年的我,jQuery 不仅是大部分项目中不可或缺的js工具库,更是一种情怀。


推荐阅读
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 本文全面解析了JavaScript中的DOM操作,并提供了详细的实践指南。DOM节点(Node)通常代表一个标签、文本或HTML属性,每个节点都具有一个nodeType属性,用于标识其类型。文章深入探讨了DOM节点的创建、查询、修改和删除等操作,结合实际案例,帮助读者更好地理解和掌握DOM编程技术。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 2018年在北航听陈博士讲解时,对重入漏洞有了初步了解。最近重温了慢雾科技的相关文章,发现他们对重入漏洞的解释非常清晰明了。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 本文深入解析了 jQuery 中用于扩展功能的三个关键方法:`$.extend()`、`$.fn` 和 `$.fn.extend()`。其中,`$.extend()` 用于扩展 jQuery 对象本身,而 `$.fn.extend()` 则用于扩展 jQuery 的原型对象,使自定义方法能够作为 jQuery 实例的方法使用。通过这些方法,开发者可以轻松地创建和集成自定义插件,增强 jQuery 的功能。文章详细介绍了每个方法的用法、参数及实际应用场景,帮助读者更好地理解和运用这些强大的工具。 ... [详细]
  • 为开发者提供了一系列实用的参考网站和资源链接,包括HTML速查手册( 和 ),帮助开发者快速查找和学习相关技术知识。此外,还涵盖了其他重要的开发工具和文档,为编程工作提供全面支持。 ... [详细]
author-avatar
2102球地转反
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有