网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。
一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
- 元素节点 nodeType 为 1
- 属性节点 nodeType 为 2
- 文本节点 nodeType 为 3
我们在实际开发找,节点操作主要操作的是元素节点
节点层级
利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
1.父节点
2.子节点
- parentNode.childNodes (标准),返回包含指定所有的子节点,包括元素节点,文本节点等。
- parentNode.children (非标准) 只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回(重点掌握的)。虽然是非标准,但是得到了各个浏览器的支持,因此可以放心使用。
- parentNode.firstChild 返回第一个子节点,找不到则返回null。同样,也是包含所有的节点
- parentNode.lastchild 返回最后哟个子节点,找不到则返回null。同样,也是包含所有的节点
- parentNode.firstElementChild 返回第一个子元素节点,找不到则返回null
- parentNode.lastElementChild 返回最后一个子元素节点,找不到则返回null 5、6 这两个方法有兼容性问题,ie9以上才支持。 解决方案:
- 如果想要第一个子元素节点,可以使用 parentNode.children[0]
- 如果想要最后一个子元素节点,可以使用 parentNode.children[parentNode.children.length - 1]
<li>我是li1</li>
<li>我是li2</li>
<li>我是li3</li>
<li>我是li4</li>
<li>我是li5</li>
** </ol>
<script>
var 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>
3.兄弟节点
- node.nextSibling 返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点
- node.previousSibling 返回当前节点的前一个兄弟节点,找不到则返回null。同样,也是包含所有的节点
- node.nextElementSibling 返回当前元素下一个兄弟元素节点,找不到则返回null。
- node.previousElementSibling 返回当前元素上一个兄弟元素节点,找不到则返回null。
4.创建节点
5.添加节点
- node.appendChild(child) 方法将一个节点添加到指定父节点的子节点列表末尾。类似于 css 里面的 after伪元素。
- node.insertBefore() 方法将一个节点添加到父节点的指定子节点前面。类似于 css 里面的 before伪元素。
6.删除节点 node.removeChild(chlid) 方法从 node节点中删除一个子节点,返回删除的节点。
- 阻止链接跳转需要添加javascript:void(0);或者javascript:;
<button>删除</button>
<ul>
<li>熊大</li>
<li>熊二</li>
<li>光头强</li>
</ul>
<script>
// 1.获取元素
var ul = document.querySelector('ul');
var btn = document.querySelector('button');
// 2. 删除元素 node.removeChild(child)
// ul.removeChild(ul.children[0]);
// 3. 点击按钮依次删除里面的孩子
btn.onclick = function() {
if (ul.children.length == 0) {
this.disabled = true;
} else {
ul.removeChild(ul.children[0]);
}
}
</script>
7.复制(克隆)节点 node.cloneNode() 方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点
注意:
-
如果括号参数为空或者为false,则是浅拷贝,只克隆复制节点本身,不克隆里面的子节点。
-
如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点。
-
三种动态创建元素区别
- document.write()
- element.innerHTML
- document.createElement()