自己寫個API搞懂jQuery

首先讓我們來封裝兩個函數(shù)

  1. function getSibiling(node){} 同時獲取一個節(jié)點的哥哥和弟弟
  2. function addClass(node,classes){} 為一個節(jié)點同時添加多個class

第一個函數(shù)

function getSibiling(node){
  var number =node.parentNode.children
  console.log(number)
  var arrey ={length:0}
  for(let i=0;i<number.length;i++){
    if(number[i]!==node){
      arrey[arrey.length]=number[i]
      arrey.length +=1
    }
  }return arrey
}

第二個函數(shù)

function addClass(node,classes){
    for(let key in classes){
      var value = classes[key]
      console.log(value)
      var method =value?'add':'remove'
      node.classList[method](key)
    }  
}

命名空間(讓別人知道這是我寫的庫)

window.yydom={}

yydom.getSibiling =function getSibiling(node){
  var number =node.parentNode.children
  var arrey ={length:0}
  for(let i=0;i<number.length;i++){
    if(number[i]!==node){
      arrey[arrey.length]=number[i]
      arrey.length +=1
    }
  }return arrey
}

yydom.addClass =function addClass(node,classes){
    for(let key in classes){
      var value = classes[key]
      var method =value?'add':'remove'
      node.classList[method](key)
    }  
}
console.log(yydom.getSibiling(item4))

yydom.addClass(item1,{a:true,b:false,c:true})

但是這樣感覺還是有些麻煩抠刺,怎么才能item3.getSibiling() item3.addClass()這樣直接調(diào)用呢砍聊?
方法一:改原型

Node.prototype.addClass = function addclass(classes){
  for(let key in classes){
      var value = classes[key]
      var method =value?'add':'remove'
      this.classList[method](key)
    }  
}
item1.addClass({a:true,b:false,c:true})



Node.prototype.getSibiling = function(){
  var number =this.parentNode.children
  
  var arrey ={length:0}
  for(let i=0;i<number.length;i++){
    if(number[i]!==this){
      arrey[arrey.length]=number[i]
      arrey.length +=1
    }
  }return arrey
}
console.log(item3.getSibiling())
console.log(Node.prototype)

k5tD9s.png

方法二:重新寫一個node2(無侵入)

window.Node2 = function(node){
  return{
    //getSibling:function(){}
    addClass:function(classes){
      for(let key in classes){
        var value = classes[key]
        console.log(value)
        var method =value?'add':'remove'
        node.classList[method](key)
      }  
    }
  }
}
var node2 = Node2(item2)
node2.addClass({a:true,b:false,c:true})

Node2就相當于是jQuery,只不過jQuery要更復(fù)雜一些垒手,它還可以通過選擇器來操作節(jié)點

window.Node2 = function(nodeOrSelector){
  let node
  if(typeof nodeOrSelector === 'string'){
    node = document.querySelector(nodeOrSelector)
  }else{
    node = nodeOrSelecter
  }
  return{                                   // 返回一個方法對象,里面有兩個方法一個getSibling一個addClass
    getSibling:function(){
      var number =node.parentNode.children

      var arrey ={length:0}
      for(let i=0;i<number.length;i++){
        if(number[i]!==node){
          arrey[arrey.length]=number[i]
          arrey.length +=1
        }
      }return arrey
  },
    addClass:function(classes){
      for(let key in classes){
        var value = classes[key]
        console.log(value)
        var method =value?'add':'remove'
        node.classList[method](key)         //node是外面的辕棚,形成閉包
      }  
    }
  }
}
var node2 = Node2("ul>li:nth-child(3)")
node2.addClass({red:true,b:false,c:true})
console.log(node2.getSibling())

首先先判斷nodeOrSelector是選擇器還是節(jié)點,然后操作dom找到這些節(jié)點曼振,node保存這些節(jié)點侵状,return返回一個對象
所以JQuery的實質(zhì)是一個構(gòu)造函數(shù),接受一個可能是節(jié)點的參數(shù)正罢,然后返回一個方法對象去操作這個節(jié)點
那么如果我想同時操作6個li呢垫蛆?并且在這6個li上同時添加一個blue類

window.Node2 = function(nodeOrSelector){
  let nodes={}
  if(typeof nodeOrSelector === "string"){
    let temp = document.querySelectorAll(nodeOrSelector)
    
    for(let i=0;i<temp.length;i++){
      nodes[i]=temp[i]
    }
    nodes.length=temp.length
    
  }else{
    if(nodeOrSelector instanceof Node){
      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是一個偽數(shù)組
 
}
  
var node2=Node2('ul>li')
node2.addClass(['blue'])

添加一個jQuery的api,獲取文本.text()腺怯,當有參數(shù)時,就用這個text覆蓋原先個text,當不給參數(shù)時認為獲取元素的text文本

  nodes.text=function(text){
    if(text === undefined){
      var texts = []
      for(let i=0;i<nodes.length;i++){
        texts.push(nodes[i].textContent)     //nodes是在外面聲明的川无,構(gòu)成閉包
      }return texts
    }else{
      for(let i=0;i<nodes.length;i++){
        nodes[i].textContent = text
      }
    }
  }
console.log(node2.text())
node2.text('Hello')

jQuery就是把node2換成jQuery呛占,然后window.$=jQuery

window.jQuery = function(nodeOrSelector){
  let nodes={}
  if(typeof nodeOrSelector === "string"){
    let temp = document.querySelectorAll(nodeOrSelector)
    
    for(let i=0;i<temp.length;i++){
      nodes[i]=temp[i]
    }
    nodes.length=temp.length
    
  }else{
    if(nodeOrSelector instanceof Node){
      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.text=function(text){
    if(text === undefined){
      var texts = []
      for(let i=0;i<nodes.length;i++){
        texts.push(nodes[i].textContent)
      }return texts
    }else{
      for(let i=0;i<nodes.length;i++){
        nodes[i].textContent = text
      }
    }
  }
  return nodes
 }
window.$=jQuery
  
var $div=$('div')
$div.addClass(['red'])
$div.text('hi')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市懦趋,隨后出現(xiàn)的幾起案子晾虑,更是在濱河造成了極大的恐慌,老刑警劉巖仅叫,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帜篇,死亡現(xiàn)場離奇詭異,居然都是意外死亡诫咱,警方通過查閱死者的電腦和手機笙隙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坎缭,“玉大人竟痰,你說我怎么就攤上這事√秃簦” “怎么了坏快?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長憎夷。 經(jīng)常有香客問我莽鸿,道長,這世上最難降的妖魔是什么拾给? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任祥得,我火速辦了婚禮兔沃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啃沪。我一直安慰自己粘拾,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布创千。 她就那樣靜靜地躺著缰雇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪追驴。 梳的紋絲不亂的頭發(fā)上械哟,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音殿雪,去河邊找鬼暇咆。 笑死,一個胖子當著我的面吹牛丙曙,可吹牛的內(nèi)容都是我干的爸业。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼亏镰,長吁一口氣:“原來是場噩夢啊……” “哼扯旷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起索抓,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤钧忽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逼肯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耸黑,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年篮幢,在試婚紗的時候發(fā)現(xiàn)自己被綠了大刊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡三椿,死狀恐怖奈揍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赋续,我是刑警寧澤男翰,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站纽乱,受9級特大地震影響蛾绎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一租冠、第九天 我趴在偏房一處隱蔽的房頂上張望鹏倘。 院中可真熱鬧,春花似錦顽爹、人聲如沸纤泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捏题。三九已至,卻和暖如春肉渴,著一層夾襖步出監(jiān)牢的瞬間公荧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工同规, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留循狰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓券勺,卻偏偏與公主長得像绪钥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子关炼,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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