實(shí)現(xiàn)一個 jQuery 的 API的過程

今天要模仿jQuery來實(shí)現(xiàn)兩個API,他們的功能是:

  1. 為選中的標(biāo)簽添加某個 class
  2. 將選中的標(biāo)簽的value替換為某個text

首先碳想,順著這個思路蔗彤,寫了以下代碼:
html+css如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .red {
      color: red;
    }
  </style>
</head>
<body>
<ul>
  <li>標(biāo)簽1</li>
  <li>標(biāo)簽2</li>
  <li>標(biāo)簽3</li>
  <li>標(biāo)簽4</li>
  <li>標(biāo)簽5</li>
</ul>
</body>
</html>

一. 想到哪寫到哪
js代碼如下:

    //給所有l(wèi)i添加類名red
    let liTags = document.querySelectorAll('ul > li')
    for(let i = 0;i<liTags.length;i++){
      liTags[i].classList.add('red')    
    }
    
    //把所有l(wèi)i的內(nèi)容替換為hello
    for(let i = 0;i<liTags.length;i++){
      liTags[i].textContent = 'hello'   
    }

二. 封裝為函數(shù)
上面的代碼復(fù)用性很低,所以我們把他封裝為函數(shù)列吼,每次使用時調(diào)用就好

//給所有l(wèi)i添加類名red
    function addClass(selector,classes){
      let nodes = document.querySelectorAll(selector)
      for(let key in classes){
        let value = classes[key]
        if(value){
          for(let i = 0;i<nodes.length;i++){
            nodes[i].classList.add(key)  
          }
        }else {
          for(let i = 0;i<nodes.length;i++){
            nodes[i].classList.remove(key)  
          }
        }
      }
    }
        
    //把所有l(wèi)i的內(nèi)容替換為hello
    function setText(selector,text){
      let nodes = document.querySelectorAll(selector)
      for(let i = 0;i<nodes.length;i++){
        nodes[i].textContent = text    
      }
    }
    let classes = {'red':true,'green':true,'blue':false}
    addClass.call(undefined,'ul>li',classes)
    setText.call(undefined,'ul>li','hello')

三. 添加命名空間
當(dāng)我們自己添加的函數(shù)越來越多時壁晒,會不小心把很多全局變量都給覆蓋了瓷们,所以需要命名空間

 window.myDom = {
      setClass: function(selector,classes){
        let nodes = document.querySelectorAll(selector)
        for(let key in classes){
          let value = classes[key]
          if(value){
            for(let i = 0;i<nodes.length;i++){
              nodes[i].classList.add(key)  
            }
          }else {
            for(let i = 0;i<nodes.length;i++){
              nodes[i].classList.remove(key)  
            }
          }
        }
      },
      setText: function(selector,text){
        let nodes = document.querySelectorAll(selector)
        for(let i = 0;i<nodes.length;i++){
          nodes[i].textContent = text    
        }
      }
    }
    myDom = window.myDom
   
    let classes = {'red':true,'green':true,'blue':false}
    myDom.setClass.call(undefined,'ul>li',classes)
    myDom.setText.call(undefined,'ul>li','hello')

四. 修改NodeList.prototype

NodeList.prototype.setClass = function(classes){
      for(let key in classes){
        let value = classes[key]
        if(value){
          for(let i = 0;i<this.length;i++){
            this[i].classList.add(key)  
          }
        }else {
          for(let i = 0;i<this.length;i++){
            this[i].classList.remove(key)  
          }
        }
      }
    }
    NodeList.prototype.setText = function(text){
      for(let i = 0;i<this.length;i++){
        this[i].textContent = text    
      }
    }
   
    let classes = {'red':true,'green':true,'blue':false}
    let liTags = document.querySelectorAll('ul>li')
    liTags.setClass.call(liTags,classes)
    liTags.setText.call(liTags,'hello')

五. 模仿jQuery

let jQuery = function(selector){
      let nodes = {}
      if(selector){
        nodes = document.querySelectorAll(selector)
      }
      nodes.setClass = function(classes){
        for(let key in classes){
          let value = classes[key]
          if(value){
            for(let i = 0;i<nodes.length;i++){
              nodes[i].classList.add(key)  
            }
          }else {
            for(let i = 0;i<nodes.length;i++){
              nodes[i].classList.remove(key)  
            }
          }
        }
      }
      nodes.setText = function(text){
        for(let i = 0;i<nodes.length;i++){
          nodes[i].textContent = text    
        }
      }
      return nodes
    }
    window.jQuery = jQuery
    window.$ = jQuery

   
    let classes = {'red':true,'green':true,'blue':false}
    let $liTags = $('ul>li')
    $liTags.setClass.call($liTags,classes)
    $liTags.setText.call($liTags,'hello')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末业栅,一起剝皮案震驚了整個濱河市秒咐,隨后出現(xiàn)的幾起案子谬晕,更是在濱河造成了極大的恐慌,老刑警劉巖携取,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攒钳,死亡現(xiàn)場離奇詭異,居然都是意外死亡雷滋,警方通過查閱死者的電腦和手機(jī)不撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晤斩,“玉大人焕檬,你說我怎么就攤上這事“谋茫” “怎么了实愚?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兔辅。 經(jīng)常有香客問我腊敲,道長,這世上最難降的妖魔是什么维苔? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任碰辅,我火速辦了婚禮,結(jié)果婚禮上介时,老公的妹妹穿的比我還像新娘没宾。我一直安慰自己,他們只是感情好沸柔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布循衰。 她就那樣靜靜地躺著,像睡著了一般勉失。 火紅的嫁衣襯著肌膚如雪羹蚣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天乱凿,我揣著相機(jī)與錄音顽素,去河邊找鬼。 笑死徒蟆,一個胖子當(dāng)著我的面吹牛胁出,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播段审,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼全蝶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抑淫,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤绷落,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后始苇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砌烁,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年催式,在試婚紗的時候發(fā)現(xiàn)自己被綠了函喉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡荣月,死狀恐怖管呵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哺窄,我是刑警寧澤捐下,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站堂氯,受9級特大地震影響蔑担,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咽白,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一啤握、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晶框,春花似錦排抬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侵贵,卻和暖如春届搁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窍育。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工卡睦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漱抓。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓表锻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乞娄。 傳聞我的和親對象是個殘疾皇子瞬逊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5显歧? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,474評論 1 45
  • 0. 寫在前面 當(dāng)你開始工作時确镊,你不是在給你自己寫代碼士骤,而是為后來人寫代碼。 —— Nichloas C. Zak...
    康斌閱讀 5,321評論 1 42
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,124評論 0 21
  • 1骚腥、 jQuery 能做什么敦间? jquery是一個豐富的js庫瓶逃,內(nèi)部對js的很多復(fù)雜的方法進(jìn)行了封裝和加工束铭,比如j...
    zh_yang閱讀 1,407評論 6 13
  • 文章收錄 展望:2018,屬于數(shù)據(jù)驅(qū)動的智能媒體時代 站在2017厢绝,預(yù)測未來媒體 我的大編輯部設(shè)想 我的中央廚房建...
    sennchi閱讀 195評論 0 0