DOM是用于操作网页元素的,但使用DOM操作,太过繁琐。这一次,我试着将DOM进行封装,将整个过程进行简化。
首先需要提供一个全局对象
window.dom = {}
接下来,将封装的DOM放入其中。
增
创建节点
dom.create(`<div>hi</div>`)create(string){//template能够包裹任何元素const container = document.createElement("template")//防止空格的出现导致获取出现问题container.innerHTML = string.trim()return container.content.firstChild}
新增弟弟
dom.after(node,node2)after(node,node2){node.parentNode.insertBefore(node2,node.nextSibling)//原来用于将节点插入某节点前,这里的意思是将node2插入到node节点的下一个 节点前,即插到node节点后面}
新增哥哥
dom.before(node,node2)before(node,node2){node.parentNode.insertBefore(node2,node)}
新增儿子
dom.append(parent,node)append(parent,node){parent.appendChild(node)}
新增爸爸
dom.wrap(node,parent)wrap(node,parent){//增加父元素dom.before(node,parent) //将父元素插到节点前面dom.append(parent,node) //将node插到parent(父元素)里面}
删
删除结点
dom.remove(node)remove(node){node.parentNode.removeChild(node)return node}
删除后代
dom.empty(node)empty(node){const {childNodes} = node//是const childNodes = node.childNodes的简写const array = []let x = node.firstChildwhile(x){array.push(dom.remove(node.firstChild))x = node.firstChild}return array}
改
读写属性
dom.attr(node,'title',?)attr(node,name,value){if(arguments.length===3){node.setAttribute(name,value)}else if(arguments.length===2){return node.getAttribute(name)}}
读写文本内容
dom.text(node, ?)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内容
dom.html(node, string)html(node, string){if(arguments.length === 2){node.innerHTML = string}else if(arguments.length === 1){return node.innerHTML}}
修改style
dom.style(div, {color: 'red'})style(node, name, value){// dom.style(div, 'color', 'red')if(arguments.length===3){node.style[name] = value}else if(arguments.length===2){ // dom.style(div, 'color')if(typeof name === 'string'){return node.style[name]}else if(name instanceof Object){// dom.style(div, {color: 'red'})const object = namefor(let key in object){node.style[key] = object[key]}}}}
添加class、删除calss
dom.class.add(node,'blue')dom.class.remove(node,'blue')class:{add(node,className){node.classList.add(className)},remove(node,className){node.classList.remove(className)},has(node,className){return node.classList.contains(className)}}
添加事件监听
dom.off(node,'click',fn)on(node,eventName,fn){node.addEventListener(eventName,fn)}
删除事件监听
dom.off(node,'click',fn)off(node,eventName,fn){node.removeEventListener(eventName,fn)}
查
获取标签或标签们
dom.find('选择器')find(selector,scope){return (scope||document).querySelectorAll(selector)}
获取父元素
dom.parent(node)parent(node){return node.parentNode}
获取子元素
dom.children(node)children(node){return node.children}
获取同级元素
dom.siblings(node)siblings(node){return Array.from(node.parentNode.children).filter(n=>n!==node)//删除自身}
获取弟弟
dom.next(node)next(node){let x = node.nextSiblingwhile(x&&x.nodeType===3){ //过滤掉文本节点x=x.nextSibling}return x}
获取哥哥
dom.previous(node)previous(node){let x = node.previousSiblingwhile(x && x.nodeType === 3){ //同nextx = x.previousSibling}return x}
遍历所有节点
dom.each(nodes,fn)each(nodeList,fn){for(let i=0;i<nodeList;i++){fn.call(null,nodeList[i])}}
获取排行第几
dom.index(node)index(node){const list = dom.children(node.parentNode)let ifor(i=0;i<list.length;i++){if(list[i] === node){break}}return i}
