區別:1、2.x不再更新,官方只做BUG維護,功能不再新增;3.x是官方主要更新維護的版本,功能持續新增。2、3.x支援「for...of 」迴圈語句,2.x不支援「。3、2.x利用setInterval來實現動畫,3.x支採用requestAnimationFrame()來實現動畫。4、3.x中width()和height()將不再將結果的畫素值四捨五入到一個整數值。
前端(vue)入門到精通課程:進入學習
本教學操作環境:windows7系統、jquery3.6.1版本、Dell G3電腦。
jQuery 自 2006 年誕生以來,一個發行了 1.x、2.x、3.x 這三個大版本。而在這三個大版本下又細分了許多小版本。可能有些小夥伴不太清楚這些版本有什麼區別?實際開發中應該選用哪個版本?下面我對其做個總結。
(1)情況分析
2.x、3.x:不支援 ie6、ie7、ie8
2.X不相容ie678,很少有人使用,官方只做BUG維護,功能不再新增。如果不考慮相容低版本的瀏覽器可以使用2.x,最終版本:2.2.4 (2016年5月20日)
3.X不相容ie678,只支援最新的瀏覽器。除非特殊要求,一般不會使用3.x版本的,很多老的jQuery外掛不支援這個版本。目前該版本是官方主要更新維護的版本。
(2)選擇建議
(1)情況分析
(2)選擇建議
(1)2.x 相較於 1.x 沒有增加什麼新特性,主要是去除了 ie678 的支援,提升了效能,減小了體檢。
(2)3.x 相較於之前版本,增加了許多新特性,也改變一些以往的特性。
版本號 | 釋出日期 | 最新更新 | 大小(KB) | 備註 |
1.0 | 2006年8月26日 | 第一個穩定版本 | ||
1.1 | 2007年1月14日 | |||
1.2 | 2007年9月10日 | 1.2.6 | 54 | |
1.3 | 2009年1月14日 | 1.3.2 | 55.9 | 將 Sizzle 選擇器引擎引入核心 |
1.4 | 2010年1月14日 | 1.4.4 | 76 | |
1.5 | 2011年1月31日 | 1.5.2 | 83 | 延遲迴撥管理,ajax 模組重寫 |
1.6 | 2011年5月3日 | 1.6.4 | 89 | 顯著改善 attr() 與 val() 的效能 |
1.7 | 2011年11月3日 | 1.7.2 (2012年3月21日) | 92 | 新的事件 API:.on() 和 .off(),而舊的 API 仍然支援。 |
1.8 | 2012年8月9日 | 1.8.3 (2012年11月13日) | 91.4 | 重寫 Sizzle 選擇器引擎,改善動畫和 $(html, props) 的靈活性。 |
1.9 | 2013年1月15日 | 1.9.1 (2013年2月4日) | 90 | 移除棄用介面,清理程式碼 |
1.10 | 2013年5月24日 | 1.10.2 (2013年7月3日) | 91 | 修復了 1.9 和 2.0 beta 版本週期的 bug 和差異 |
1.11 | 2014年1月24日 | 1.11.3 (2015年4月28日) | 95.9 | |
1.12 | 2016年1月8日 | 1.12.4 (2016年5月20日) | 95 | |
2.0 | 2013年4月18日 | 2.0.3 (2013年7月3日) | 81.1 | 除去對 IE 6-8 的支援以提高效能,並降低檔案大小 |
2.1 | 2014年1月24日 | 2.1.4 (2015年4月28日) | 82.4 | |
2.2 | 2016年1月8日 | 2.2.4 (2016年5月20日) | 85.6 | |
3.0 | 2016年6月9日 | 3.0.0 (2016年6月9日) | 86.3 | Deferred、$.ajax、$.when 支援 Promises/A+,令 .data() 相容HTML5 |
3.1 | 2016年7月7日 | 3.1.1 (2016年9月23日) | 86.3 | 加入 jQuery.readyException,ready handler 錯誤現在不會不顯示了 |
3.2 | 2017年3月16日 | 3.2.1 (2017年3月20日) | 84.6 | 增加了對檢索<template>元素內容的支援,棄用了多種舊方法。 |
3.3 | 2018年1月19日 | 3.3.1 (2018年1月20日) | 84.8 | 棄用舊函數,函數現在可以接受類,並支援其寫成陣列格式。 |
除非有特殊要求(比如面向行動端),一般情況下這兩大版本使用人的確很少:
不同於 jQuery 2 主要做的是效能的提升,jQuery 3 是實實在在增加了許多新特性,本文我就對這些新特性做個彙總。
(一)、新增的特性
1,支援 for...of 迴圈語句
在 jQuery 3 中,我們可以用 for...of 迴圈語句來迭代一個 jQuery 集合中的所有 DOM 元素。這種新的迭代方法是 ECMAScript 2015(即 ES6)規範中的一部分。這個方法可以對 「可迭代物件」(比如 Array、Map、Set 等)進行迴圈。
(1)比如過去我們使用 for 迴圈遍歷頁面上的所有 input 元素,並修改它的 ID,可以這麼寫:
for(var i = 0; i < $('input').length; i++) { $('input')[i].id = 'input-' + i; }
(2)使用新的 for...of 迴圈怎可以這麼寫:
var i = 0; for(var input of $('input')) { input.id = 'input-' + i++; }
注意:for...of 迴圈體內每次拿到的值並不是一個 jQuery 物件,而是一個 DOM 元素。這一點跟 jQuery 自己提供的 .each() 方法類似。
$('input').each(function(index,item){ item.id = 'input-' + index; });
2,$.get() 和 $.post() 增加了新的引數型別 [settings]
(1)jQuery 3 為 $.get() 和 $.post() 這兩個方法增加了新的引數型別 [settings],從而使得它們和 $.ajax() 的介面風格保持一致。
//過去這麼寫 $.post('test.php', { name: 'hangge', age: 2 }, function (data) { console.log(data); }); // jQuery3 中可以這樣寫 $.post({ url: 'test.php', data: { name: 'hangge', age: 2 }, success: function (data) { console.log(data); } });
(2)與 $.ajax() 唯一不同的是:如果 $.get() 和 $.post() 的 [settings] 中傳遞了 method 屬性,method 的屬性值將被忽略掉。
$.get({ url: 'test.php', method: 'POST' //這個將被忽略,仍然是get請求 });
3,採用 requestAnimationFrame() 來實現動畫
之前的版本中,jQuery 使用 setInterval 通過不斷更新元素的 CSS 屬性產生動畫。每次更新時會迫使瀏覽器對頁面進行重繪(reflow),而一般顯示器 16.7ms 重新整理一次,如果在這間隔期間有其他的 setInterval 請求,就會導致」幀」丟失,造成動畫卡頓。
(1)現在幾乎所有的現代瀏覽器(包括 IE 10 及以上版本),都支援 requestAnimationFrame。requestAnimationFrame 會根據瀏覽器的繪製時間 對動畫進行不斷優化,使動畫流暢並減少對 CPU 資源的消耗。
(2)而 jQuery 3 會使用這個 API 執行動畫,讓動畫的播放更加順暢、速度更快。
4,unwrap() 方法增加一個可選引數 selector
(1)我們知道使用 unwrap() 方法可以刪除被選元素的父元素。
<script type="text/javascript"> $(function() { $("input").unwrap(); }); </script> <div class="wrapper1"> <div class="wrapper2"> <input type="text"> </div> </div>
(2)jQuery 3 為 unwrap() 方法增加了一個可選引數 selector,我們可以通過這個字串選擇器匹配元素的父元素:
$("input").unwrap(".wrapper3"); //由於沒有匹配到,則不會移除父元素
(1)過去想要通過 addClass()、removeClass()、toggleClass() 方法一次性設定多個類時,需要使用空格分開多個 class。
$("#div1").addClass("important blue");
(2)而從 jQuery 3.3 起,這些方法可以直接接受類陣列。
$("#div1").addClass(["important", "blue"]);
(1)jQuery 3 新增的 $.escapeSelector() 函數可以用來跳脫 CSS 選擇器中有特殊意義的字元或字串。此方法對於一個 CSS 類名或一個 ID 包含的字元在 CSS 中具有特殊含義的情況下非常有用,如點或分號。
(2)下面是一個簡單的樣例:
<div id="#div1">hangge.com</div> <div class="abc.def">hangge.com</div> //如果像下面這麼寫會直接報錯 $('##div1').text(); $('.abc.def').text(); //$.escapeSelector()就是用來解決這個問題 $('#' + $.escapeSelector('#div1')).text(); $('.' + $.escapeSelector('abc.def')).text();
(二)、有變更的特性
1,:visible 和 :hidden 過濾器含義變更
(1)jQuery 3 修改了 :visible 和 :hidden 過濾器的定義。任何可用於佈局的元素 即使它們的高度寬度為 0,都會被認為是 :visible。
(2)比如 <br> 元素和沒有內容的內聯元素,現在都會被 :visible 過濾器匹配。
<body> <div></div> <br/> </body> //在 jQuery 1.x 和 2.x 中,你得到的結果會是 0 //在 jQuery 3.x,你得到的結果會是 2 console.log($('body :visible').length);
2,data() 方法
(1)現在 data() 方法行為已經變得跟 Dataset API 規範一致。jQuery 3 將會把所有屬性鍵名轉換成駝峰形式。
(2)比如下面一個樣例:
/******************************* 測試樣例 ********************************/ <div id="container"></div> var $elem = $('#container'); $elem.data({ 'my-property': 'hello' }); console.log($elem.data()); /******************************* jQuery 1.x 和 2.x 結果 ********************************/ {my-property: "hello"} /******************************* jQuery 3.x 結果 ********************************/ {myProperty: "hello"}
3,Deferred 物件
Deferred 物件可以說是 Promise 物件的前身之一,它實現了對 Promise/A+ 協定 的相容。關於 Deferred 更詳細的用法可以參考我之前寫的這篇文章:
- JS - Promise使用詳解3(jQuery中的Deferred)
(1)jQuery 3 改變了 deferred 物件的行為,使得 deferred 物件可與新的 Promises/A+ 標準相容。deferred 物件成為了可鏈物件,讓建立回撥佇列成為可能。
(2)下面是一個簡單的樣例:
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();
4,類操作方法支援 SVG
(1)可惜的是,jQuery 現在還無法完全支援 SVG(包括 jQuery3)。
(2)但是在 jQuery 3 中,對於操作 CSS 類名稱的 jQuery 方法,如 addClass() 和 hasClass() 現在可以將 SVG 檔案作為目標。這意味著,我們可以修改(新增、移除、切換),或是尋找 SVG 下的 jQuery 類,然後使用 CSS 的樣式。
廢棄與移除的區別:
- 廢棄:是指一些方法還在存在於 jQuery 原始碼中,但是已經提供了新方法來替換那些方法。
- 移除:是指一些方法已經從 jQuery 原始碼中刪除了。
(1)在很早之前,bind()、delegate()、unbind() 和 undelegate() 就已經不再推薦使用了,但它們還是一直存在著:
(2)jQuery 3 終於開始將這些方法標記為 「廢棄」 了,並計劃在未來的某個版本(很可能是 jQuery 4)中將它們徹底移除。因此,建議我們在專案中統一使用 on() 和 off() 方法,這樣就不用擔心未來版本的變更了。
load()、unload() 和 error() 等方法在很早以前(從 jQuery 1.8 開始)就已經被標記為廢棄了,但一直沒有去掉。這次 jQuery 3 徹底將它們移除了。
jQuery3 移除了已經廢棄的 context、support 和 selector 屬性。
四、修復了之前版本中存在的重大 Bug
1,width() 和 height() 的返回值將不再取整
(1)在 jQuery 3 中,width() 和 height() 及所有其它相關方法將不再將結果的畫素值四捨五入到一個整數值,因為四捨五入後在某些情況下很難對元素進行定位。
(2)比如下面樣例,container 容器內有三個子元素,它們寬度均為父容器的 1/3。我們通過 width() 得到具體的寬度值:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>hangge.com</title> <script src="js/jquery-3.3.1.min.js" charset="utf-8"></script> <script type="text/javascript"> $(function() { var width = $('.container div').width() console.log(width); }); </script> <style> .container div { width: 33.3333%; float: left; } </style> </head> <body> <div class="container"> <div>My name</div> <div>is</div> <div>Aurelio De Rosa</div> </div> </body> </html>
2,wrapAll() 方法
(1)jQuery 3 還修復了 wrapAll() 方法中的一個 bug,這個 bug 出現在把一個函數作為引數傳給它的情況下。在 jQuery 3 以前的版本中,當一個函數被傳給 wrapAll() 方法時,它會把 jQuery 集合中的每個元素單獨包裹起來。換句話說,這種行為和把一個函數傳給 wrap() 時的行為是完全一樣的。
(2)在修復這個問題的同時,還引入了另外一個變更:由於在 jQuery 3 中,這個函數只會呼叫一次了,那就無法把 jQuery 集合中每個元素都傳給它。因此,這個函數的執行上下文(this)將只能指向當前 jQuery 集合中的第一個元素。
【推薦學習:、】
以上就是jquery版本2.x和3.x的區別是什麼的詳細內容,更多請關注TW511.COM其它相關文章!