美文网首页
实现jQuery API的addClass和addText

实现jQuery API的addClass和addText

作者: MDIF | 来源:发表于2018-12-22 20:38 被阅读0次

    首先看下题目

    window.jQuery = ???
    window.$ = jQuery
    
    var $div = $('div')
    $div.addClass('red') // 可将所有 div 的 class 添加一个 red
    $div.setText('hi') // 可将所有 div 的 textContent 变为 hi
    

    答案如下

           window.jQuery = function (node) {
                return {
                    //classNameList是一个哈希表,key为className,value为是布尔,true表示加名字,false表示删名字
                    addClass: function (classNameList) {
                        //获取全部DIV标签
                        let divs = document.querySelectorAll(node)
    
                        //给每个标签添加class
                        for (let i = 0; i < divs.length; i++) {
                            for (let key in classNameList) {
                                let methodName = classNameList[key] ? 'add' : 'remove'
                                divs[i].classList[methodName](key)
                            }
                        }
                    },
                    setText: function (text) {
                        //获取全部DIV标签
                        let divs = document.querySelectorAll(node)
    
                        //修改每个DIV的textContent
                        for (let i = 0; i < divs.length; i++) {
                            divs[i].textContent = text
                        }
                    }
                }
            }
    

    分析一下
    $div需要拥有addClass和setText方法,所以window.jQuery = ???应该要返回这两个方法。可以确定???处的结构

    window.jQuery = function (){
        return {
            addClass:function (){},
            setText:function (){}
       }
    }
    

    确定好结构就可以懵逼愉快的写代码来实现啦。
    首先题目需要获取到所有的DIV,这时候浏览器自带的API就可以发挥作用了

    document.querySelectorAll()
    

    上面的API会返回一个数组,数组里就是全部的DIV了。
    拿到标签数组,遍历之。
    遍历的时候为每一个元素加上class,使用到的还是浏览器自带的API。

    Element.classList.add()//添加class
    Element.classList.remove()//删除class
    

    这样一个简单的API就写好了。
    这里有个技巧

     let methodName = classNameList[key] ? 'add' : 'remove'
     divs[i].classList[methodName](key)
    
    //没有简化前
    if(classNameList[key]){
      divs[i].classList.add(key)
    }else{
      divs[i].classList.remove(key)
    }
    

    上面classList[methodName]会是'add'或者'remove',分别对应classList.add和classList.remove。

    setText的思路和上面基本一致。就是换一个API

    Node.textContent
    

    最后测试结果如下



    优化了一下代码

            window.jQuery = function (nodeOrSelector) {
                let nodes = {}
    
                //判断参数类型
                if (typeof nodeOrSelector === 'string') {
                    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 }
                }
    
                //添加addClass方法
                nodes.addClass = function (classNameList) {
                    //给每个标签添加class       
                    for (let i = 0; i < nodes.length; i++) {
                        for (let key in classNameList) {
                            let methodName = classNameList[key] ? 'add' : 'remove'
                            nodes[i].classList[methodName](key)
                        }
                    }
                }
    
                //添加text方法
                nodes.text = function (text) {
                   if (text === undefined){
                       let 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
                       }
                   }
                }
                //返回给$div,不然$div啥也没有
                return nodes
            }
    
            window.$ = jQuery
    
            let $div = $.call(undefined, 'div')
    
            $div.addClass.call($div, {
                red: false,
                pink: true
            })
            
            $div.text.call($div,'hi')
    

    相关文章

      网友评论

          本文标题:实现jQuery API的addClass和addText

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