# DOM操作之创建和移动节点
# 创建节点
在DOM操作中,我们可以动态创建节点,并将创建的节点挂载到HTML树中,成为一个新的节点。
在JS中,使用 doucument.createElement(节点类型) 创建节点
// tagName 节点元素类型,例如div
var divDom = doucument.createElement(tagName);
上面的语法只是创建节点,还需要一个挂载节点的方法,将我们创建的节点挂载到DOM树上, 否则我们无法看见此节点
// parentNode 父节点元素
// aChild 创建的子节点元素
parentNode.appendChild(aChild)
使用 appendChild() 方法只能将我们创建的dom节点当成最后一个子节点挂载到父节点的最后
挂载节点还可以使用 insertBefore() 方法,将此节点挂载到某个兄弟节点的前面
// parentNode 父节点元素
// newChild 新创建节点
// referenceNode 相关的兄弟节点
parentNode.insertBefore(newChild, referenceNode);
# 完整示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>创建元素</title>
</head>
<body>
<div id="parentNode">
<p >我是p1</p>
<p id="p2">我是p2</p>
<p >我是p3</p>
</div>
<script>
var newChildNode = document.createElement('p');
// 填充内部文本内容
newChildNode.innerText = '我是newChild';
var parentNode = document.getElementById('parentNode');
parentNode.appendChild(newChildNode);
var newChildNode2 = document.createElement('p');
newChildNode2.innerText = '我是newChile2';
var beforeNode = document.getElementById('p2');
parentNode.insertBefore(newChildNode2, beforeNode);
</script>
</body>
</html>
# 移动节点
在创建节点的完整示例中,我不小心将 parentNode.insertBefore(newChildNode2, beforeNode); 写成了 parentNode.insertBefore(newChildNode, beforeNode);
代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>创建元素</title>
</head>
<body>
<div id="parentNode">
<p >我是p1</p>
<p id="p2">我是p2</p>
<p >我是p3</p>
</div>
<script>
var newChildNode = document.createElement('p');
// 填充内部文本内容
newChildNode.innerText = '我是newChild';
var parentNode = document.getElementById('parentNode');
parentNode.appendChild(newChildNode);
var newChildNode2 = document.createElement('p');
newChildNode2.innerText = '我是newChile2';
var beforeNode = document.getElementById('p2');
parentNode.insertBefore(newChildNode, beforeNode);
</script>
</body>
</html>
发现 newChildNode 节点不会被重新挂载, 这意味着一个dom节点不会被挂载两次
所以在dom树中挂载好的节点只能被移动,挂载两次是不可能的, 移动的方法仍然是使用 appendChild 和 insertBefore
// 移动 existNode 到新的父节点newParentNode的最后
newParentNode.appendChild(existNode);
// 移动 existNode 到新的父节点 newParentNode 下,并且在 兄弟节点 newBeforeBroNode的前面
newParentNode.insertBefore(existNode, newBeforeBroNode);
# 完整示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MoveElement</title>
<style>
div {
width: 200px;
height: 200px;
}
#parentNode1 {
background-color: red;
}
#newParentNode {
background-color: green;
}
</style>
</head>
<body>
<div id="parentNode1">
<p>子节点1</p>
<p>移动节点1</p>
<p id="moveNode">移动节点2</p>
</div>
<div id="newParentNode">
<p>子节点N1</p>
</div>
<script>
var parentNode1 = document.getElementById('parentNode1');
// 获取两个移动节点
var moveNode1 = parentNode1.getElementsByTagName('p')[1];
var moveNode2 = document.getElementById('moveNode');
var newParentNode = document.getElementById('newParentNode');
var newBroNode = newParentNode.getElementsByTagName('p')[0];
// 将 两个移动节点移动到 新的父元素下
newParentNode.appendChild(moveNode1);
newParentNode.insertBefore(moveNode2, newBroNode);
</script>
</body>
</html>
← DOM元素之更改 DOM操作之删除节点 →