即將發(fā)布的jQuery 3 有哪些新特性
jQuery 的橫空出世,至今已有十個(gè)年頭了,而它的長盛不衰顯然不是沒有理由的。jQuery是繼prototype之后又一個(gè)優(yōu)秀的Javascript庫。它是輕量級的js庫 ,它兼容CSS3,還兼容各種瀏覽器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+),jQuery2.0及后續(xù)版本將不再支持IE6/7/8瀏覽器。jQuery使用戶能更方便地處理HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)應(yīng)用)、events、實(shí)現(xiàn)動(dòng)畫效果,并且方便地為網(wǎng)站提供AJAX交互。jQuery還有一個(gè)比較大的優(yōu)勢是,它的文檔說明很全,而且各種應(yīng)用也說得很詳細(xì),同時(shí)還有許多成熟的插件可供選擇。
在未來的幾周內(nèi),jQuery 就將抵達(dá)一個(gè)重要的里程碑——正式發(fā)布 3.0 版本。jQuery 3 修復(fù)了大量的 bug,增加了新的方法,同時(shí)移除了一些接口,并修改了少量接口的行為。在這篇文章中,我將為大家重點(diǎn)講解 jQuery 3 所引入的那些最重要的變化。
新增特性
我們先來討論 jQuery 3 中最重要的幾個(gè)新增特性。
for...of 循環(huán)
在 jQuery 3 中,我們可以用 for...of 循環(huán)語句來迭代一個(gè) jQuery 集合中的所有 DOM 元素。這種新的迭代方法是 ECMAScript 2015(即 ES6)規(guī)范中的一部分。這個(gè)方法可以對 “可迭代對象”(比如 Array、Map、Set 等)進(jìn)行循環(huán)。
當(dāng)使用這種新的迭代方法時(shí),你在循環(huán)體內(nèi)每次拿到的值并不是一個(gè) jQuery 對象,而是一個(gè) DOM 元素(譯注:這一點(diǎn)跟 .each() 方法類似)。當(dāng)你在對一個(gè) jQuery 集合進(jìn)行操作時(shí),這個(gè)新的迭代方法可以少許改善你的代碼。
為了搞清楚這種迭代方法到底是怎么工作的,我們來假設(shè)一個(gè)場景——你需要給頁面中的每個(gè) input 元素分配一個(gè) ID。在 jQuery 3 之前,你可能會這樣寫:
$inputs[i].id = 'input-' + i;
}
而在 jQuery 3 中,你就可以這樣寫了:
for(var input of $inputs) {
input.id = 'input-' + i++;
}
(譯注:其實(shí) jQuery 自己是有個(gè) .each() 方法的,可讀性也不賴。)
$.get() 和 $.post() 函數(shù)的新簽名
jQuery 3 為 $.get() 和 $.post() 這兩個(gè)工具函數(shù)增加了新簽名,從而使得它們和 $.ajax() 的接口風(fēng)格保持一致。新簽名是這樣的:
$.post([settings])
settings 是一個(gè)對象,它包含多個(gè)屬性。它的格式和你以前傳給 $.ajax() 的參數(shù)格式是一樣的。如果你想更清楚地了解這個(gè)參數(shù)對象,請參考 $.ajax() 頁面 中的相關(guān)描述。
$.get() 和 $.post() 的參數(shù)對象與傳給 $.ajax() 的參數(shù)相比,唯一的區(qū)別就是前者的 method 屬性總是會被忽略。原因其實(shí)也很簡單,$.get() 和 $.post() 本身就已經(jīng)預(yù)設(shè)了發(fā)起 Ajax 請求的 HTTP 方法了(顯然 $.get() 就是 GET,而 $.post() 就是 POST)。也就是說,正常人類應(yīng)該是不會想用 $.get() 方法來發(fā)送一個(gè) POST 請求的。
假設(shè)有以下一段代碼:
url: 'https://www.audero.it',
method: 'POST' // This property is ignored
// 這個(gè)屬性將被忽略});
不管我們把 method 屬性寫成什么,這個(gè)請求總是會以 GET 的方式發(fā)出去的。
采用 requestAnimationFrame() 來實(shí)現(xiàn)動(dòng)畫
所有現(xiàn)代瀏覽器(包括 IE10 及以上)都是支持 requestAnimationFrame 的。jQuery 3 將會在內(nèi)部采用這個(gè) API 來實(shí)現(xiàn)動(dòng)畫,以便達(dá)到更流暢、更省資源的動(dòng)畫效果。
unwrap() 方法
jQuery 3 為 unwrap() 方法增加了一個(gè)可選的 selector 參數(shù)。這個(gè)方法的新簽名是這樣的:
有了這個(gè)特性,你就可以給這個(gè)方法傳入一個(gè)包含選擇符表達(dá)式的字符串,用它來在父元素內(nèi)進(jìn)行匹配。如果存在匹配的子元素,則這個(gè)子元素的父層將被解除;如果沒有匹配,則不進(jìn)行操作。
有變更的特性
jQuery 3 還修改了一些特性的行為。
:visible 和 :hidden
jQuery 3 將會修改 :visible 和 :hidden 過濾器的含義。只要元素具有任何布局盒,哪怕寬高為零,也會被認(rèn)為是 :visible。舉個(gè)例子,br 元素和不包含內(nèi)容的行內(nèi)元素現(xiàn)在都會被 :visible 這個(gè)過濾器選中。
因此,如果你的頁面中包含如下的結(jié)構(gòu):
然后運(yùn)行以下語句:
在 jQuery 1.x 和 2.x 中,你得到的結(jié)果會是 0;但在 jQuery 3 中,你會得到 2。
data() 方法
另一個(gè)重要的變化是跟 data() 方法有關(guān)的?,F(xiàn)在它的行為已經(jīng)變得跟 Dataset API 規(guī)范 一致了。jQuery 3 將會把所有屬性鍵名轉(zhuǎn)換成駝峰形式。我們來詳細(xì)看一下,以如下元素為例:
當(dāng)我們在用 jQuery 3 以前的版本時(shí),如果運(yùn)行如下代碼:
$elem.data({ 'my-property': 'hello'});console.log($elem.data());
將會在控制臺得到如下結(jié)果:
而在 jQuery 3 中,我們將會得到如下結(jié)果:
請注意,在 jQuery 3 中,屬性名已經(jīng)變成了駝峰形式,橫杠已經(jīng)被去除了;而在以前的版本中,屬性名會保持全小寫,并原樣保留橫杠。
Deferred 對象
jQuery 3 還改變了 Deferred 對象的行為。Deferred 對象可以說是 Promise 對象的前身之一,它實(shí)現(xiàn)了對 Promise/A+ 協(xié)議 的兼容。這個(gè)對象以及它的歷史都相當(dāng)有意思。如果想要深入了解,你可以去閱讀 jQuery 官方文檔,也可以去看我寫的書《jQuery 實(shí)戰(zhàn)(第三版)》——這本書也涵蓋了 jQuery 3。
在 jQuery 1.x 和 2.x 中,傳給 Deferred 的回調(diào)函數(shù)內(nèi)如果出現(xiàn)未捕獲的異常,會立即中斷程序的執(zhí)行(譯注:即靜默失敗,其實(shí) jQuery 絕大多數(shù)回調(diào)函數(shù)的行為都是這樣的)。而原生的 Promise 對象并非如此,它會拋出異常,并不斷向上冒泡,直至到達(dá) window.onerror(通常冒泡的終點(diǎn)是這里)。如果你沒有定義一個(gè)函數(shù)來處理這個(gè)錯(cuò)誤事件的話(通常我們都不會這么做),那這個(gè)異常的信息將會被顯示出來,此時(shí)程序的執(zhí)行才會停止。
jQuery 3 將會遵循原生 Promise 對象的模式。因此,回調(diào)內(nèi)產(chǎn)生的異常將會導(dǎo)致失敗狀態(tài)(rejection),并觸發(fā)失敗回調(diào)。一旦失敗回調(diào)執(zhí)行完畢,整個(gè)進(jìn)程就將繼續(xù)推進(jìn),后續(xù)的成功回調(diào)將被執(zhí)行。
為了讓你更好地理解這個(gè)差異,讓我們來看一個(gè)小例子。比如我們有如下代碼:
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 中,只有第一個(gè)函數(shù)(也就是拋出錯(cuò)誤的那個(gè)函數(shù))會被執(zhí)行到。此外,由于我們沒有為 window.onerror 定義任何事件處理函數(shù),控制臺將會輸出 “Uncaught Error: An error”,而且程序的執(zhí)行將中止。
而在 jQuery 3 中,整個(gè)行為是完全不同的。你將在控制臺中看到 “Failure 1” 和 “Success 2” 兩條消息。那個(gè)異常將會被第一個(gè)失敗回調(diào)處理,并且,一旦異常得到處理,那么后續(xù)的成功回調(diào)將被調(diào)用。
SVG 文檔
沒有哪一個(gè) jQuery 版本(包括 jQuery 3)曾官方宣稱支持 SVG 文檔。不過事實(shí)上有很多方法是可以奏效的,此外還有一些方法在以前是不行的(比如操作類名的那些方法),但它們在 jQuery 3 中也得到了更新。因此,在 jQuery 3 中,你應(yīng)該可以放心使用諸如 addClass() 和 hasClass() 這樣的方法來操作 SVG 文檔了。
已廢棄、已移除的方法和屬性
在增加了上述改進(jìn)的同時(shí),jQuery 也移除、廢棄了一些特性。
廢棄 bind()、unbind()、delegate() 和 undelegate() 方法
jQuery 在很久以前就引入了 on() 方法,它提供了一個(gè)統(tǒng)一的接口,用以取代 bind()、delegate() 和 live() 等方法。與此同時(shí),jQuery 還引入了 off() 這個(gè)方法來取代 unbind()、undelegated() 和 die() 等方法。從那時(shí)起,bind()、delegate()、unbind() 和 undelegate() 就已經(jīng)不再推薦使用了,但它們還是一直存在著。
jQuery 3 終于開始將這些方法標(biāo)記為 “廢棄” 了,并計(jì)劃在未來的某個(gè)版本(很可能是 jQuery 4)中將它們徹底移除。因此,請?jiān)谀愕捻?xiàng)目中統(tǒng)一使用 on() 和 off() 方法,這樣你就不用擔(dān)心未來版本的變更了。
移除 load()、unload() 和 error() 方法
jQuery 3 徹底拋棄了 load()、unload() 和 error() 等已經(jīng)標(biāo)記為廢棄的方法。這些方法在很早以前(從 jQuery 1.8 開始)就已經(jīng)被標(biāo)記為廢棄了,但一直沒有去掉。如果你正在使用的某款插件仍然依賴這些方法,那么升級到 jQuery 3 會把你的代碼搞掛。因此,在升級過程中請務(wù)必留意。
移除 context、support 和 selector 屬性
jQuery 3 徹底拋棄了 context、support 和 selector 等已經(jīng)標(biāo)記為廢棄的屬性。同上,在升級到 jQuery 3 時(shí),請留意你正使用的插件。
已修復(fù)的 Bug
jQuery 3 修復(fù)了以往版本中的一些非常重要的 bug。在本節(jié)中,我將著重介紹其中兩處,因?yàn)檫@兩者應(yīng)該會對你寫代碼的習(xí)慣帶來顯著影響。
width() 和 height() 的返回值將不再取整
jQuery 3 修復(fù)了 width()、height() 和其它相關(guān)方法的一個(gè) bug。這些方法的返回值將不再舍入取整,因?yàn)檫@種取整行為在某些情況下不便于對元素進(jìn)行定位。
我們來詳細(xì)看一看。假設(shè)你一個(gè)寬度為 100px 的容器元素,它包含了三個(gè)子元素,寬度均為三分之一(即 33.333333%):
<div>My name</div>
<div>is</div>
<div>Aurelio De Rosa</div></div>
在 jQuery 3 以前的版本中,如果你嘗試通過以下代碼來獲取子元素的寬度……
……那么你得到結(jié)果將是 33。原因在于 jQuery 會把 33.33333 這個(gè)值取整。而在 jQuery 3 中,這個(gè) bug 已經(jīng)被修復(fù)了,因此你將會得到更加精確的結(jié)果(即一個(gè)浮點(diǎn)數(shù))。
wrapAll() 方法
jQuery 3 還修復(fù)了 wrapAll() 方法中的一個(gè) bug,這個(gè) bug 出現(xiàn)在把一個(gè)函數(shù)作為參數(shù)傳給它的情況下。在 jQuery 3 以前的版本中,當(dāng)一個(gè)函數(shù)被傳給 wrapAll() 方法時(shí),它會把 jQuery 集合中的每個(gè)元素單獨(dú)包裹起來。換句話說,這種行為和把一個(gè)函數(shù)傳給 wrap() 時(shí)的行為是完全一樣的。
在修復(fù)這個(gè)問題的同時(shí),還引入了另外一個(gè)變更:由于在 jQuery 3 中,這個(gè)函數(shù)只會調(diào)用一次了,那就無法把 jQuery 集合中每個(gè)元素都傳給它。因此,這個(gè)函數(shù)的執(zhí)行上下文(this)將只能指向當(dāng)前 jQuery 集合中的第一個(gè)元素。
如何下載 jQuery 3 beta 1
既然你已經(jīng)讀到了這里,那說明你很可能想試試 jQuery 3 的第一個(gè) beta 測試版。你可以通過以下兩個(gè)地址來獲取這個(gè)版本:
未壓縮版: https://code.jquery.com/jquery-3.0.0-beta1.js
壓縮版: https://code.jquery.com/jquery-3.0.0-beta1.min.js
當(dāng)然,你還可以通過 npm 來下載:
[code]npm install jquery@3.0.0-beta1[/code]
結(jié)論
很多人一直在唱衰 jQuery,說它在現(xiàn)代網(wǎng)頁開發(fā)中已經(jīng)沒有一席之地了。但不管怎樣,jQuery 的開發(fā)仍在繼續(xù),客觀的統(tǒng)計(jì)數(shù)據(jù)(在排名前一百萬名的網(wǎng)站中占有率高達(dá) 78.5%)也讓這些論調(diào)不攻自破。
在本文中,我已經(jīng)帶你了解了一遍 jQuery 3 將會帶來的一些重大變化。或許你已經(jīng)察覺到了,這個(gè)版本并不太可能搞掛你的既有項(xiàng)目,因?yàn)樗氲钠茐男宰兏鋵?shí)寥寥無幾。不過,在升級到 jQuery 3 的過程中,你還是有必要牢記一些關(guān)鍵點(diǎn),比如 Deferred 對象的改進(jìn)等等。同樣,在升級某個(gè)第三方庫時(shí),也有必要檢查一下該項(xiàng)目的兼容性情況,以便盡早發(fā)現(xiàn)任何非預(yù)期行為,避免某些功能失效。
譯注
除了本文所提及的變更之外,jQuery 3.0 最大的變化就是徹底放棄對 IE8 的支持。jQuery 團(tuán)隊(duì)做出這個(gè)決定的原因在于,微軟已經(jīng)在今年年初宣布停止對 IE 8~10 的支持。因此,jQuery 在 3.0 alpha 階段所發(fā)布的 jQuery Compat 項(xiàng)目也就沒有繼續(xù)存在的必要了。
不過,由于 IE8 仍然是中國大陸最流行的瀏覽器之一,對國內(nèi)的開發(fā)者來說,在短期(甚至中期)內(nèi)還不得不停留在 jQuery 1.x 版本。
好吧,最后還是說個(gè)好消息吧。為幫助用戶平滑升級,此次 jQuery 同樣會為 3.0 版本提供遷移插件(jQuery Migrate plugin)。在把 jQuery 升級到 3.0 之后同時(shí)運(yùn)行這個(gè)插件,即可確?;?jQuery 1.x 或 2.x 的既有業(yè)務(wù)代碼正常運(yùn)行;同時(shí),它還將在控制臺向你報(bào)告既有代碼與 jQuery 3 不兼容的地方。當(dāng)你修復(fù)了這些不兼容問題之后,就可以安全地移除這個(gè)插件了。
相關(guān)文章
jQuery實(shí)現(xiàn)簡單的計(jì)時(shí)器功能實(shí)例分析
這篇文章主要介紹了jQuery實(shí)現(xiàn)簡單的計(jì)時(shí)器功能,結(jié)合實(shí)例形式分析了jQuery實(shí)現(xiàn)倒計(jì)時(shí)60秒的具體操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08通過點(diǎn)擊jqgrid表格彈出需要的表格數(shù)據(jù)
在眾多的表格插件中,jqgrid的特點(diǎn)是非常鮮明的,所以jqgrid表格插件用處非常廣泛,本篇文章給大家介紹通過點(diǎn)擊jqgrid表格彈出需要的表格數(shù)據(jù),需要的朋友參考下2015-12-12jQuery(1.3.2) 7行代碼搞定跟隨屏幕滾動(dòng)的層
jQuery(1.3.2)7行代碼搞定跟隨屏幕滾動(dòng)的層,代碼很精簡啊,非常不錯(cuò)。2009-05-05js調(diào)用iframe實(shí)現(xiàn)打印頁面內(nèi)容的方法
這篇文章主要介紹了js調(diào)用iframe實(shí)現(xiàn)打印頁面內(nèi)容的方法,需要的朋友可以參考下2014-03-03jQuery實(shí)現(xiàn)響應(yīng)瀏覽器縮放大小并改變背景顏色
這篇文章主要介紹了jQuery實(shí)現(xiàn)響應(yīng)瀏覽器縮放大小并改變背景顏色,比較實(shí)用,也很簡單,使用到了一個(gè)resize事件需要的朋友可以參考下2014-10-10Jquery揭秘系列:ajax原生js實(shí)現(xiàn)詳解(推薦)
下面小編就為大家?guī)硪黄狫query揭秘系列:ajax原生js實(shí)現(xiàn)詳解(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06jQuery實(shí)現(xiàn)HTML5 placeholder效果實(shí)例
這篇文章主要介紹了jQuery實(shí)現(xiàn)HTML5 placeholder效果實(shí)例,本文目的主要是在需要兼容一些瀏覽器時(shí)使用,需要的朋友可以參考下2014-12-12JQuery的Validation插件中Remote驗(yàn)證的中文問題
前段時(shí)間,再次出現(xiàn)AJAX中文編碼問題,導(dǎo)致會員名重復(fù)檢測失敗,不過這次出現(xiàn)問題的是Validation插件的remote驗(yàn)證。2010-07-07