如何做到 jQuery-free?

阮一峰發表於2013-05-11

來源:阮一峰

jQuery 是現在最流行的 JavaScript 工具庫。

據統計,目前全世界 57.3% 的網站使用它。也就是說,10 個網站裡面,有 6 個使用 jQuery。如果只考察使用工具庫的網站,這個比例就會上升到驚人的 91.7%。

如何做到 jQuery-free?

雖然 jQuery 如此受歡迎,但是它臃腫的體積也讓人頭痛不已。jQuery 2.0 的原始大小為 235KB,優化後為 81KB;如果是支援 IE6、7、8 的 jQuery 1.8.3,原始大小為 261KB,優化後為 91KB。

這樣的體積,即使是寬頻環境,完全載入也需要 1 秒或更長,更不要說移動裝置了。這意味著,如果你使用了 jQuery,使用者至少延遲 1 秒,才能看到網頁效果。考慮到本質上,jQuery 只是一個操作 DOM 的工具,我們不僅要問:如果只是為了幾個網頁特效,是否有必要動用這麼大的庫?

如何做到 jQuery-free?

2006 年,jQuery 誕生的時候,主要用於消除不同瀏覽器的差異(主要是 IE6),為開發者提供一個簡潔的統一介面。相比當時,如今的情況已經發生了很大的變化。IE 的市場份額不斷下降,以 ECMAScript 為基礎的 JavaScript 標準語法,正得到越來越廣泛的支援。開發者直接使用 JavScript 標準語法,就能同時在各大瀏覽器執行,不再需要通過 jQuery 獲取相容性。

下面就探討如何用 JavaScript 標準語法,取代 jQuery 的一些主要功能,做到 jQuery-free。

如何做到 jQuery-free?

一、選取 DOM 元素

jQuery 的核心是通過各種選擇器,選中 DOM 元素,可以用 querySelectorAll 方法模擬這個功能。

這裡需要注意的是,querySelectorAll 方法返回的是 NodeList 物件,它很像陣列(有數字索引和 length 屬性),但不是陣列,不能使用 pop、push 等陣列特有方法。如果有需要,可以考慮將 Nodelist 物件轉為陣列。

二、DOM 操作

DOM 本身就具有很豐富的操作方法,可以取代 jQuery 提供的操作方法。

尾部追加 DOM 元素。

頭部插入 DOM 元素。

刪除 DOM 元素。

三、事件的監聽

jQuery 的 on 方法,完全可以用 addEventListener 模擬。

為了使用方便,可以在 NodeList 物件上也部署這個方法。

四、事件的觸發

jQuery 的 trigger 方法則需要單獨部署,相對複雜一些。

在NodeList物件上也部署這個方法。

五、document.ready

目前的最佳實踐,是將 JavaScript 指令碼檔案都放在頁面底部載入。這樣的話,其實 document.ready 方法(jQuery 簡寫為$(function))已經不必要了,因為等到執行的時候,DOM 物件已經生成了。

六、attr 方法

jQuery 使用 attr 方法,讀寫網頁元素的屬性。

DOM 元素允許直接讀取屬性值,寫法要簡潔許多。

需要注意,input 元素的 this.value 返回的是輸入框中的值,連結元素的 this.href 返回的是絕對 URL。如果需要用到這兩個網頁元素的屬性準確值,可以用 this.getAttribute (‘value’)和 this.getAttibute (‘href’)。

七、addClass 方法

jQuery 的 addClass 方法,用於為 DOM 元素新增一個 class。

DOM 元素本身有一個可讀寫的 className 屬性,可以用來操作 class。

HTML 5 還提供一個 classList 物件,功能更強大(IE 9 不支援)。

八、CSS

jQuery 的 css 方法,用來設定網頁元素的樣式。

DOM 元素有一個 style 屬性,可以直接操作。

九、資料儲存

jQuery 物件可以儲存資料。

HTML 5 有一個 dataset 物件,也有類似的功能(IE 10 不支援),不過只能儲存字串。

十、Ajax

jQuery 的 Ajax 方法,用於非同步操作。

我們可以定義一個 request 函式,模擬 Ajax 方法。

然後,基於 request 函式,模擬 jQuery 的 get 和 post 方法。

十一、動畫

jQuery 的 animate 方法,用於生成動畫效果。

jQuery 的動畫效果,很大部分基於 DOM。但是目前,CSS 3 的動畫遠比 DOM 強大,所以可以把動畫效果寫進 CSS,然後通過操作 DOM 元素的 class,來展示動畫。

如果需要對動畫使用回撥函式,CSS 3 也定義了相應的事件。

十二、替代方案

由於 jQuery 體積過大,替代方案層出不窮。

其中,最有名的是 zepto.js。它的設計目標是以最小的體積,做到最大相容 jQuery 的 API。zepto.js 1.0 版的原始大小是 55KB,優化後是 29KB,gzip 壓縮後為 10KB。

如果不求最大相容,只希望模擬 jQuery 的基本功能,那麼,min.js 優化後只有 200 位元組,而 dolla 優化後是 1.7KB。

此外,jQuery 本身採用模組設計,可以只選擇使用自己需要的模組。具體做法參見它的 github 網站,或者使用專用的 Web 介面。

十三、參考連結

– Remy Sharp,I know jQuery. Now what? 
– Hemanth.HM,Power of Vanilla JS
– Burke Holland,5 Things You Should Stop Doing With jQuery

(完)

相關文章