網站建設

PC + 手機 + 微信網站 + 小程序 + APP,五端合一(yī / yì /yí)

當前位置:首頁>新聞資訊>網站建設

網站制作如何用javascript代替Jquery

時(shí)間:2025-04-16   訪問量:1138

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è)功能。

  1. var $ = document.querySelectorAll.bind(document); 

這(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)數組。

  1. myList = Array.prototype.slice.call(myNodeList); 

二、DOM操作

DOM本身就(jiù)具有很豐富的(de)操作方法,可以(yǐ)取代jQuery提供的(de)操作方法。

尾部追加DOM元素。

  1. // jQuery寫法  
  2. $(parent).append($(child));  
  3. // DOM寫法  
  4. parent.appendChild(child) 

頭部插入DOM元素。

  1. // jQuery寫法  
  2. $(parent).prepend($(child));  
  3. // DOM寫法  
  4. parent.insertBefore(child, parent.childNodes[0]) 

删除DOM元素。

  1. // jQuery寫法  
  2. $(child).remove()  
  3. // DOM寫法  
  4. child.parentNode.removeChild(child) 

三、事件的(de)監聽

jQuery的(de)on方法,完全可以(yǐ)用addEventListener模拟。

  1. Element.prototype.on = Element.prototype.addEventListener; 

爲(wéi / wèi)了(le/liǎo)使用方便,可以(yǐ)在(zài)NodeList對象上(shàng)也(yě)部署這(zhè)個(gè)方法。

  1. NodeList.prototype.on = function (event, fn) {  
  2. []['forEach'].call(this, function (el) {  
  3. el.on(event, fn);  
  4. });  
  5. return this;  
  6. }; 

四、事件的(de)觸發

jQuery的(de)trigger方法則需要(yào / yāo)單獨部署,相對複雜一(yī / yì /yí)些。

  1. Element.prototype.trigger = function (type, data) {  
  2. var event = document.createEvent('HTMLEvents');  
  3. event.initEvent(type, true, true);  
  4. event.data = data || {};  
  5. event.eventName = type;  
  6. event.target = this;  
  7. this.dispatchEvent(event);  
  8. return this;  
  9. }; 

在(zài)NodeList對象上(shàng)也(yě)部署這(zhè)個(gè)方法。

  1. NodeList.prototype.trigger = function (event) {  
  2. []['forEach'].call(this, function (el) {  
  3. el['trigger'](event);  
  4. });  
  5. return this;  
  6. }; 

五、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)屬性。

  1.  $("#picture").attr("src", "http://url/to/image"); 

DOM元素允許直接讀取屬性值,寫法要(yào / yāo)簡潔許多。

  1. $("#picture").src = "http://url/to/image"; 

需要(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。

  1. $('body').addClass('hasJS'); 

DOM元素本身有一(yī / yì /yí)個(gè)可讀寫的(de)className屬性,可以(yǐ)用來(lái)操作class。

  1. document.body.className = 'hasJS';  
  2. // or  
  3. document.body.className += ' hasJS';  

HTML 5還提供一(yī / yì /yí)個(gè)classList對象,功能更強大(dà)(IE 9不(bù)支持)。

  1. document.body.classList.add('hasJS');  
  2. document.body.classList.remove('hasJS');  
  3. document.body.classList.toggle('hasJS');  
  4. document.body.classList.contains('hasJS'); 

八、CSS

jQuery的(de)css方法,用來(lái)設置網頁元素的(de)樣式。

  1. $(node).css( "color", "red" ); 

DOM元素有一(yī / yì /yí)個(gè)style屬性,可以(yǐ)直接操作。

  1. element.style.color = "red";;  
  2. // or  
  3. element.style.cssText += 'color:red'; 

九、數據儲存

jQuery對象可以(yǐ)儲存數據。

  1. $("body").data("foo", 52); 

HTML 5有一(yī / yì /yí)個(gè)dataset對象,也(yě)有類似的(de)功能(IE 10不(bù)支持),不(bù)過隻能保存字符串。

  1. element.dataset.user = JSON.stringify(user);  
  2. element.dataset.score = score; 

十、Ajax

jQuery的(de)Ajax方法,用于(yú)異步操作。

  1. $.ajax({  
  2. type: "POST",  
  3. url: "some.html",  
  4. data: { name: "John", location: "Boston" }  
  5. }).done(function( msg ) {  
  6. alert( "Data Saved: " + msg );  
  7. }); 

我們可以(yǐ)定義一(yī / yì /yí)個(gè)request函數,模拟Ajax方法。

  1. function request(type, url, opts, callback) {  
  2. var xhr = new XMLHttpRequest();  
  3. if (typeof opts === 'function') {  
  4. callback = opts;  
  5. opts = null;  
  6. }  
  7. xhr.open(type, url);  
  8. var fd = new FormData();  
  9. if (type === 'POST' && opts) {  
  10. for (var key in opts) {  
  11. fd.append(key, JSON.stringify(opts[key]));  
  12. }  
  13. }  
  14. xhr.onload = function () {  
  15. callback(JSON.parse(xhr.response));  
  16. };  
  17. xhr.send(opts ? fd : null);  

然後,基于(yú)request函數,模拟jQuery的(de)get和(hé / huò)post方法。

  1. var get = request.bind(this, 'GET');  
  2. var post = request.bind(this, 'POST'); 

十一(yī / yì /yí)、動畫

jQuery的(de)animate方法,用于(yú)生成動畫效果。

  1. $foo.animate('slow', { x: '+=10px' }); 

jQuery的(de)動畫效果,很大(dà)部分基于(yú)DOM。但是(shì)目前,CSS 3的(de)動畫遠比DOM強大(dà),所以(yǐ)可以(yǐ)把動畫效果寫進CSS,然後通過操作DOM元素的(de)class,來(lái)展示動畫。

  1. foo.classList.add('animate'); 

如果需要(yào / yāo)對動畫使用回調函數,CSS 3也(yě)定義了(le/liǎo)相應的(de)事件。

  1. el.addEventListener("webkitTransitionEnd", transitionEnded);  
  2. el.addEventListener("transitionend", transitionEnded);  

十二、替代方案

由于(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)分析

發表評論:

評論記錄:

未查詢到(dào)任何數據!

在(zài)線咨詢

點擊這(zhè)裏給我發消息 售前咨詢專員

點擊這(zhè)裏給我發消息 售後服務專員

在(zài)線咨詢

免費通話

24小時(shí)免費咨詢

請輸入您的(de)聯系電話,座機請加區号

免費通話

微信掃一(yī / yì /yí)掃

微信聯系
返回頂部