实现一个 jQuery 的 API

2019-08-16  本文已影响0人  YukiWeng

需要实现的效果:
1.可将所有 div 的 class 添加一个 red
2.可将所有 div 的 textContent 变为 hi
补全问号处的代码

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

var $div = $('div')
$div.addClass('red') 
$div.setText('hi') 

思路如下:
初始化一个hash对象
判断传入参数为字符串(选择器)还是节点
①若为字符串 => 寻找对应节点=>放入hash
②若为节点=>直接放入hash

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
      //这里用了一个中间变量temp只是为了让nodes结果更纯净,去掉也可以
    }else if(nodeOrSelector instanceof Node){
        nodes={
        0:nodeOrSelector,
        length:1
      }
    }

添加两个方法函数
使用DOM API

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

完整代码如下:

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
      //这里用了一个中间变量temp只是为了让nodes结果更纯净,去掉也可以
    }else if(nodeOrSelector instanceof Node){
        nodes={
        0:nodeOrSelector,
        length:1
      }
    }
    nodes.addClass=function(classes){
       for(let i=0;i<nodes.length;i++){
                nodes[i].classList.add(classes)            
            }
     }          
    nodes.setText=function(text){
      for(let i=0;i<nodes.length;i++){
        nodes[i].textContent=text
      }      
    }
return nodes
}

window.$ = jQuery
var $div = $('div')
$div.addClass('red') 
$div.setText('hi')

优化:
代码中addClass方法一次只允许传一个值,若希望传多个class,可改为传数组,并使用forEach方法;
setText方法传值后,会覆盖掉原本的文本,若希望完善一些,可添加判断语句

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){
        let text=[]
        for(i=0;i<nodes.length;i++){
            text.push(nodes[i].textContent)
        }
        return text
    }else{
        for(let i=0;i<nodes.length;i++){
            nodes[i].textContent=text}
        }
    }
    return nodes
}
$div.addClass(['red','blue']) //添加了两个class
$div.text('hi') // 用hi覆盖原文本
$div.text() // 返回文本
上一篇下一篇

猜你喜欢

热点阅读