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.firstChild
while(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 = name
for(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.nextSibling
while(x&&x.nodeType===3){ //过滤掉文本节点
x=x.nextSibling
}
return x
}
获取哥哥
dom.previous(node)
previous(node){
let x = node.previousSibling
while(x && x.nodeType === 3){ //同next
x = 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 i
for(i=0;i<list.length;i++){
if(list[i] === node){
break
}
}
return i
}