摘要:在代碼段二,我們可以將暴露給開發(fā)人員,因?yàn)闊o論是通過還是返回的都是實(shí)例對象,這是我們要的結(jié)果。具體可參照代碼段三,當(dāng)然,我們還可以按照這種方式添加其它的工具方法如這些工具方法確實(shí)不錯(cuò)。
前言
對于JQuery,想必大家都很熟悉。目前,很多web項(xiàng)目,在實(shí)施的過程中,考慮到各瀏覽器原生JS API的兼容性,大都會(huì)選用JQuery或類似于JQuery這樣的框架來進(jìn)行網(wǎng)頁效果開發(fā)。JQuery上手簡單,也很容易學(xué),即使是剛接觸JQuery的開發(fā)人員,借助JQuery手冊,也很快能在項(xiàng)目中使用開發(fā)。
雖然JQuery相對簡單,但要全面掌握,且快速靈活的使用它也并不那么容易,它提供了很多方法,包含了網(wǎng)頁開發(fā)的各個(gè)知識(shí)面,所以要全面掌握這些知識(shí)點(diǎn),個(gè)人認(rèn)為還是需要對jquery有深入的理解,對這些知識(shí)點(diǎn)做分類整理記憶,這樣你才能面對一些JQuery代碼的時(shí)候不會(huì)感到迷惑,才會(huì)知道采用何種方式實(shí)現(xiàn)某個(gè)特效是最佳實(shí)踐,才能快速的采用JQuery來進(jìn)行項(xiàng)目開發(fā)。
簡單模擬JQueryJQuery里的代碼是出了名的刁鉆,里面的奇技淫巧太多太多,如果你想通過源碼來學(xué)習(xí)JQuery,沒有一定的功底是很難做到的。所以下面寫一個(gè)非常簡單的庫來模擬JQuery,方便大家理解。
總體代碼
(function(window) { var doc = window.document; // -------------代碼段二 ------------------ var JQuery = function(selector) { return new JClass(selector); } // --------------- 代碼段三 ---------------- JQuery.html = function(obj) { if(obj && obj.nodeType === 1) { return obj.innerHTML; } } // ---------代碼段一 -------------- var JClass = function(selector) { if (selector.nodeType ) { // 如果傳入的是DOM元素 this.length = 1; }else if(selector.charAt(0) === "#") { //如果傳入的是"#.."形式 this.length = 1; this[0] = doc.getElementById(selector.slice(1)); }else if(typeof selector === "string") { //傳入的是字符串,假設(shè)全部為html標(biāo)簽 ,如"div" "p"等 var nodes = doc.getElementsByTagName(selector); this.length = nodes.length; for(var i=0,len=nodes.length;i首先,先看代碼段一,我們創(chuàng)建一個(gè)javascript引用類型,可以根據(jù)該引用類型以及輸入的參數(shù)創(chuàng)建一個(gè)實(shí)例對象,輸入的參數(shù)模擬JQuery選擇參數(shù),但沒有JQuery強(qiáng)大,支持部分類型。
我們知道,可以通過new JClass(...)來構(gòu)造一個(gè)實(shí)例對象,這沒問題,但是JClass也是一個(gè)函數(shù),可以被直接調(diào)用,而直接調(diào)用并不是我們想要的結(jié)果,為了防止JClass被開發(fā)人員直接調(diào)用,我們不能將JClass暴露給開發(fā)人員,那我們只能通過代碼段二方式來構(gòu)造JClass實(shí)例對象。
在代碼段二,我們可以將JQuery暴露給開發(fā)人員,因?yàn)闊o論是通過new JQuery()還是JQuery(),返回的都是JClass實(shí)例對象,這是我們要的結(jié)果。
在網(wǎng)頁開發(fā)過程中,為了代碼的復(fù)用,我們常常會(huì)提供一些工具方法來方便開發(fā),既然JQuery是完全暴露給開發(fā)人員使用的,我們完全可以將這些工具方法作為JQuery的靜態(tài)屬性。具體可參照代碼段三,當(dāng)然,我們還可以按照這種方式添加其它的工具方法 如text,val,attr,css ........
這些工具方法確實(shí)不錯(cuò)。JClass實(shí)例對象(封裝了DOM)也存在一些公用的方法,正好這些方法也可以借助工具方法來實(shí)現(xiàn),那怎么為JClass實(shí)例對象創(chuàng)建公用方法呢? 可以通過代碼段四的方式實(shí)現(xiàn)(如果對這里不理解,請百度JS的原型繼承概念) 。
最后可通過代碼段五,將JQuery取個(gè)別名 $ 且作為全局變量暴露出來。然后將代碼引入到HTML文件中進(jìn)行測試,可參照下面代碼:
JQuery的知識(shí)點(diǎn)分類jquery-t2 點(diǎn)擊看效果div文本值通過上面模擬的JQuery庫,我們應(yīng)該可以大概知道JQuery的主要功能:通過強(qiáng)大的選擇器獲得DOM元素,然后針將這些DOM元素的日常操作封裝成對應(yīng)的方法,如取值、賦值、修改、刪除等,同時(shí)JQuery還為網(wǎng)頁開發(fā)提供了一些工具類方法,如each、ajax、isArray、extend等。所以總的來說,JQuery知識(shí)點(diǎn)可分為三大類:
JQuery選擇器
JQuery對象的操作,如DOM操作、表單操作等
JQuery的工具方法
JQuery插件編寫(知識(shí)擴(kuò)展)
JQuery太流行了,網(wǎng)上的資料太多太多,以致于很多初學(xué)者根本不知道從哪學(xué)起,這里看一篇博客,那里翻一翻源碼,收集了大量的資料,最后發(fā)現(xiàn)根本沒時(shí)間學(xué)習(xí),即使花了大量的時(shí)間學(xué)習(xí),學(xué)習(xí)到的JQuery也成不了一個(gè)體系,到最后全部忘記了。開發(fā)的時(shí)候又只能去翻手冊,一直翻手冊能寫出好的代碼么?不可能吧。
下面我分享一下個(gè)人認(rèn)為比較好的資料供初學(xué)者一步一步學(xué)習(xí)。
JQuery的一些概念
JQuery入門(書籍+一篇博客)
鋒利的JQuery(第二版)
JQuery設(shè)計(jì)思想
JQuery深入學(xué)習(xí)(深入學(xué)習(xí)JQuery和javascript很好的資料)
JQuery源碼分析系統(tǒng)學(xué)習(xí)永遠(yuǎn)都不是記憶,記憶的東西遲早會(huì)被遺忘。真正要學(xué)習(xí)一門技術(shù),最基本的原則就是要理解它。學(xué)習(xí)JQuery也是,在學(xué)習(xí)JQuery的知識(shí)點(diǎn)時(shí),你首先要理解一些概念來輔助你理解這些知識(shí)點(diǎn)。 JQuery中的概念主要有這三個(gè): JQuery()、JQuery對象和DOM對象。
先說DOM對象,這個(gè)很簡單,它定義了訪問HTML文檔對象的一套屬性、方法和事件,沒有JQuery前,我們通常直接操作DOM,比較熟悉的API有getElementById 、GetElementByTagName等。
JQuery,它在JQuery中有個(gè)別名 $ 。通過上面章節(jié)的模擬代碼(對應(yīng)模擬代碼中的JQuery)可知,其實(shí)就是一個(gè)函數(shù),說得更細(xì)致點(diǎn)就是JQuery對象的工廠方法,它可以根據(jù)不同的入?yún)順?gòu)造JQuery對象,如:
字符串表達(dá)式。如 $("span") 、$("span .class")、$("#id")等
HTML 代碼片段。如 $("text") 等
DOM元素。 如$(dom) //假設(shè) var dom = document.getElementById("id");
JS Function 。 如 $(function(...) { ... } ); 一般對象或數(shù)組。如 { } 、[ ... ]等
JQuery除了能創(chuàng)建JQuery對象的同時(shí),JQuery自身也有很多靜態(tài)方法,也可以稱為工具方法,如 each、ajax、trim等。這些工具方法不僅在網(wǎng)頁設(shè)計(jì)時(shí)常常會(huì)被用到,而且也會(huì)被當(dāng)作工具方法用來實(shí)現(xiàn)JQuery對象的原型方法。
JQuery對象,非常重要的一個(gè)概念,類似于模擬代碼中的JClass實(shí)例,通常是通過JQuery構(gòu)造出的實(shí)例。在JQuery中,我們常常見到的JQuery對象是這樣的: $("#id") 、$("div")等。關(guān)于JQuery對象我們要明白以下幾點(diǎn):
JQuery對象繼承了JQuery原型(prototype)的所有屬性和方法
JQuery對象不是數(shù)組,但是采用了類似數(shù)組的結(jié)構(gòu)來存儲(chǔ)元素,而且存儲(chǔ)的元素是通過選擇器獲取得到的DOM對象。參照上面章節(jié)的模擬代碼(JClass實(shí)例對象),JQuery對象有個(gè)length屬性,表示當(dāng)前對象里存儲(chǔ)DOM對象的個(gè)數(shù),而這些通過選擇獲得的DOM對象,是采用下標(biāo)為0、1、2、3 ... 作為屬性名來進(jìn)行存儲(chǔ)的。所以,根據(jù)以上特性,我們完全可以通過下面這種方式來訪問元素:
var objs = $("div"); for(var i=0,len=objs.length;i綜合來說,JQuery、JQuery對象、DOM對象三者之間的關(guān)系是: JQuery是個(gè)工廠方法,用來構(gòu)造JQuery對象; JQuery對象是個(gè)類數(shù)組對象,里面存儲(chǔ)了DOM對象;
理解了三者之間的關(guān)系,我們在理解下面知識(shí)點(diǎn)時(shí),相對來說也就比較容易了:
關(guān)于過濾選擇器如何理解? 如$("div:first") 。
如果理解了JQuery對象的內(nèi)部結(jié)構(gòu),理解JQuery的過濾選擇器就很容易了,如 :first 其實(shí)就是取JQuery對象屬性為"0"的對象(封裝成JQuery對象),同理 :last取的是屬性為 length-1 的元素,:eq(index)取的是屬性為index的元素。在JQuery中,如何驗(yàn)證某個(gè)元素是否為空?
var $o = $("div .class"); if($ == null) { // 錯(cuò)誤的做法 //什么都沒找到 ...... } //正確的做法 if($o.html() == null) { //什么都沒找到 ... ... } //正確的做法 if($o.length) { //什么都沒找到 ... ... }JQuery對象和DOM對象如何轉(zhuǎn)換?
var dom = document.getElementById("id"); // DOM對象轉(zhuǎn)換成JQuery對象 var $dom = $(dom); // 參照J(rèn)Query對象的構(gòu)造方式 // 將JQuery對象轉(zhuǎn)換成DOM對象 for(var i=0,len=$dom.length;i總結(jié) 關(guān)于JQuery,上手雖然簡單,但如果要高效快速的使用開發(fā),還是需要好好理解下JQuery的。以上只是個(gè)人學(xué)習(xí)過程中的一些感悟和整理,建議各位在學(xué)習(xí)時(shí)也按照自己的思維習(xí)慣形成一套自己的知識(shí)體系,一來便于日后的開發(fā),二來也便于查閱別人的代碼。最后附注一些有意思的小問題,各位有興趣就思考下吧。
問題一. 你覺得下面哪種方式代碼好一點(diǎn)?為什么?
// 方式一 var $text = $("#text"); var $ts = $text.text(); //方式二 var $text = $("#text"); var $ts = $.text($text);問題二. 下面代碼中的this是什么呢?大概實(shí)現(xiàn)原理有什么?
$("#box").click(function(){ var obj = this; ... ... }(完)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/86091.html
摘要:同源策略在中有一個(gè)很重要的安全性限制,被稱為同源策略。然而,當(dāng)進(jìn)行一些比較深入的前端編程的時(shí)候,不可避免地需要進(jìn)行跨域操作,這時(shí)候同源策略就顯得過于苛刻。 JSONP原理 JSON和JSONP JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式。對于JSON大家應(yīng)該是很了解了吧,不是很清楚的朋友可以去json.org上了解下,簡單易懂。 ...
摘要:上節(jié)我們講了同源策略,這節(jié)我們講講如何跨域。當(dāng)這些從的腳本執(zhí)行出錯(cuò),因?yàn)檫`背了同源策略為了保證用戶信息不被泄露,錯(cuò)誤信息不會(huì)顯示出來,取而代之只會(huì)返回一個(gè)。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的中心思想,我們開課啦(每...
摘要:前端最基礎(chǔ)的就是。幫助從舊的事件方法轉(zhuǎn)換,和。方法移除用綁定的事件處理程序。特定的事件處理程序可以被移除元素上提供事件名稱,命名空間,處理函數(shù)。用于過濾器的觸發(fā)事件的選擇器元素的后代。事件觸發(fā)模擬觸發(fā)原生使用觸發(fā)。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS)...
摘要:前端最基礎(chǔ)的就是。幫助從舊的事件方法轉(zhuǎn)換,和。方法移除用綁定的事件處理程序。特定的事件處理程序可以被移除元素上提供事件名稱,命名空間,處理函數(shù)。用于過濾器的觸發(fā)事件的選擇器元素的后代。事件觸發(fā)模擬觸發(fā)原生使用觸發(fā)。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS)...
摘要:希望幫助更多的前端愛好者學(xué)習(xí)。前端開發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開發(fā)工程師當(dāng)你問起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒有網(wǎng)絡(luò)請求功能的庫。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡單 原文地址:Learning React.js is easier than you think 原文作...
閱讀 2161·2021-11-15 11:36
閱讀 1497·2021-09-23 11:55
閱讀 2494·2021-09-22 15:16
閱讀 2032·2019-08-30 15:45
閱讀 1868·2019-08-29 11:10
閱讀 1032·2019-08-26 13:40
閱讀 922·2019-08-26 10:44
閱讀 3175·2019-08-23 14:55