热门标签 | 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工具库,更是一种情怀。


推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
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社区 版权所有