[JavaScript練習(xí)]造個(gè)簡(jiǎn)單的DOM庫(kù)

成品:點(diǎn)我
源碼:點(diǎn)這個(gè)我
需求如下:

let items = $('li')
// 使用$方法傳入選擇器内地,可以返回一個(gè)內(nèi)容為元素節(jié)點(diǎn)的數(shù)組
items.on('click', function(){
  console.log('click')
})
// 返回的items 對(duì)象有一個(gè)on方法可以傳入事件和監(jiān)聽(tīng)事件回調(diào)的方法
items.addClass('hi').removeClass('error')
// 新增一個(gè)addClass 和 removeClass方法,并且可以鏈?zhǔn)秸{(diào)用
items.text('你好')
// 為數(shù)組里面每個(gè)item 寫(xiě)入text 
items.text() 
// 返回內(nèi)容
item = $(items.get(0))

// 1. item 沒(méi)有 siblings 方法
// 2. 需求要有 xxx.siblings 方法
// 3. $item = $(item)   $item.siblings() 返回 item 的兄弟

// 1. $item.siblings() 沒(méi)有 addClass 方法
// 2. 需求要有  $item.siblings().addClass
// 3. $item.siblings() 的結(jié)果是 $('li') 類(lèi)似的東西

$item.siblings().removeClass('active').end()
  .addClass('active')
  • 第一個(gè)需求赋除,需要我們通過(guò)$方法傳入一個(gè)需要查詢(xún)的選擇器阱缓,并使它返回一個(gè)包含查詢(xún)到結(jié)果的數(shù)組,這個(gè)數(shù)組里面是元素和節(jié)點(diǎn):
window.$ = function (selectorOrNode) {
    let array = []
    let items = document.querySelectorAll(selectorOrNode)
    for (var i = 0; i < items.length; i++) {
        array.push(items[i])
    }
    return array
}
  • 返回的items 對(duì)象有一個(gè)on方法可以傳入事件和監(jiān)聽(tīng)事件回調(diào)的方法
array.on = function(eventType, fnc){
  for(var i = 0; i < items.length; i++){
    array[i].addEventListener(eventType, fnc)
  }
}
  • 新增一個(gè)addClass 和 removeClass方法举农,并且可以鏈?zhǔn)秸{(diào)用
array.addClass = function (value) {
  for (var i = 0; i < array.length; i++) {
    array[i].classList.add(value)
  }
  return array
}
array.removeClass = function (value) {
  for (var i = 0; i < array.length; i++) {
    array[i].classList.remove(value)
  }
  return array
}

這里還有兩個(gè)問(wèn)題荆针,如果傳值為空,會(huì)傳入一個(gè)undefined 作為參數(shù)颁糟,此時(shí)不應(yīng)該給原數(shù)組做任何操作航背,我們修改一下:

array.addClass = function (className) {
  if (className !== undefined) {
    for (var i = 0; i < array.length; i++) {
      array[i].classList.add(className)
    }
  }
  return array
}
array.removeClass = function (className) {
  if (className !== undefined) {
    for (var i = 0; i < array.length; i++) {
      array[i].classList.remove(className)
    }
  }
  return array
}
  • 新增一個(gè)text方法,用于修改數(shù)組里面元素的內(nèi)容棱貌,同時(shí)當(dāng)不傳值時(shí)玖媚,以數(shù)組形式返回里面的內(nèi)容,這里有2個(gè)問(wèn)題:
    1. 如果使用contentText的方法會(huì)將元素內(nèi)所有內(nèi)容覆蓋键畴,尋找是否有其他方法最盅,或者新建不同的方法用來(lái)區(qū)別用途,否則該方法只適用于沒(méi)有子元素的元素
    2. 返回的不是原數(shù)組
array.text = function (text) {
  if (text !== undefined) {
    for (var i = 0; i < array.length; i++) {
      array[i].textContent = text  //這個(gè)方法有局限
    }
    return array
  }else{
    let result = []
    for(var i =0; i< array.length;i++){
      result.push(array[i].textContent)
    }
    return result
  }
}
  • 下一個(gè)需求起惕,如果傳入的是一個(gè)元素/或者節(jié)點(diǎn)涡贱,此時(shí)需要返回包含這個(gè)元素的數(shù)組,且可以調(diào)用前面的方法惹想,或者傳入的是一個(gè)數(shù)組问词,則將每個(gè)數(shù)組里面如果是元素的部分組成新的數(shù)組,用于調(diào)用$里面數(shù)組的方法:
window.$ = function (selectorOrNode) {
    let array = []
    if (typeof selectorOrNode === 'string') {
        let items = document.querySelectorAll(selectorOrNode)
        for (var i = 0; i < items.length; i++) {
            array.push(items[i])
        }
    } else if (selectorOrNode instanceof Element) {
        array.push(selectorOrNode)
    } else if (selectorOrNode instanceof Array) {
        for (var i = 0; i < selectorOrNode.length; i++) {
            if (selectorOrNode[i] instanceof Element) {
                array.push(selectorOrNode[i])
            }
        }
    }

    array.on = function (eventType, fnc) {
        for (var i = 0; i < array.length; i++) {
            array[i].addEventListener(eventType, fnc)
        }
        return array
    }
    array.addClass = function (className) {
        if (className !== undefined) {
            for (var i = 0; i < array.length; i++) {
                array[i].classList.add(className)
            }
        }
        return array
    }
    array.removeClass = function (className) {
        if (className !== undefined) {
            for (var i = 0; i < array.length; i++) {
                array[i].classList.remove(className)
            }
        }
        return array
    }
    array.text = function (text) {
        if (text !== undefined) {
            for (var i = 0; i < array.length; i++) {
                array[i].textContent = text
            }
            return array
        } else {
            let result = []
            for (var i = 0; i < array.length; i++) {
                result.push(array[i].textContent)
            }
            return result
        }
    }
    return array
}
  • 再加一個(gè)get方法獲取數(shù)組中的子元素:
array.get = function(index){
  return array[index]
}
  • 新增獲取一個(gè)元素的兄弟元素的方法sibling()嘀粱,且可以鏈?zhǔn)秸{(diào)用子方法end()返回原數(shù)組:
array.siblings = function(){
  let sibling = array[0].parentNode.children
  // 該方法只用作判斷元素的兄弟姐妹激挪,所以傳入的是一個(gè)數(shù)組辰狡,該數(shù)組里面只有一個(gè)元素,即需要判斷兄弟姐妹的那個(gè)元素
  let result = []
  for(var i = 0 ;i<sibling.length;i++){
    if(sibling[i] !== array[0]){
      result.push(sibling[i])
    }
  }
  let items = $(result)
  // 遞歸保證結(jié)果依然能使用$里面的數(shù)組方法
  items.previousSelection = array
  // 附加一個(gè)屬性為執(zhí)行該方法前的數(shù)組垄分,用于后面的end()方法返回原數(shù)組
  return items 
}
array.end = function (){
  return array.previousSelection
}

學(xué)習(xí)過(guò)程中遇到的問(wèn)題:

  • for循環(huán)遍歷時(shí)宛篇,addClass,on薄湿,removeClass方法都用錯(cuò)了長(zhǎng)度叫倍,用了item.length,導(dǎo)致出現(xiàn)了bug豺瘤,再比對(duì)老師的原代碼時(shí)才發(fā)現(xiàn)吆倦,反映了光模仿代碼也是會(huì)出問(wèn)題的,謹(jǐn)記謹(jǐn)記坐求。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚕泽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桥嗤,更是在濱河造成了極大的恐慌须妻,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砸逊,死亡現(xiàn)場(chǎng)離奇詭異璧南,居然都是意外死亡掌逛,警方通過(guò)查閱死者的電腦和手機(jī)师逸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豆混,“玉大人篓像,你說(shuō)我怎么就攤上這事∶笏牛” “怎么了员辩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鸵鸥。 經(jīng)常有香客問(wèn)我奠滑,道長(zhǎng),這世上最難降的妖魔是什么妒穴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任宋税,我火速辦了婚禮,結(jié)果婚禮上讼油,老公的妹妹穿的比我還像新娘杰赛。我一直安慰自己,他們只是感情好矮台,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布乏屯。 她就那樣靜靜地躺著根时,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辰晕。 梳的紋絲不亂的頭發(fā)上蛤迎,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音含友,去河邊找鬼忘苛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唱较,可吹牛的內(nèi)容都是我干的扎唾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼南缓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胸遇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起汉形,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤讲逛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仇箱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蚌讼,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年岔冀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凯旭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡使套,死狀恐怖罐呼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侦高,我是刑警寧澤嫉柴,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站奉呛,受9級(jí)特大地震影響计螺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞧壮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一登馒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馁痴,春花似錦谊娇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赠堵。三九已至,卻和暖如春法褥,著一層夾襖步出監(jiān)牢的瞬間茫叭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工半等, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揍愁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓杀饵,卻偏偏與公主長(zhǎng)得像莽囤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子切距,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 一朽缎、樣式篇 第1章 初識(shí)jQuery (1)環(huán)境搭建 進(jìn)入官方網(wǎng)站獲取最新的版本 http://jquery.co...
    凜0_0閱讀 3,380評(píng)論 0 44
  • 第一章 入門(mén) 基本功能:訪問(wèn)和操作 dom 元素,控制頁(yè)面樣式谜悟,對(duì)頁(yè)面的事件處理话肖,與ajax完美結(jié)合,有豐富的插件...
    X_Arts閱讀 1,045評(píng)論 0 2
  • 2017.7.21 6M23D 西紅柿中含有豐富的維生素葡幸、礦物質(zhì)...
    梓辰麻麻閱讀 112評(píng)論 0 0
  • 一早趕到派出所最筒,領(lǐng)到新的身份證,有效期拉長(zhǎng)到20年了蔚叨,下一次換證床蜘,應(yīng)該是我成為一個(gè)退休大媽的時(shí)候,從奔四變成...
    米修米修嗶哩嗶哩閱讀 117評(píng)論 0 0
  • 讀《少年維特的煩惱》缅叠,激起了心底深處很多的回憶悄泥,那回憶不僅有畫(huà)面虏冻,還充盈著當(dāng)時(shí)的感受和心情肤粱,非常的強(qiáng)烈而又那么清晰...
    喜氣襲人閱讀 362評(píng)論 1 2