昆明做网站找哪个公司好,网站流量报表,树莓派wordpress穿透,淘城汇网站谁做的文章目录 前言简介新增特性Use of requestAnimationFrame() for Animationsunwrap() 方法 有变更的特性data() 方法Deferred 对象SVG 文档 已废弃、已移除的方法和属性废弃 bind()、unbind()、delegate() 和 undelegate() 方法移除 load()、unload() 和 error() 方法移除 conte… 文章目录 前言简介新增特性Use of requestAnimationFrame() for Animationsunwrap() 方法 有变更的特性data() 方法Deferred 对象SVG 文档 已废弃、已移除的方法和属性废弃 bind()、unbind()、delegate() 和 undelegate() 方法移除 load()、unload() 和 error() 方法移除 context、support 和 selector 属性 已修复的 Bugwidth() 和 height() 的返回值将不再取整 结论后言 前言 hello world欢迎来到前端的新世界 当前文章系列专栏jQuery 博主在前端领域还有很多知识和技术需要掌握正在不断努力填补技术短板。(如果出现错误感谢大家指出) 感谢大家支持您的观看就是作者创作的动力 简介 jQuery 的横空出世至今已有十个年头了而它的长盛不衰显然不是没有理由的。jQuery 提供了极为友好的接口使得开发者们可以方便地进行 DOM 操作、发起 Ajax 请求、生成动画……不一而足。此外与 DOM API 不同的是jQuery 采用了 “混合模式”。这意味着你可以在任何一个 jQuery 集合身上调用 jQuery 方法而不用关心它到底包含了几个元素不管是零个、一个或多个都没问题。 jQuery 3 修复了大量的 bug增加了新的方法同时移除了一些接口并修改了少量接口的行为。 新增特性
我们先来讨论 jQuery 3 中最重要的几个新增特性。 for…of Loop 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;
}而在 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() 本身就已经预设了发起 Ajax 请求的 HTTP 方法了显然 $.get() 就是 GET而 $.post() 就是 POST。也就是说正常人类应该是不会想用 $.get() 方法来发送一个 POST 请求的。
假设有以下一段代码
$.get({url: http://www.w3cschool.cn,method: POST // 这个属性将被忽略
});不管我们把 method 属性写成什么这个请求总是会以 GET 的方式发出去的。
Use of requestAnimationFrame() for Animations
采用 requestAnimationFrame() 来实现动画 所有现代浏览器包括 IE10 及以上都是支持 requestAnimationFrame的。jQuery 3 将会在内部采用这个 API 来实现动画以便达到更流畅、更省资源的动画效果。
unwrap() 方法
jQuery 3 为 unwrap() 方法增加了一个可选的 selector 参数。这个方法的新签名是这样的
unwrap([selector])有了这个特性你就可以给这个方法传入一个字符串其内容为选择符表达式用它来对当前元素的父元素进行匹配。如果匹配则父元素这一层将被剥除如果不匹配则不进行任何操作。
有变更的特性
jQuery 3 还修改了一些特性的行为。
:visible 和 :hidden jQuery 3 将会修改 :visible 和 :hidden 过滤器的含义。只要元素具有任何布局盒哪怕宽高为零也会被认为是 :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 idcontainer/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 对象的行为。Deferred 对象可以说是 Promise 对象的前身之一它实现了对 Promise/A 协议 的兼容。这个对象以及它的历史都相当有意思。如果想要深入了解你可以去阅读 jQuery 官方文档 或者
《jQuery 实战第三版》——这本书也涵盖了 jQuery 3。
在 jQuery 1.x 和 2.x 中传给 Deferred 的回调函数内如果出现未捕获的异常会立即中断程序的执行译注即静默失败其实 jQuery 绝大多数回调函数的行为都是这样的。而原生的 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 中也得到了更新。因此在 jQuery 3 中你应该可以放心使用诸如 addClass() 和 hasClass() 这样的方法来操作 SVG 文档了。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 彻底抛弃了1 load()、unload() 和 error() 1等已经标记为废弃的方法。这些方法在很早以前从 jQuery 1.8 开始就已经被标记为废弃了但一直没有去掉。如果你正在使用的某款插件仍然依赖这些方法那么升级到 jQuery 3 会把你的代码搞挂。因此在升级过程中请务必留意。
移除 context、support 和 selector 属性
jQuery 3 彻底抛弃了 context、support 和 selector 等已经标记为废弃的属性。同上在升级到 jQuery 3 时请留意你正使用的插件。
已修复的 Bug
jQuery 3 修复了以往版本中的一些非常重要的 bug。在本节中我将着重介绍其中两处因为这两者应该会对你写代码的习惯带来显著影响。
width() 和 height() 的返回值将不再取整
jQuery 3 修复了 width()、height() 和其它相关方法的一个 bug。这些方法的返回值将不再舍入取整因为这种取整行为在某些情况下不便于对元素进行定位。
我们来详细看一看。假设你一个宽度为 100px 的容器元素它包含了三个子元素宽度均为三分之一即 33.333333%
div classcontainerdivMy name/divdivis/divdivAurelio De Rosa/div
/div在 jQuery 3 以前的版本中如果你尝试通过以下代码来获取子元素的宽度
$(.container div).width();那么你得到结果将是 33。原因在于 jQuery 会把 33.33333 这个值取整。而在 jQuery 3 中这个 bug 已经被修复了因此你将会得到更加精确的结果即一个浮点数。 wrapAll() 方法 jQuery 3 还修复了 wrapAll() 方法中的一个 bug这个 bug 出现在把一个函数作为参数传给它的情况下。在 jQuery 3 以前的版本中当一个函数被传给 wrapAll() 方法时它会把 jQuery 集合中的每个元素单独包裹起来。换句话说这种行为和把一个函数传给 wrap() 时的行为是完全一样的。
在修复这个问题的同时还引入了另外一个变更由于在 jQuery 3 中这个函数只会调用一次了那就无法把 jQuery 集合中每个元素都传给它。因此这个函数的执行上下文this将只能指向当前 jQuery 集合中的第一个元素
结论
很多人一直在唱衰 jQuery说它在现代网页开发中已经没有一席之地了。但不管怎样jQuery 的开发仍在继续客观的统计数据在排名前一百万名的网站中占有率高达 78.5%也让这些论调不攻自破。
在本文中我已经带你了解了一遍 jQuery 3 将会带来的一些重大变化。或许你已经察觉到了这个版本并不太可能搞挂你的既有项目因为它引入的破坏性变更其实寥寥无几。不过在升级到 jQuery 3 的过程中你还是有必要牢记一些关键点比如 Deferred 对象的改进等等。同样在升级某个第三方库时也有必要检查一下该项目的兼容性情况以便尽早发现任何非预期行为避免某些功能失效。
后言 创作不易要是本文章对广大读者有那么一点点帮助 不妨三连支持一下您的鼓励就是博主创作的动力