查找节点
getElementById(),getElementsByClassName(),getElementsByTagName()
querySelector(),querySelectorAll()
创建节点
createElement():创建一个dom节点

示例代码
document.createElement('div');
插入节点
appendChild():子节点末尾追加

示例代码
const element = document.createElement('div');
document.body.appendChild(element);
insertBefore():同级指定位置插入,但还是需要知道父节点

示例代码
const newNode = document.createElement('div');
document.body.insertBefore(newNode);
替换节点
replaceChild():替换子节点。接受两个参数,第一个为要插入的节点,第二个为要替换的节点

示例代码
const newNode=document.createElement('span');
const oldNode=document.querySelector('#root');
document.body.replaceChild(newNode,oldNode);
移除节点
removeChild():删除子节点

示例代码
const element=document.querySeletor('#root');
document.body.removeChild(element);
综合示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>DOM CRUD</title>
<style></style>
</head>
<body>
<div id='root'>
</div>
<script>
/**
* 查找节点
* @param {*} name
* name: id,class,tagname
* 调用示例 findNode('#root')或者findNode('div')
*/
const findNode = function(name){
return document.querySelector(name)
}
/**
* 创建一个节点
* @param {*} tagName, attrObj
* name: 标签名
* attrObj: 属性名
* 调用示例: createNode('div'), createNode('div',{id:'first',innerHTML:'helloworld'})
*/
const createNode = function(tagName,attrObj){
let node = document.createElement(tagName);
for(let key in attrObj){
node[key]=attrObj[key];
}
return node;
}
/**
* 插入一个节点
* @param {*} parentNode,newNode
* parentNode: 要插入的父节点
* newNode: 要插入的节点
* 调用示例: insertNode(root,node2)
*/
const insertNode = function(parentNode,newNode){
// appendChild
// insertBefore
parentNode.appendChild(newNode);
}
/**
* 替换一个节点
* @param {*} parentNode,newNode,oldNode
* parentNode: 要替换节点的父节点
* newNode: 替换后的节点
* oldNode: 替换前的节点
* 调用示例: replaceNode(root,node1,node2);
* 注意:第二个参数和第三个参数不可调换位置
*/
const replaceNode = function(parentNode,newNode,oldNode){
parentNode.replaceChild(newNode,oldNode)
}
/**
* 移除一个节点
* @param {*} sourceNode,targetNode
* sourceNode: 要移除节点的父节点
* targetNode: 需要被移除的节点
* 调用示例: removeNode(root,node1);
*/
const removeNode = function(sourceNode,targetNode){
sourceNode.removeChild(targetNode)
}
/**
* 渲染一段dom
* @param {*} node htmlStr
* node: 需要插入的父节点
* htmlStr: dom字符串
* 调用示例: renderDom(findNode('#root'),'<div id="myDiv">myDiv</div>');
*/
const renderDom = function(node, htmlStr){
node.innerHTML=htmlStr;
}
//测试
const root=findNode('#root');
const node1 = createNode('div',{id:'n1',innerHTML:'节点1'});
const node2 = createNode('div',{id:'n2',innerHTML:'节点2'});
const node3 = createNode('div',{id:'n3',innerHTML:'节点3'});
const node4 = createNode('div',{id:'n4',innerHTML:'节点4'});
const htmlStr = `<div id="myDiv">mydiv</div>`
// insertNode(root,node1);
// insertNode(root,node2);
// insertNode(root,node3);
// replaceNode(root,node4,node1);
// removeNode(root,node1)
renderDom(findNode('#root'),htmlStr);
</script>
</body>
</html>
总结
- 节点操作本质上是树形结构的操作,都需要已知父节点
- 查找节点统一使用querySeletor(), 代码会简洁不少
- inserBefore可以传一个参考节点(referenceNode),可以指定插入位置
参考