PC + 手機 + 微信網站 + 小程序 + APP,五端合一(yī / yì /yí)
jQuery是(shì)現在(zài)最流行的(de)JavaScript工具庫。
據統計,目前全世界57.3%的(de)網站使用它。也(yě)就(jiù)是(shì)說(shuō),10個(gè)網站裏面,有6個(gè)使用jQuery。如果隻考察使用工具庫的(de)網站制作,這(zhè)個(gè)比例就(jiù)會上(shàng)升到(dào)驚人(rén)的(de)91.7%。
雖然jQuery如此受歡迎,但是(shì)它臃腫的(de)體積也(yě)讓人(rén)頭痛不(bù)已。jQuery 2.0的(de)原始大(dà)小爲(wéi / wèi)235KB,優化後爲(wéi / wèi)81KB;如果是(shì)支持IE6、7、8的(de)jQuery 1.8.3,原始大(dà)小爲(wéi / wèi)261KB,優化後爲(wéi / wèi)91KB。
這(zhè)樣的(de)體積,即使是(shì)寬帶環境,完全加載也(yě)需要(yào / yāo)1秒或更長,更不(bù)要(yào / yāo)說(shuō)移動設備了(le/liǎo)。這(zhè)意味着,如果你使用了(le/liǎo)jQuery,用戶至少延遲1秒,才能看到(dào)網頁效果。考慮到(dào)本質上(shàng),jQuery隻是(shì)一(yī / yì /yí)個(gè)操作DOM的(de)工具,我們不(bù)僅要(yào / yāo)問:如果隻是(shì)爲(wéi / wèi)了(le/liǎo)幾個(gè)網頁特效,是(shì)否有必要(yào / yāo)動用這(zhè)麽大(dà)的(de)庫?
2006年,jQuery誕生的(de)時(shí)候,主要(yào / yāo)用于(yú)消除不(bù)同浏覽器的(de)差異(主要(yào / yāo)是(shì)IE6),爲(wéi / wèi)開發者提供一(yī / yì /yí)個(gè)簡潔的(de)統一(yī / yì /yí)接口。相比當時(shí),如今的(de)情況已經發生了(le/liǎo)很大(dà)的(de)變化。IE的(de)市場份額不(bù)斷下降,以(yǐ)ECMAScript爲(wéi / wèi)基礎的(de)JavaScript标準語法,正得到(dào)越來(lái)越廣泛的(de)支持。開發者直接使用JavScript标準語法,就(jiù)能同時(shí)在(zài)各大(dà)浏覽器運行,不(bù)再需要(yào / yāo)通過jQuery獲取兼容性。
下面就(jiù)探讨如何用JavaScript标準語法,取代jQuery的(de)一(yī / yì /yí)些主要(yào / yāo)功能,做到(dào)jQuery-free。
一(yī / yì /yí)、選取DOM元素
jQuery的(de)核心是(shì)通過各種選擇器,選中DOM元素,可以(yǐ)用querySelectorAll方法模拟這(zhè)個(gè)功能。
這(zhè)裏需要(yào / yāo)注意的(de)是(shì),querySelectorAll方法返回的(de)是(shì)NodeList對象,它很像數組(有數字索引和(hé / huò)length屬性),但不(bù)是(shì)數組,不(bù)能使用pop、push等數組特有方法。如果有需要(yào / yāo),可以(yǐ)考慮将Nodelist對象轉爲(wéi / wèi)數組。
二、DOM操作
DOM本身就(jiù)具有很豐富的(de)操作方法,可以(yǐ)取代jQuery提供的(de)操作方法。
尾部追加DOM元素。
頭部插入DOM元素。
删除DOM元素。
三、事件的(de)監聽
jQuery的(de)on方法,完全可以(yǐ)用addEventListener模拟。
爲(wéi / wèi)了(le/liǎo)使用方便,可以(yǐ)在(zài)NodeList對象上(shàng)也(yě)部署這(zhè)個(gè)方法。
四、事件的(de)觸發
jQuery的(de)trigger方法則需要(yào / yāo)單獨部署,相對複雜一(yī / yì /yí)些。
在(zài)NodeList對象上(shàng)也(yě)部署這(zhè)個(gè)方法。
五、document.ready
目前的(de)最佳實踐,是(shì)将JavaScript腳本文件都放在(zài)頁面底部加載。這(zhè)樣的(de)話,其實document.ready方法(jQuery簡寫爲(wéi / wèi)$(function))已經不(bù)必要(yào / yāo)了(le/liǎo),因爲(wéi / wèi)等到(dào)運行的(de)時(shí)候,DOM對象已經生成了(le/liǎo)。
六、attr方法
jQuery使用attr方法,讀寫網頁元素的(de)屬性。
DOM元素允許直接讀取屬性值,寫法要(yào / yāo)簡潔許多。
需要(yào / yāo)注意,input元素的(de)this.value返回的(de)是(shì)輸入框中的(de)值,鏈接元素的(de)this.href返回的(de)是(shì)絕對URL。如果需要(yào / yāo)用到(dào)這(zhè)兩個(gè)網頁元素的(de)屬性準确值,可以(yǐ)用this.getAttribute('value')和(hé / huò)this.getAttibute('href')。
七、addClass方法
jQuery的(de)addClass方法,用于(yú)爲(wéi / wèi)DOM元素添加一(yī / yì /yí)個(gè)class。
DOM元素本身有一(yī / yì /yí)個(gè)可讀寫的(de)className屬性,可以(yǐ)用來(lái)操作class。
HTML 5還提供一(yī / yì /yí)個(gè)classList對象,功能更強大(dà)(IE 9不(bù)支持)。
八、CSS
jQuery的(de)css方法,用來(lái)設置網頁元素的(de)樣式。
DOM元素有一(yī / yì /yí)個(gè)style屬性,可以(yǐ)直接操作。
九、數據儲存
jQuery對象可以(yǐ)儲存數據。
HTML 5有一(yī / yì /yí)個(gè)dataset對象,也(yě)有類似的(de)功能(IE 10不(bù)支持),不(bù)過隻能保存字符串。
十、Ajax
jQuery的(de)Ajax方法,用于(yú)異步操作。
我們可以(yǐ)定義一(yī / yì /yí)個(gè)request函數,模拟Ajax方法。
然後,基于(yú)request函數,模拟jQuery的(de)get和(hé / huò)post方法。
十一(yī / yì /yí)、動畫
jQuery的(de)animate方法,用于(yú)生成動畫效果。
jQuery的(de)動畫效果,很大(dà)部分基于(yú)DOM。但是(shì)目前,CSS 3的(de)動畫遠比DOM強大(dà),所以(yǐ)可以(yǐ)把動畫效果寫進CSS,然後通過操作DOM元素的(de)class,來(lái)展示動畫。
如果需要(yào / yāo)對動畫使用回調函數,CSS 3也(yě)定義了(le/liǎo)相應的(de)事件。
十二、替代方案
由于(yú)jQuery體積過大(dà),替代方案層出(chū)不(bù)窮。
其中,最有名的(de)是(shì)zepto.js。它的(de)設計目标是(shì)以(yǐ)最小的(de)體積,做到(dào)最大(dà)兼容jQuery的(de)API。zepto.js 1.0版的(de)原始大(dà)小是(shì)55KB,優化後是(shì)29KB,gzip壓縮後爲(wéi / wèi)10KB。
如果不(bù)求最大(dà)兼容,隻希望模拟jQuery的(de)基本功能,那麽,min.js優化後隻有200字節,而(ér)dolla優化後是(shì)1.7KB。
此外,jQuery本身采用模塊設計,可以(yǐ)隻選擇使用自己需要(yào / yāo)的(de)模塊。具體做法參見它的(de)github網站,或者使用專用的(de)Web界面。
上(shàng)一(yī / yì /yí)篇:企業做網站研發原創音樂作品加密技術
下一(yī / yì /yí)篇:網站行爲(wéi / wèi)分析