# ParentNode 接口,ChildNode 接口
節點對象除了繼承 Node 接口以外,還擁有其他接口。`ParentNode`接口表示當前節點是一個父節點,提供一些處理子節點的方法。`ChildNode`接口表示當前節點是一個子節點,提供一些相關方法。
## ParentNode 接口
如果當前節點是父節點,就會混入了(mixin)`ParentNode`接口。由于只有元素節點(element)、文檔節點(document)和文檔片段節點(documentFragment)擁有子節點,因此只有這三類節點會擁有`ParentNode`接口。
### ParentNode.children
`children`屬性返回一個`HTMLCollection`實例,成員是當前節點的所有元素子節點。該屬性只讀。
下面是遍歷某個節點的所有元素子節點的示例。
```javascript
for (var i = 0; i < el.children.length; i++) {
// ...
}
```
注意,`children`屬性只包括元素子節點,不包括其他類型的子節點(比如文本子節點)。如果沒有元素類型的子節點,返回值`HTMLCollection`實例的`length`屬性為`0`。
另外,`HTMLCollection`是動態集合,會實時反映 DOM 的任何變化。
### ParentNode.firstElementChild
`firstElementChild`屬性返回當前節點的第一個元素子節點。如果沒有任何元素子節點,則返回`null`。
```javascript
document.firstElementChild.nodeName
// "HTML"
```
上面代碼中,`document`節點的第一個元素子節點是`<HTML>`。
### ParentNode.lastElementChild
`lastElementChild`屬性返回當前節點的最后一個元素子節點,如果不存在任何元素子節點,則返回`null`。
```javascript
document.lastElementChild.nodeName
// "HTML"
```
上面代碼中,`document`節點的最后一個元素子節點是`<HTML>`(因為`document`只包含這一個元素子節點)。
### ParentNode.childElementCount
`childElementCount`屬性返回一個整數,表示當前節點的所有元素子節點的數目。如果不包含任何元素子節點,則返回`0`。
```javascript
document.body.childElementCount // 13
```
### ParentNode.append(),ParentNode.prepend()
**(1)ParentNode.append()**
`append()`方法為當前節點追加一個或多個子節點,位置是最后一個元素子節點的后面。
該方法不僅可以添加元素子節點(參數為元素節點),還可以添加文本子節點(參數為字符串)。
```javascript
var parent = document.body;
// 添加元素子節點
var p = document.createElement('p');
parent.append(p);
// 添加文本子節點
parent.append('Hello');
// 添加多個元素子節點
var p1 = document.createElement('p');
var p2 = document.createElement('p');
parent.append(p1, p2);
// 添加元素子節點和文本子節點
var p = document.createElement('p');
parent.append('Hello', p);
```
該方法沒有返回值。
注意,該方法與`Node.prototype.appendChild()`方法有三點不同。
- `append()`允許字符串作為參數,`appendChild()`只允許子節點作為參數。
- `append()`沒有返回值,而`appendChild()`返回添加的子節點。
- `append()`可以添加多個子節點和字符串(即允許多個參數),`appendChild()`只能添加一個節點(即只允許一個參數)。
**(2)ParentNode.prepend()**
`prepend()`方法為當前節點追加一個或多個子節點,位置是第一個元素子節點的前面。它的用法與`append()`方法完全一致,也是沒有返回值。
## ChildNode 接口
如果一個節點有父節點,那么該節點就擁有了`ChildNode`接口。
### ChildNode.remove()
`remove()`方法用于從父節點移除當前節點。
```javascript
el.remove()
```
上面代碼在 DOM 里面移除了`el`節點。
### ChildNode.before(),ChildNode.after()
**(1)ChildNode.before()**
`before()`方法用于在當前節點的前面,插入一個或多個同級節點。兩者擁有相同的父節點。
注意,該方法不僅可以插入元素節點,還可以插入文本節點。
```javascript
var p = document.createElement('p');
var p1 = document.createElement('p');
// 插入元素節點
el.before(p);
// 插入文本節點
el.before('Hello');
// 插入多個元素節點
el.before(p, p1);
// 插入元素節點和文本節點
el.before(p, 'Hello');
```
**(2)ChildNode.after()**
`after()`方法用于在當前節點的后面,插入一個或多個同級節點,兩者擁有相同的父節點。用法與`before`方法完全相同。
### ChildNode.replaceWith()
`replaceWith()`方法使用參數節點,替換當前節點。參數可以是元素節點,也可以是文本節點。
```javascript
var span = document.createElement('span');
el.replaceWith(span);
```
上面代碼中,`el`節點將被`span`節點替換。
- 前言
- 入門篇
- 導論
- 歷史
- 基本語法
- 數據類型
- 概述
- null,undefined 和布爾值
- 數值
- 字符串
- 對象
- 函數
- 數組
- 運算符
- 算術運算符
- 比較運算符
- 布爾運算符
- 二進制位運算符
- 其他運算符,運算順序
- 語法專題
- 數據類型的轉換
- 錯誤處理機制
- 編程風格
- console 對象與控制臺
- 標準庫
- Object 對象
- 屬性描述對象
- Array 對象
- 包裝對象
- Boolean 對象
- Number 對象
- String 對象
- Math 對象
- Date 對象
- RegExp 對象
- JSON 對象
- 面向對象編程
- 實例對象與 new 命令
- this 關鍵字
- 對象的繼承
- Object 對象的相關方法
- 嚴格模式
- 異步操作
- 概述
- 定時器
- Promise 對象
- DOM
- 概述
- Node 接口
- NodeList 接口,HTMLCollection 接口
- ParentNode 接口,ChildNode 接口
- Document 節點
- Element 節點
- 屬性的操作
- Text 節點和 DocumentFragment 節點
- CSS 操作
- Mutation Observer API
- 事件
- EventTarget 接口
- 事件模型
- Event 對象
- 鼠標事件
- 鍵盤事件
- 進度事件
- 表單事件
- 觸摸事件
- 拖拉事件
- 其他常見事件
- GlobalEventHandlers 接口
- 瀏覽器模型
- 瀏覽器模型概述
- window 對象
- Navigator 對象,Screen 對象
- Cookie
- XMLHttpRequest 對象
- 同源限制
- CORS 通信
- Storage 接口
- History 對象
- Location 對象,URL 對象,URLSearchParams 對象
- ArrayBuffer 對象,Blob 對象
- File 對象,FileList 對象,FileReader 對象
- 表單,FormData 對象
- IndexedDB API
- Web Worker
- 附錄:網頁元素接口
- a
- img
- form
- input
- button
- option
- video,audio