最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS全解(七)手动封装DOM库(对象风格)

    正文概述 掘金(没故事的燕同学)   2020-12-07   336

    JS全解(七)手动封装DOM库(对象风格)

    先了解一波专业术语:

    我们把提供给其他人用的工具代码叫做库,比如 jQueryUnderscore

    API

    库暴露出来的函数或属性叫做API(应用编程接口)

    API (web 或 XML 页面) = DOM + JS (脚本语言)

    框架

    当你的库变得很大,并且需要学习才能看懂,那么这个库就叫框架,比如Vue/React

    那什么是DOM呢?

    手写了一个基础的DOM库,涉及了基本的增删改查:

    增 代码如下

    JS全解(七)手动封装DOM库(对象风格)

    window.dom = {
        // ****************** 增
        create(string) {
            const container = document.createElement("template")
            container.innerHTML = string.trim()
            return container.content.firstChild
        },
        after(node, node2) {
            node.parentNode.insertBefore(node2, node.nextSibling)
        },
        before(node, node2) {
            node.parentNode.insertBefore(node2, node)
        },
        append(parent, node) {
            parent.appendChild(node)
        },
        wrap(node, parent) {
            dom.before(node, parent)
            dom.append(parent, node)
        }
    }
    

    删 代码如下

    JS全解(七)手动封装DOM库(对象风格)

    window.dom = {
            // ****************** 删
        remove(node) {
            const { childNodes } = node
            const array = []
            for (let i = 0; i < childNodes.length; i++) {
                dom.remove(childNodes[i])
                array.push(childNodes[i])
            }
            return array
        },
        empty(node) {
            const array = []
            let x = node.firstChild
            while (x) {
                array.push(dom.remove(node.firstChild))
                x = node.firstChild
            }
            return array
        }
    }
    

    改 代码如下

    JS全解(七)手动封装DOM库(对象风格)

    window.dom = {
        // ****************** 改
            attr(node, name, value) { //重载
            if (arguments.length === 3) {
                node.setAttribute(name, value)
            } else if (arguments.length === 2) {
                return node.getAttribute(name)
            }
        },
        text(node, string) { //适配
            if (arguments.length === 2) {
                if ('innerText' in node) {
                    node.innerText = string
                } else {
                    node.textContent = string
                }
            } else if (arguments.length === 1) {
                if ('innerText' in node) {
                    return node.innerText
                } else {
                    return node.textContent
                }
            }
        },
        html(node, string) { //重载
            if (arguments.length === 2) {
                node.innerHTML = string
            }
            if (arguments.length === 1) {
                return node.innerHTML
            }
        },
        style(node, name, value) {
            if (arguments.length === 3) {
                //dom.style(div,'color','red')
                node.style[name] = value
            } else if (arguments.length === 2) {
                if (typeof name === 'string') {
                    //dom.style(div,'color')
                    return node.style[name]
                } else if (name instanceof Object) {
                    //dom.style(div,{color:'red'})
                    const object = name
                    for (let key in object) {
                        node.style[key] = object[key]
                    }
                }
            }
        },
        class: {
            add(node, className) {
                node.classList.add(className)
            },
            remove(node, className) {
                node.classList.remove(className)
            },
            has(node, className) {
                return node.classList.contains(className)
            }
        },
        on(node, eventName, fn) {
            node.addEventListener(eventName, fn)
        },
        off(node, eventName, fn) {
            node.removeEventListener(eventName, fn)
        }
    }
    

    查 代码如下

    JS全解(七)手动封装DOM库(对象风格)

    window.dom = {
        // ****************** 查
            find(selector, scope) {
            return (scope || document).querySelectorAll(selector)
        },
        parent(node) {
            return node.parentNode
        },
        children(node) {
            return node.children
        },
        siblings(node) { // 兄弟姐妹
            return Array.from(node.parentNode.children)
            .filter(n=>n !== node)
        },
        next(node) {
            let x = node.nextSibling
            while (x && x.nodeType === 3) {
                x = x.nextSibling
            }
            return x
        },
        previous(node){
        let x = node.previousSibling
        while (x && x.nodeType === 3) {
            x = x.previousSibling
        }
        return x
        },
        each(nodeList, fn) {
            for (let i = 0; i < nodeList.length; i++){
                fn.call(null,nodeList[i])
            }
        },
        index(node) { //知道一个元素排行第几
            const list = dom.children(node.parentNode)
            let i
            for (i = 0; i < list.length; i++){
                if (list[i] === node) {
                    break
                }
            }
            return i
        }
    }
    

    手写DOM库链接

    由于本人水平有限,如有描述不准确的地方请给我留言,欢迎交流~

    JS全解(七)手动封装DOM库(对象风格)


    起源地下载网 » JS全解(七)手动封装DOM库(对象风格)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元