實(shí)現(xiàn)一個(gè) jQuery 的 API

最近開始學(xué)習(xí) jQuery调炬,jQuery 是 JavaScript?最受歡迎的一個(gè)庫语盈,它讓原本極不方便的JS DOM API 變得十分易用,那么它是如何做到的呢缰泡?

要理解jQuery原理刀荒,我們可以用現(xiàn)有的DOM知識(shí)嘗試寫一個(gè)類似jQuery的API


首先我們寫一個(gè)列表,給它加上id

以選項(xiàng)3為節(jié)點(diǎn)棘钞,找到其兄弟節(jié)點(diǎn)(代碼見截圖)

通過?var allChildren = item3.parentNode.children 獲取 item3 父節(jié)點(diǎn)的所以子節(jié)點(diǎn)缠借,然后遍歷所有子節(jié)點(diǎn),選出不是 item3 的所有節(jié)點(diǎn)宜猜,這樣就找到選項(xiàng)3的所以兄弟節(jié)點(diǎn)啦泼返。可以 console.log一下

(由于array是偽數(shù)組姨拥,不能用push的方法绅喉,所以我們用到?array[array.length] = allChildren[i] 的方法)

然后我們把這些代碼封裝一下(給個(gè)函數(shù))

封裝的好處有很多:給代碼一個(gè)名字方便調(diào)用;形成局部變量可以避免覆蓋JS原始變量(立即調(diào)用函數(shù))

給這個(gè)函數(shù)取個(gè)名字叫乌,如 getSiblings柴罐;把 item3 換成 node,這樣輸入任意節(jié)點(diǎn)都可以使用這個(gè)函數(shù)了憨奸;注意不要忘記 return

這樣我們就得到了一個(gè)函數(shù)?function getSiblings(node){}?


現(xiàn)在你已經(jīng)學(xué)會(huì)如何封裝一個(gè)函數(shù)革屠,讓我們嘗試封裝函數(shù):function addClass(node, classes){}

現(xiàn)在我們要給 item3 加 class屬性

首先我們聲明一個(gè) classes 對(duì)象,里面有 a排宰、b似芝、c 三個(gè)屬性;同時(shí)分別給它們一個(gè)布爾值额各,方便 add 和 remove国觉;遍歷各個(gè)屬性吧恃。

可以看到虾啦,class b、c已經(jīng)被添加到 item3 中了

同樣我們來封裝一下這些代碼

現(xiàn)在,只要你給一個(gè) node 和 classes 于此函數(shù)傲醉,就可以給 該節(jié)點(diǎn)添加 classes所包含的正確屬性


命名空間:

給封裝的函數(shù)一個(gè)名字蝇闭,方便其他人使用,同時(shí)防止與前人命名的沖突硬毕。

var Adadom = {}

Adadom.getSiblings(node)

Adadom.addClass(node, {a: false, b: true,c:true})

得到代碼如下呻引,這樣做也能避免將JS 提供的DOM覆蓋

Ada 的 dom

能不能把node 放在前面

node.getSiblings()

node.addClass()

方法一:擴(kuò)展 Node 接口

直接在 Node.prototype 上加函數(shù)

Node 如何取到 item3?用 this 吐咳,why逻悠?把上面寫成 .call 的形式,因?yàn)?this 是call 的第一個(gè)參數(shù)韭脊。那么用 this 就顯而易見了

但是這樣太亂了童谒,總不能所有人都在Node原型上加屬性吧?所以有了方法2

方法二:新的接口 BetterNode

示例如下

function Node2(node){

? ? return {

? ? ? ? element: node,

? ? ? ? getSiblings: function(){

? ? ? ? },

? ? ? ? addClass: function(){

? ? ? ? }

? ? }

}

let node =document.getElementById('x')

let node2 = Node2(node)

node2.getSiblings()

node2.addClass()

這種方法叫做「無侵入」即對(duì) Node 無侵入

把 Node2 改成jQuery吧

function jQuery(node){

? ? return {

? ? ? ? element: node,

? ? ? ? getSiblings: function(){

? ? ? ? },

? ? ? ? addClass: function(){

? ? ? ? }

? ? }

}

let node =document.getElementById('x')

let node2 =jQuery(node)

node2.getSiblings()

node2.addClass()

再給個(gè)縮寫吧:alias

window.$ = jQuery

var node2 = $(node)

但是為了防止記混 node2 到底有沒有引入 jQuery

大家通常這樣寫 var $node2 = $(node)


完整代碼見?github

至此沪羔,你已經(jīng)知道 jQuery 是個(gè)什么了:它就是一個(gè)函數(shù)饥伊,是 JS 原始 DOM的擴(kuò)展,便于我們更好得使用JS寫代碼的加強(qiáng)版 DOM API蔫饰。

本文主要用于個(gè)人學(xué)習(xí)使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琅豆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子篓吁,更是在濱河造成了極大的恐慌茫因,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杖剪,死亡現(xiàn)場離奇詭異节腐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)摘盆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門翼雀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孩擂,你說我怎么就攤上這事狼渊。” “怎么了类垦?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵狈邑,是天一觀的道長。 經(jīng)常有香客問我蚤认,道長米苹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任砰琢,我火速辦了婚禮蘸嘶,結(jié)果婚禮上良瞧,老公的妹妹穿的比我還像新娘。我一直安慰自己训唱,他們只是感情好褥蚯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著况增,像睡著了一般赞庶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澳骤,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天歧强,我揣著相機(jī)與錄音,去河邊找鬼为肮。 笑死誊锭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弥锄。 我是一名探鬼主播丧靡,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼籽暇!你這毒婦竟也來了温治?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤戒悠,失蹤者是張志新(化名)和其女友劉穎熬荆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绸狐,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卤恳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寒矿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片突琳。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖符相,靈堂內(nèi)的尸體忽然破棺而出拆融,到底是詐尸還是另有隱情,我是刑警寧澤啊终,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布镜豹,位于F島的核電站,受9級(jí)特大地震影響蓝牲,放射性物質(zhì)發(fā)生泄漏趟脂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一例衍、第九天 我趴在偏房一處隱蔽的房頂上張望昔期。 院中可真熱鬧已卸,春花似錦、人聲如沸镇眷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欠动。三九已至,卻和暖如春惑申,著一層夾襖步出監(jiān)牢的瞬間具伍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工圈驼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留人芽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓绩脆,卻偏偏與公主長得像萤厅,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子靴迫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容