DOM是用于操作网页元素的,但使用DOM操作,太过繁琐。这一次,我试着将DOM进行封装,将整个过程进行简化。

首先需要提供一个全局对象

  1. window.dom = {}

接下来,将封装的DOM放入其中。

创建节点

  1. dom.create(`<div>hi</div>`)
  2. create(string){
  3. //template能够包裹任何元素
  4. const container = document.createElement("template")
  5. //防止空格的出现导致获取出现问题
  6. container.innerHTML = string.trim()
  7. return container.content.firstChild
  8. }

新增弟弟

  1. dom.after(node,node2)
  2. after(node,node2){
  3. node.parentNode.insertBefore(node2,node.nextSibling)
  4. //原来用于将节点插入某节点前,这里的意思是将node2插入到node节点的下一个 节点前,即插到node节点后面
  5. }

新增哥哥

  1. dom.before(node,node2)
  2. before(node,node2){
  3. node.parentNode.insertBefore(node2,node)
  4. }

新增儿子

  1. dom.append(parent,node)
  2. append(parent,node){
  3. parent.appendChild(node)
  4. }

新增爸爸

  1. dom.wrap(node,parent)
  2. wrap(node,parent){
  3. //增加父元素
  4. dom.before(node,parent) //将父元素插到节点前面
  5. dom.append(parent,node) //将node插到parent(父元素)里面
  6. }

删除结点

  1. dom.remove(node)
  2. remove(node){
  3. node.parentNode.removeChild(node)
  4. return node
  5. }

删除后代

  1. dom.empty(node)
  2. empty(node){
  3. const {childNodes} = node
  4. //是const childNodes = node.childNodes的简写
  5. const array = []
  6. let x = node.firstChild
  7. while(x){
  8. array.push(dom.remove(node.firstChild))
  9. x = node.firstChild
  10. }
  11. return array
  12. }

读写属性

  1. dom.attr(node,'title',?)
  2. attr(node,name,value){
  3. if(arguments.length===3){
  4. node.setAttribute(name,value)
  5. }else if(arguments.length===2){
  6. return node.getAttribute(name)
  7. }
  8. }

读写文本内容

  1. dom.text(node, ?)
  2. text(node, string){
  3. // 适配
  4. if(arguments.length ===2 ){
  5. if('innerText' in node){
  6. node.innerText = string
  7. }else{
  8. node.textContent = string
  9. }
  10. }else if(arguments.length === 1){
  11. if('innerText' in node){
  12. return node.innerText
  13. }else{
  14. return node.textContent
  15. }
  16. }
  17. }

读写HTML内容

  1. dom.html(node, string)
  2. html(node, string){
  3. if(arguments.length === 2){
  4. node.innerHTML = string
  5. }else if(arguments.length === 1){
  6. return node.innerHTML
  7. }
  8. }

修改style

  1. dom.style(div, {color: 'red'})
  2. style(node, name, value){
  3. // dom.style(div, 'color', 'red')
  4. if(arguments.length===3){
  5. node.style[name] = value
  6. }else if(arguments.length===2){ // dom.style(div, 'color')
  7. if(typeof name === 'string'){
  8. return node.style[name]
  9. }else if(name instanceof Object){
  10. // dom.style(div, {color: 'red'})
  11. const object = name
  12. for(let key in object){
  13. node.style[key] = object[key]
  14. }
  15. }
  16. }
  17. }

添加class、删除calss

  1. dom.class.add(node,'blue')
  2. dom.class.remove(node,'blue')
  3. class:{
  4. add(node,className){
  5. node.classList.add(className)
  6. },
  7. remove(node,className){
  8. node.classList.remove(className)
  9. },
  10. has(node,className){
  11. return node.classList.contains(className)
  12. }
  13. }

添加事件监听

  1. dom.off(node,'click',fn)
  2. on(node,eventName,fn){
  3. node.addEventListener(eventName,fn)
  4. }

删除事件监听

  1. dom.off(node,'click',fn)
  2. off(node,eventName,fn){
  3. node.removeEventListener(eventName,fn)
  4. }

获取标签或标签们

  1. dom.find('选择器')
  2. find(selector,scope){
  3. return (scope||document).querySelectorAll(selector)
  4. }

获取父元素

  1. dom.parent(node)
  2. parent(node){
  3. return node.parentNode
  4. }

获取子元素

  1. dom.children(node)
  2. children(node){
  3. return node.children
  4. }

获取同级元素

  1. dom.siblings(node)
  2. siblings(node){
  3. return Array.from(node.parentNode.children).filter(n=>n!==node)
  4. //删除自身
  5. }

获取弟弟

  1. dom.next(node)
  2. next(node){
  3. let x = node.nextSibling
  4. while(x&&x.nodeType===3){ //过滤掉文本节点
  5. x=x.nextSibling
  6. }
  7. return x
  8. }

获取哥哥

  1. dom.previous(node)
  2. previous(node){
  3. let x = node.previousSibling
  4. while(x && x.nodeType === 3){ //同next
  5. x = x.previousSibling
  6. }
  7. return x
  8. }

遍历所有节点

  1. dom.each(nodes,fn)
  2. each(nodeList,fn){
  3. for(let i=0;i<nodeList;i++){
  4. fn.call(null,nodeList[i])
  5. }
  6. }

获取排行第几

  1. dom.index(node)
  2. index(node){
  3. const list = dom.children(node.parentNode)
  4. let i
  5. for(i=0;i<list.length;i++){
  6. if(list[i] === node){
  7. break
  8. }
  9. }
  10. return i
  11. }