HTML
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DOM封装-1</title>
<style>
.red {
background: red;
}
</style>
</head>
<body>
<div>
<div id="test">test
<p class="red">段落标签</p>
</div>
<div id="test2">
<p class="red">段落标签</p>
</div>
</div>
<div id="empty">
<div id="e1"></div>
<div id="e2"></div>
<div id="e3"></div>
</div>
<div id="siblings">
<div id="e1"></div>
<div id="e2"></div>
<div id="e3"></div>
</div>
<div id="travel">
<div id="t1">1</div>
<div id="t2">2</div>
<div id="t3">3</div>
</div>
<script src="dom.js"></script>
<script src="main.js"></script>
</body>
</html>
JS
window.dom = {
create(string) { //创建一个新的节点
const container = document.createElement("template"); //可以接纳任意
container.innerHTML = string.trim(); //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)
},
//删除
remove(node) {
node.parentNode.removeChild(node)
return 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
},
//改
attr(node, name, value) { //重载
if (arguments.length === 3) {
node.setAttribute(name, value)
} else if (arguments.length === 2) {
return node.getAttribute(name)
}
},
text(node, string) { //适配
//console.log('innerText' in node) 有没有这个节点
if (arguments.length === 2) {
if ('innerText' in node) {
node.innerText = string
} else {
node.innerContent = string
}
} else if (arguments.length === 1) {
if ('innerText' in node) {
return node.innerText
} else {
return node.innerContent
}
}
},
html(node, string) {
if (arguments.length === 2) {
node.innerHTML = string
} else 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)
},
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
}
};
//document.createElement('div')
const div = dom.create("<div>newDiv</div>");
console.log(div);
dom.after(test, div);
const div3 = dom.create('<div id="parent"></div>')
dom.wrap(test, div3)
const nodes = dom.empty(window.empty)
console.log(nodes)
dom.attr(test, 'title', 'Hi, I am Frank')
const title = dom.attr(test, 'title')
console.log(`title: ${title}`)
dom.text(test, '你好,这是新的内容')
const text = dom.text(test)
console.log(text)
dom.style(test, { border: '1px solid red', color: 'blue' })
console.log(dom.style(test, 'border'))
dom.style(test, 'border', '1px solid black')
dom.class.add(test, 'red')
dom.class.remove(test, 'red')
const fn = () => {
console.log('点击了')
}
dom.on(test, 'click', fn)
dom.off(test, 'click', fn)
const testDiv = dom.find('#test')[0]
console.log(testDiv)
const test2 = dom.find('#test2')[0]
console.log(dom.find('.red', test2)[0])
console.log(dom.parent(test))
console.log(dom.siblings(dom.find('#e2')[0]))
console.log(dom.next(dom.find('#e2')[0]))
console.log(dom.previous(dom.find('#e2')[0]))
const t = dom.find('#travel')[0]
dom.each(dom.children(t), (n) => dom.style(n, 'color', 'red'))
console.log(dom.index(t2))