DOM操作之节点操作
节点操作
利用节点层级关系获取元素
-
网页中所有内容(标签,属性,文本,注释)都是节点,节点使用
node
来表示 -
利用父子兄节点关系获取元素
-
逻辑性强,但是兼容相差
节点至少有nodeType(节点类型),nodeName(节点名称)和nodeValue(节点值)这三个基本属性
- 元素节点 nodeType 为 1
- 属性节点 nodeType 为 2
- 文本节点 nodeType 为 3 (文本节点包含文字,空格,换行)
父节点操作
node.parentNode
2.parentNode 属性可返回某节点的父节点,注意是最近的一个父节点
3.如果指定的节点没有父节点则返回null
<div class="demo">
<div class="box">
<span class="erweima">×</span>
</div>
</div>
<script>
// 1. 父节点 parentNode
var erweima = document.querySelector('.erweima');
// var box = document.querySelector('.box');
// 得到的是离元素最近的父级节点(亲爸爸) 如果找不到父节点就返回为 null
console.log(erweima.parentNode);
</script>
子节点操作
parentNode.childNodes
(标准)
parentNode.childNodes
返回包含指定节点的子节点集合,该集合为即时更新的集合
parentNode.children
(非标准)
parentNode.children
是一个只读属性,返回所有的子元素节点,它只返回子元素节点,其余节点不返回
<ul>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
</ul>
<script>
// 1. 子节点 parentNode.childNodes
let ul = document.querySelector('ul');
// 子节点 childNodes 所有的子节点 包含 元素节点 文本节点注释节点等等
console.log(ul.childNodes);
console.log(ul.childNodes[0].nodeType); // 3
console.log(ul.childNodes[1].nodeType); // 1
// 2.children 获取所有子元素节点
console.log(ul.children);
</script>
parentNode.firstChild
返回第一个第一个子节点,找不到则返回null,同样也是包含所有的节点
parentNode.lastChild
返回最后一个子节点,找不到则返回null,同样也是包含所有的节点
parentNode.firstElementChild
(IE9以上)
返回第一个子元素节点
parentNode.lastElementChild
(IE9以上)
返回最后一个子元素节点
<ol>
<li>我是li1</li>
<li>我是li2</li>
<li>我是li3</li>
<li>我是li4</li>
<li>我是li5</li>
</ol>
<script>
let ol = document.querySelector('ol');
// 1. firstChild 第一个子节点 不管是文本节点还是元素节点
console.log(ol.firstChild);
console.log(ol.lastChild);
// 2. firstElementChild 返回第一个子元素节点 ie9才支持
console.log(ol.firstElementChild);
console.log(ol.lastElementChild);
// 3. 实际开发的写法 既没有兼容性问题又返回第一个子元素
console.log(ol.children[0]);
console.log(ol.children[ol.children.length - 1]);
</script>
兄弟节点操作
node.nextSilbling
node.nextSilbling
返回当前元素的下一个兄弟节点,找不到则返回null,同样,也是包含所有的节点
node.previousSibling
node.previousSibling
返回当前元素的上一个兄弟节点,找不到则返回null,同样也是包含所有的节点
node.nextElementsibling
node.nextElementsibling
返回当前元素下一个兄弟元素节点,找不到返回null
node.previousElementSibling
node.previousElementSibling
返回当前元素上一个兄弟元素节点,找不到返回null
<div>我是div</div>
<span>我是span</span>
<script>
var div = document.querySelector('div');
// 1.nextSibling 下一个兄弟节点 包含元素节点或者 文本节点等等
console.log(div.nextSibling);
// 2. previousSibling 上一个兄弟节点 包含元素节点或者 文本节点等等
console.log(div.previousSibling);
// 2. nextElementSibling 得到下一个兄弟元素节点
console.log(div.nextElementSibling);
// 3.previousElementSibling 得到上一个兄弟元素节点
console.log(div.previousElementSibling);
</script>
创建节点
docment.creatElement('tagName')
docment.creatElement('tagName')
方法创建有tagName指定的Html元素,因为这些元素原先不存在,是根据我们的需求动态产生的,所以也称为 动态创建元素节点
添加节点
node.appendChild(child)
node.appendChild(child)
方法将一个节点添加到指定父节点的子节点列表末尾。类似于css里面的after 伪元素
node.insertBefore(child,指定元素)
node.insertBefore(child,指定元素)
方法将一个节点添加到父节点的指定子节点前面,类似于css里面的before伪元素
<ul>
<li>123</li>
</ul>
<script>
// 1. 创建节点
let li = document.createElement('li');
// 2. 添加节点
let ul = document.querySelector('ul');
ul.appendChild(li);
// 3. 添加节点
let li1 = document.createElement('li');
ul.insertBefore(li1,ul.children[0]);
//4. 我们想要页面添加一个新的元素 : 1. 创建元素 2. 添加元素
</script>
删除节点
node.removeChild(child)
node.removeChild( )
方法从 DOM 中删除一个子节点,返回删除
<button>删除</button>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
// 获取元素
let ul = document.querySelector('ul');
let btn = document.querySelector('button');
// 注册事件
// 点击按钮依次删除ul里面的li
btn.onclick = function(){
if(ul.children.length == 0){
this.disabled = true;
}else{
ul.removeChild(ul.children[0]);
}
}
</script>
克隆节点(复制节点)
node.cloneNode()
node.cloneNode()
方法返回调用该方法的节点的一个副本,也称为克隆节点/拷贝节点
💡:如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不可克隆隆里面的子节点
💡:如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点
<ul>
<li>111</li>
<li>2</li>
<li>3</li>
</ul>
<script>
// 获取元素
let ul = document.querySelector('ul');
// 1. node.cloneNode(); 括号为空或者里面是false 浅拷贝只复制标签不复制里面的内容
// 2. node.cloneNode(true); 括号为true 深拷贝 复制标签复制里面的内容
let li1 = ul.children[0].cloneNode(true);
ul.appendChild(li1);
</script>