美文网首页
实现一个 jQuery 的 API

实现一个 jQuery 的 API

作者: YukiWeng | 来源:发表于2019-08-16 17:41 被阅读0次

    需要实现的效果:
    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() // 返回文本
    

    相关文章

      网友评论

          本文标题:实现一个 jQuery 的 API

          本文链接:https://www.haomeiwen.com/subject/cksqsctx.html