本文主要讲解如何获取父节点元素,子节点元素和兄弟节点元素。
1. 什么是节点?
节点:Node,是构成HTML文档最基本的单元。
常用节点分为四类:
- 文档节点:整个HTML文档,document;
- 元素节点:HTML文档中的HTML标签元素;
- 属性节点:标签中的属性;
- 文本节点:HTML标签中的文本内容。
节点之间的关系一般可以分为 父子兄 三种关系。
2. 获取父节点
通过子节点获取父节点: node.parentNode
注意:
- node.parentNode只返回距离该node元素最近一级的父级节点;
- 如果没有父节点,则返回null。
<body>
<div class="father1">
<div class="father2">
<div class="son"></div>
</div>
</div>
</body>
<script>
const son = document.querySelector(".son");
console.log(son.parentNode);
</script>
结果如下:
3. 获取子节点
3.1 parentNode.childNodes
注意:
- 返回指定节点的子节点的集合,包含所有节点,比如元素节点,文本节点等。
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
<script>
const ul = document.querySelector("ul");
console.log(ul.childNodes);
</script>
结果如下:
正如上面说的,childNodes会返回所有的子节点,下方图片中圈起来的部分是文本节点:
如果只想要获取元素节点,就需要通过nodeType来判断,元素节点的nodeType为1,文本节点的nodeType为3:
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
<script>
const ul = document.querySelector("ul");
console.log(Array.from(ul.childNodes).filter(v => v.nodeType === 1));
</script>
3.2 parentNode.children(常用)
上面使用childNodes获取所有子元素节点比较繁琐,children是只获取所有子元素节点:
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
<script>
const ul = document.querySelector("ul");
console.log(ul.children);
</script>
结果如下:
3.3 获取第一个子节点和最后一个子节点
- parentNode.firstChild:返回第一个子节点,包含所有节点,如元素节点,文本节点等;
- parentNode.lastChild:返回最后一个子节点,包含所有节点,如元素节点,文本节点等。
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
<script>
const ul = document.querySelector("ul");
console.log(ul.firstChild);
console.log(ul.lastChild);
</script>
结果如下:
和childNodes类似,ul的第一个子节点和最后一个子节点都是文本节点,所以返回上方结果。
有没有什么方法只获取元素节点呢?
当然有!!!
- parentNode.firstElementChild:返回第一个子元素节点,有兼容问题,ie9以上才可以使用;
- parentNode.lastElementChild:返回最后一个子元素节点,有兼容问题,ie9以上才可以使用。
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
<script>
const ul = document.querySelector("ul");
console.log(ul.firstElementChild);
console.log(ul.lastElementChild);
</script>
结果如下:
其实也可以使用children来获取第一个和最后一个子节点元素:
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
<script>
const ul = document.querySelector("ul");
console.log(ul.children[0]);
console.log(ul.children[ul.children.length - 1]);
</script>
结果如下:
4. 获取兄弟节点
- node.nextSibling:返回当前元素的下一个节点,找不到则返回null,同样,也是包含所有节点;
- node.previousSibling: 返回当前元素的上一个节点,找不到则返回null,同样,也是包含所有节点。
<body>
<div class="box1">1</div>
<div class="box2">2</div>
<div class="box3">3</div>
</body>
<script>
const box2 = document.querySelector(".box2");
console.log(box2.nextSibling);
console.log(box2.previousSibling);
</script>
结果如下:
当然也有只返回节点元素的方法:
- node.nextElemntSibling:返回当前元素的下一个元素节点,有兼容问题,ie9以上才可以使用;
- node.previousElementSibling: 返回当前元素的上一个元素节点,有兼容问题,ie9以上才可以使用。
<body>
<div class="box1">1</div>
<div class="box2">2</div>
<div class="box3">3</div>
</body>
<script>
const box2 = document.querySelector(".box2");
console.log(box2.nextElementSibling);
console.log(box2.previousElementSibling);
</script>
结果如下: