自己實現(xiàn)一個簡單的 jQuery API

自己實現(xiàn)一個簡單的 jQuery API

1.需求

如下的代碼結(jié)構(gòu):

<body>
    <ul>
        <li>第1個</li>
        <li>第2個</li>
        <li>第3個</li>
        <li>第4個</li>
        <li>第5個</li>
    </ul>
</body>

需求為:

window.jQuery = ???
window.$ = jQuery

var $div = $('div')
$div.addClass('red') // 可將所有 div 的 class 添加一個 red
$div.setText('hi') // 可將所有 div 的 textContent 變?yōu)?hi

2.思路分析

思路:

  • 寫一個方法 纸俭,找到這個節(jié)點
  • 寫一個 addClass方法,實現(xiàn)給找到的節(jié)點 添加樣式
  • 寫一個 setText 方法右莱,實現(xiàn)給找到的節(jié)點 設(shè)置內(nèi)容
  • 對以上方法進行封裝

3.具體方法

3.1 findNodesOrSelector 方法,找到這個節(jié)點

為了找到這個節(jié)點,傳入的參數(shù)可能是一個id即寡,也有可能是一個字符串即 ul>li>span>a 等修然,所以要分情況分析

function findNodesOrSelector(nodeOrSelector){
  let nodes ={}
  //判斷傳進來的參數(shù)是否為  節(jié)點還是字符串
  if(typeof nodeOrSelector ==='string' ){  //當傳入得到參數(shù)為字符串時
  let temp = document.querySelectorAll(nodeOrSelector)  //偽數(shù)組
        for(let i=0;i<temp.length;i++){
            nodes[i] = temp[i]
        }
    nodes.length = temp.length
    } else if(nodeOrSelector instanceof Node){ //當傳入得到參數(shù)為節(jié)點時
        nodes = {
            0:nodeOrSelector,
            length:1
            }
    }
    return nodes
}

3.2 addClass 方法笛钝,給找到的節(jié)點 添加樣式

因為給找到的節(jié)點添加樣式,所以要傳入一個參數(shù)愕宋;

同時玻靡,對已經(jīng)找到的節(jié)點一般情況下不是只有一個,那么我們添加樣式的時候也是不止給一個節(jié)點添加樣式掏婶,因此啃奴,需要對每個節(jié)點分別添加,就要依次對節(jié)點進行遍歷雄妥。

 function addClass(classes){  
    classes.forEach((value)=>{   //使用箭頭函數(shù)最蕾,第一個參數(shù)是this即classes
        for(let i=0;i<nodes.length;i++){     
            nodes[i].addClassList.add(value)    
        }
    })  
 }

3.3 setText 方法依溯,給找到的節(jié)點 設(shè)置內(nèi)容

和上面的方法一樣,先找到需要改變的節(jié)點瘟则,對它依次遍歷后再設(shè)置其內(nèi)容

同時黎炉,傳入一個參數(shù),即需要改變之后的參數(shù)

function setText(text){
  for(let i=0;i<nodes.length;i++){
     nodes[i].textContext = text
    }
}

3.4 getText 方法醋拧,獲得節(jié)點內(nèi)的文本內(nèi)容

function getText(){
        var texts = []
        for(let i=0;i<texts.length;i++){
            texts.push(nodes[i].textContext)
        }
        return texts
    }
}

4.拓展封裝

4.1第一次封裝:對以上方法進行封裝

        window.jQuery = function(nodeOrSelector){
            let nodes={}
            //判斷傳進來的參數(shù)是否為  節(jié)點還是字符串
            if(typeof nodeOrSelector ==='string' ){
                let temp = document.querySelectorAll(nodeOrSelector)  //偽數(shù)組
                for(let i=0;i<temp.length;i++){
                    nodes[i] = temp[i]
                }
                nodes.length = temp.length
            } else if(nodeOrSelector instanceof Node){ //當傳入得到參數(shù)為節(jié)點時
                nodes = {
                    0:nodeOrSelector,
                    length:1
                }
            }

            nodes.addClass = function (classes){
                classes.forEach((value)=>{
                    for(let i=0;i < nodes.length;i++){
                        nodes[i].classList.add(value)
                    }
                })
            }

            nodes.getText = function(){
                var texts = []
                for(let i=0;i<texts.length;i++){
                    texts.push(nodes[i].textContext)
                }
                return texts
            }

            nodes.setText = function(text){
                for(let i =0;i<nodes.length;i++){
                    nodes[i].textContent = text
                }
            }

            return nodes
        }

但是通常情況下慷嗜,在jQuery中不喜歡使用get和set方法,那么丹壕,還要進行第二次封裝庆械;
即:
當我不傳參數(shù)的時候默認我是要獲取節(jié)點內(nèi)容

當我傳入?yún)?shù)時,說明我要給節(jié)點設(shè)置內(nèi)容

4.2 對get和set方法進行封裝

function text(text){
    if(text === undefined){
        var texts = []
        for(let i=0;i<texts.length;i++){
            texts.push(nodes[i].textContext)
        }else{
            for(let i =0;i<nodes.length;i++){
                nodes[i].textContent = text
        }
}

4.3 第三次封裝

        window.$ = function(nodeOrSelector){
            let nodes={}
            //判斷傳進來的參數(shù)是否為  節(jié)點還是字符串
            if(typeof nodeOrSelector ==='string' ){
                let temp = document.querySelectorAll(nodeOrSelector)  //偽數(shù)組
                for(let i=0;i<temp.length;i++){
                    nodes[i] = temp[i]
                }
                nodes.length = temp.length
            } else if(nodeOrSelector instanceof Node){ //類型校驗:判斷是否為節(jié)點
                nodes = {
                    0:nodeOrSelector,
                    length:1
                }
            }

            nodes.addClass = function (classes){
                classes.forEach((value)=>{
                    for(let i=0;i < nodes.length;i++){
                        nodes[i].classList.add(value)
                    }
                })
            }
            return nodes
            }

            nodes.text = function(text){
                if(text === undefined){
                    var texts = []
                    for(let i=0;i<texts.length;i++){
                        texts.push(nodes[i].textContext)
                    }
                }else{
                    for(let i =0;i<nodes.length;i++){
                    nodes[i].textContent = text
                }
            }


此時菌赖,我們就可以直接使用 $('xxx') 進行訪問啦...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缭乘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琉用,更是在濱河造成了極大的恐慌堕绩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邑时,死亡現(xiàn)場離奇詭異奴紧,居然都是意外死亡,警方通過查閱死者的電腦和手機晶丘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門黍氮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铣口,你說我怎么就攤上這事滤钱。” “怎么了脑题?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵件缸,是天一觀的道長。 經(jīng)常有香客問我叔遂,道長他炊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任已艰,我火速辦了婚禮痊末,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哩掺。我一直安慰自己凿叠,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盒件,像睡著了一般蹬碧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炒刁,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天恩沽,我揣著相機與錄音,去河邊找鬼翔始。 笑死罗心,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的城瞎。 我是一名探鬼主播渤闷,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼全谤!你這毒婦竟也來了肤晓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤认然,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漫萄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卷员,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年腾务,在試婚紗的時候發(fā)現(xiàn)自己被綠了毕骡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡岩瘦,死狀恐怖未巫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情启昧,我是刑警寧澤叙凡,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站密末,受9級特大地震影響握爷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜严里,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一新啼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刹碾,春花似錦燥撞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辆布。三九已至,卻和暖如春茶鉴,著一層夾襖步出監(jiān)牢的瞬間锋玲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工涵叮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惭蹂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓割粮,卻偏偏與公主長得像盾碗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舀瓢,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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

  • 一廷雅、樣式篇 第1章 初識jQuery (1)環(huán)境搭建 進入官方網(wǎng)站獲取最新的版本 http://jquery.co...
    凜0_0閱讀 3,358評論 0 44
  • jQuery基礎(chǔ)(一)——樣式篇 1-2環(huán)境搭建 1-3 jQuery HelloWorld體驗 $(docume...
    croyance0601閱讀 1,079評論 0 8
  • 現(xiàn)在的我,生活過得很簡單京髓,周一至周五上班航缀,周末兩天休息,日子就是這樣日復一日重復地過著堰怨,看著日出芥玉,數(shù)著日落。 現(xiàn)在...
    孤獨不離閱讀 220評論 3 1
  • 找個安靜的地方备图,聽著和諧的小曲灿巧,請務(wù)必戴上耳機,有意外收獲哦-
    烏拉薩閱讀 101評論 0 0
  • 那似雪的雙眸 安靜了我浮躁的心 像夏夜的雪花啊 融入我的心房 多看一眼啊揽涮,多看一眼啊 那一眼啊抠藕,含著透明的露珠 —...
    逗霸君閱讀 173評論 1 7