jQuery 3.0 新增了哪些特性?(jQuery 3 所引入的那些最重要的變化)

文章目錄

  • 前言
  • 簡介
  • 新增特性
  • Use of requestAnimationFrame() for Animations
    • unwrap() 方法
  • 有變更的特性
    • data() 方法
    • Deferred 對象
    • SVG 文檔
  • 已廢棄、已移除的方法和屬性
    • 廢棄 bind()、unbind()、delegate() 和 undelegate() 方法
    • 移除 load()、unload() 和 error() 方法
    • 移除 context、support 和 selector 屬性
  • 已修復的 Bug
    • width() 和 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 id="container"></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 class="container"><div>My name</div><div>is</div><div>Aurelio 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 對象的改進等等。同樣,在升級某個第三方庫時,也有必要檢查一下該項目的兼容性情況,以便盡早發現任何非預期行為,避免某些功能失效。

后言

創作不易,要是本文章對廣大讀者有那么一點點幫助 不妨三連支持一下,您的鼓勵就是博主創作的動力

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/168108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/168108.shtml
英文地址,請注明出處:http://en.pswp.cn/news/168108.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機應用基礎_錯題集_OutLook操作題_操作系統應用題_電子表格---網絡教育統考工作筆記005

6、(說明:考生單擊窗口下方的“打開[Outlook]應用程序”啟動Outlook) 按以下要求保存草稿。 收件人:test_xiao_ming@163.com

深眸科技聚焦AI機器視覺檢測,驅動3C電子行業集成創新實現新需求

隨著消費的升級及國家政策的助推&#xff0c;國內3C電子市場不斷擴大&#xff0c;行業實現高速發展。近年來&#xff0c;3C電子產品持續迭代&#xff0c;生產工藝也逐漸復雜化&#xff0c;相關生產線定位組裝、零部件檢測、整機產品檢測等環節&#xff0c;亟需使用具備較強適應…

C語言-字符串逆序

輸入一個字符串&#xff0c;對該字符串進行逆序&#xff0c;輸出逆序后的字符串。 輸入格式&#xff1a; 輸入在一行中給出一個不超過80個字符長度的、以回車結束的非空字符串。 輸出格式&#xff1a; 在一行中輸出逆序后的字符串。 輸入樣例&#xff1a; Hello World…

云原生系列Go語言篇-編寫測試Part 2

基準測試 確定代碼是快或慢非常復雜。我們不用自己計算&#xff0c;應使用Go測試框架內置的基準測試。下面來看??第15章的GitHub代碼庫??sample_code/bench目錄下的函數&#xff1a; func FileLen(f string, bufsize int) (int, error) {file, err : os.Open(f)if err ! …

【XSLVGL2.0】如何設置壁紙

XSLVGL2.0 開發手冊 XSLVGL2.0 Brief 1、概述2、設置方法 1、概述 設置壁紙使用的是LVGL默認的方式。一般而言&#xff0c;若非必要&#xff0c;建議不要去設置此功能&#xff0c;此功能對性能影響頗大。 2、設置方法 在main.c的 static int InitLvgl(void *cookie) 函數中…

舉個栗子!Quick BI 技巧(4):創建面積圖

面積圖又叫區域圖&#xff0c;是在折線圖的基礎之上形成的, 它將折線圖中折線與自變量坐標軸之間的區域使用顏色或者紋理填充&#xff0c;這樣一個填充區域我們叫做面積&#xff0c;顏色的填充也可以更好的突出趨勢信息。 有數據粉好奇如何使用 Quick BI 來制作面積圖&#xf…

NVMe-oF E-JBOF設計解析:WD RapidFlex網卡、OpenFlex Data24

OpenFlex Data24 NVMe-oF Storage Platform WD的SN840 NVMeSSD新品并沒有太吸引我注意&#xff0c;因為它還是PCIe 3.0接口的&#xff0c;要知道Intel的PCIe 4.0 SSD都已經推出了。 但上面這個NVMe-oF&#xff08;NVMe over Fabric&#xff09;EBOF&#xff08;區別于普通JBO…

FPGA程序前仿真和后仿真問題處理

參考鏈接&#xff1a;FPGA程序前仿真和后仿真問題處理 - 知乎

css三角,鼠標樣式,溢出文字

目錄 css三角 鼠標樣式 例子&#xff1a;頁碼模塊 溢出文字表示方式 margin負值運用 css三角強化 css三角 css三角中&#xff1a;line-height&#xff1a;0和font-size&#xff1a;0是防止兼容性的問題 jd {position: relative;width: 120px;height: 249px;background-…

【React】useReducer

讓 React 管理多個相對關聯的狀態數據 import { useReducer } from "react" // 1. 定義reducer函數&#xff0c;根據不同的action返回不同的狀態 function reducer(state, action) {switch (action.type) {case ADD:return state action.payloadcase SUB:return st…

Python與設計模式--原型模式

4-Python與設計模式–原型模式 一、圖層 大家如果用過類似于Photoshop的平面設計軟件&#xff0c;一定都知道圖層的概念。圖層概念的提出&#xff0c; 使得設計、圖形修改等操作更加便利。設計師既可以修改和繪制當前圖像對象&#xff0c;又可以保留其它 圖像對象&#xff0c;…

在 Ubuntu 上安裝最新版的 Calibre

目錄 前言 方法1&#xff1a;從 Ubuntu 的倉庫安裝 Calibre 卸載 Calibre 方法2&#xff1a;獲取最新版本的 Calibre 卸載 Calibre 結語 前言 Calibre 是一款自由開源的電子書軟件。下面介紹如何在 Ubuntu Linux 上安裝它。 作為電子書管理的瑞士軍刀&#xff0c;Calibre …

線程-Thread類及常見方法

目錄 一、創建線程 1.繼承 Thread 類 2. 實現 Runnable 接口 3.匿名內部類創建 Thread 子類對象 4. 匿名內部類創建 Runnable 子類對象 5. lambda 表達式創建 Runnable 子類對象 二、Thread 類及常見方法 2.1 Thread 的常見構造方法 2.2 Thread 的幾個常見屬性 2.3 啟…

C++初級項目webserver項目流程介紹(2)

一、引言 C的webserver項目是自己在學完網絡編程后根據網課的內容做的一個初級的網絡編程項目。 這個項目的效果是可以在瀏覽器通過輸入網絡IP地址和端口&#xff0c;然后打開對應的文件目錄 效果如下&#xff1a; 也可以打開文件夾后點擊目錄&#xff0c;打開到對應的文件夾…

Vue中項目進行文件壓縮與解壓縮 (接口返回文件的url壓縮包前端解析并展示出來,保存的時候在壓縮后放到接口入參進行保存)

安裝 npm install pako在Vue組件中引入pako&#xff1a; import pako from pako;接口返回的url是這個字段 tableSsjsonUrl 其實打開就是壓縮包const source await tableFileUrl ({ id: this.$route.query.id}); if(source.code 0) {this.titleName source.data.tableNam…

ES之x-pack-core-7.14.2許可證修改為白金版

X-Pack是什么 X-pack是elasticsearch的一個擴展包&#xff0c;將安全&#xff0c;警告&#xff0c;監視&#xff0c;圖形和報告功能捆綁在一個易于安裝的軟件包中&#xff0c;雖然x-pack被設計為一個無縫的工作&#xff0c;但是你可以輕松的啟用或者關閉一些功能。 主要分一下步…

WebSocket 鑒權策略與技巧詳解

WebSocket 作為實時通信的利器&#xff0c;越來越受到開發者的青睞。然而&#xff0c;為了確保通信的安全性和合法性&#xff0c;鑒權成為不可或缺的一環。本文將深入探討 WebSocket 的鑒權機制&#xff0c;為你呈現一攬子的解決方案&#xff0c;確保你的 WebSocket 通信得心應…

【Qt之QTextDocument】使用及表格顯示富文本解決方案

【Qt之QTextDocument】使用 描述常用方法及示例使用QTextList使用QTextBlock使用QTextTable表格顯示富文本結論 描述 QTextDocument類保存格式化的文本。 QTextDocument是結構化富文本文檔的容器&#xff0c;支持樣式文本和各種文檔元素&#xff0c;如列表、表格、框架和圖像。…

CANopen協議【SDO】

SDO&#xff1a; SDO是讀寫單個寄存器。主要用于配置伺服驅動器參數。 1 收發功能&#xff1a; //public unsafe struct VCI_CAN_OBJ //CAN數據幀 【單幀對象】//{// public uint ID;// 幀ID。 【11bit】數據右對齊。 詳情請參照&#xff1a; 《8.附件1&#xff1…

Python 模塊

目錄 模塊 6.1. 模塊詳解 6.1.1. 以腳本方式執行模塊 6.1.2. 模塊搜索路徑 6.1.3. “已編譯的” Python 文件 6.2. 標準模塊 6.3. dir() 函數 6.4. 包 6.4.1. 從包中導入 * 6.4.2. 相對導入 6.4.3. 多目錄中的包 模塊 退出 Python 解釋器后&#xff0c;再次進入時&a…