- Objective
- Breadcrumb: Node - 实例属性
# 概念阐释
## 语义
每个HTML元素都有父节点和子节点属性。`.parentNode`属性返回DOM层次结构中指定元素的父元素。
- 文档元素`document`是根节点,因此其.parentNode属性将返回`null`。
`.children`属性返回指定元素的子元素数组。
- 如果元素没有任何子元素,则返回`null`。
## 语法
```js
node.parentNode
node.children[index]
```
# 实例
```html
<ul id='groceries'>
<li id='must-have'>Toilet Paper</li>
<li>Apples</li>
<li>Chocolate</li>
<li>Dumplings</li>
</ul>
```
```js
let parentElement = document.getElementById('must-have').parentNode; // 指定子节点id,通过.parentNode访问到<ul>
let childElements = document.getElementById('groceries').children; // 通过父节点id,通过.children访问所有<li>数组
// 两个结果应该是一样的?
```
# 相关内容
# 问题
- [练习题](https://www.codecademy.com/courses/build-interactive-websites/lessons/javascript-dom/exercises/traverse-dom)
1. 首先,创建一个名为`first`的变量,并将其设置为**文档主体的第一个子元素**。然后,将第一个元素的`innerHTML`设置为`'BROWN BEARS ARE AWESOME!'`。花点时间注意哪个元素已被修改。
2. 使用`.parentNode`属性访问变量`first`的父元素,并将其`.style.backgroundColor`修改为`'beige'`。
# 问题答案
```js
//访问子节点
const first = document.body.children[0];
first.innerHTML = 'BROWN BEARS ARE AWESOME!' ;
//访问父节点
first.parentNode.style.backgroundColor = 'beige';
```
另一种写法
```js
let first = document.querySelector('body').children[0];
first.innerHTML = 'BROWN BEARS ARE AWESOME!';
document.querySelector('h1').parentNode.style.backgroundColor = 'beige';
```
`first.parentNode.style.backgroundColor = 'beige';` 之所以可行,我们可以通过换算来验证
`const first = document.body.children[0];` 指的就是`<h1>` 标签,所以`first.parentNode`相当于`document.querySelector('h1').parentNode`
# 参考资料
- [Node.childNodes - MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/Node/childNodes)
- [Node.parentNode - MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/Node/parentNode)