Node 對(duì)象提供了一些用于向 HTML 頁(yè)面插入節(jié)點(diǎn)的方法,通過(guò)這些方法我們可以實(shí)現(xiàn)向 HTML 頁(yè)面新增元素,或者移動(dòng) HTML 頁(yè)面中的元素。
## appendChild() 方法
Node 對(duì)象提供的 appendChild() 方法可以向指定節(jié)點(diǎn)的子節(jié)點(diǎn)列表的最后添加一個(gè)新的子節(jié)點(diǎn)。其語(yǔ)法結(jié)構(gòu)如下:
```javascript
var child = node.appendChild(child);
```
在上述語(yǔ)法結(jié)構(gòu)中,appendChild() 方法的參數(shù) child 表示添加的新的子節(jié)點(diǎn),同時(shí)該子節(jié)點(diǎn)也是 appendChild() 方法的返回值。
我們可以通過(guò)如下代碼示例,學(xué)習(xí) appendChild() 方法的使用:
```javascript
var parent = document.getElementById('parent');
var button = document.createElement('button');
button.setAttribute('class','button');
var text = document.createTextNode('A New Button');
button.appendChild(text);
// 將新節(jié)點(diǎn)添加到父節(jié)點(diǎn)中
parent.appendChild(button);
```
在上述代碼示例中,我們創(chuàng)建了一個(gè)新的 `<button>` 元素,并且將這個(gè) `<button>` 元素添加到指定節(jié)點(diǎn)的子節(jié)點(diǎn)列表的最后面。
> **值得注意的是:** 如果我們是將 HTML 頁(yè)面中原有的節(jié)點(diǎn)插入到指定節(jié)點(diǎn)的子節(jié)點(diǎn)列表的最后面,那這個(gè)被插入的節(jié)點(diǎn)會(huì)先從原有的位置移除,再插入到指定的位置。
如下代碼示例,就是將 HTML 頁(yè)面原有的節(jié)點(diǎn)插入到指定位置:
```javascript
var parent = document.getElementById('parent');
var button = document.getElementById('btn');
// 將新節(jié)點(diǎn)添加到父節(jié)點(diǎn)中
parent.appendChild(button);
```
> **值得注意的是:** appendChild() 方法只能允許在同一個(gè) HTML 頁(yè)面中實(shí)現(xiàn)插入節(jié)點(diǎn)的功能,而不能實(shí)現(xiàn)跨 HTML 頁(yè)面的插入節(jié)點(diǎn)的功能。
## insertBefore() 方法
Node 對(duì)象除了提供了 appendChild() 方法可以實(shí)現(xiàn)插入節(jié)點(diǎn)之外,還提供了 insertBefore() 方法同樣可以實(shí)現(xiàn)插入節(jié)點(diǎn)的功能。其語(yǔ)法結(jié)構(gòu)如下:
```javascript
var insertedElement = parentElement.insertBefore(newElement, referenceElement);
```
由于 insertBefore() 方法實(shí)現(xiàn)的是將一個(gè)節(jié)點(diǎn)插入到指定節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)的前面。所以,在上述語(yǔ)法結(jié)構(gòu)中:
- 參數(shù) referenceElement 表示指定節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)
- 參數(shù) newElement 表示插入的節(jié)點(diǎn)
- 調(diào)用 insertBefore() 方法的 parentElement 表示指定的節(jié)點(diǎn)
- 作為返回值的 insertedElement 表示被插入的節(jié)點(diǎn),即 newElement
我們可以通過(guò)如下代碼示例,學(xué)習(xí) insertBefore() 方法的使用:
```javascript
// 獲取目標(biāo)父節(jié)點(diǎn)
var parentElement = document.getElementById('parent');
// 創(chuàng)建新節(jié)點(diǎn)
var newElement = document.createElement('button');
newElement.setAttribute('class','button');
var text = document.createTextNode('A New Button');
newElement.appendChild(text);
// 獲取目標(biāo)節(jié)點(diǎn)
var referenceElement = document.getElementById('btn');
// 將新節(jié)點(diǎn)添加到父節(jié)點(diǎn)中
parentElement.insertBefore(newElement, referenceElement);
```
> **值得注意的是:** 如果我們是將 HTML 頁(yè)面中原有的節(jié)點(diǎn)插入到指定節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)的前面,那這個(gè)被插入的節(jié)點(diǎn)會(huì)先從原有的位置移除,再插入到指定的位置。
如下代碼示例,就是將 HTML 頁(yè)面原有的節(jié)點(diǎn)插入到指定位置:
```javascript
// 獲取目標(biāo)父節(jié)點(diǎn)
var parentElement = document.getElementById('parent');
// 獲取被插入的節(jié)點(diǎn)
var newElement = document.getElementById('button');
// 獲取目標(biāo)節(jié)點(diǎn)
var referenceElement = document.getElementById('btn');
// 將新節(jié)點(diǎn)添加到父節(jié)點(diǎn)中
parentElement.insertBefore(newElement, referenceElement);
```
> **值得注意的是:** 如果 referenceElement 為 null 則 newElement 將被插入到子節(jié)點(diǎn)的末尾。
## 關(guān)于 insertAfter() 方法
我們需要注意的是,Node 對(duì)象中并沒(méi)有提供 insertAfter() 方法。所以,我們并不能像使用 jQuery 中的 insertAfter() 方法一樣使用。
但是,如果我們?cè)陂_(kāi)發(fā)中需要 insertAfter() 方法的話,是可以利用 insertBefore() 方法來(lái)實(shí)現(xiàn)的。
實(shí)現(xiàn)思路其實(shí)就是利用 insertBefore() 方法將被插入的節(jié)點(diǎn)插入到指定節(jié)點(diǎn)的下一個(gè)相鄰兄弟的前面,最終實(shí)現(xiàn)插入到指定節(jié)點(diǎn)的后面的效果。
```javascript
parentElement.insertBefore(newElement, referenceElement.nextSibling);
```
但由于主流瀏覽器存在空白節(jié)點(diǎn)的問(wèn)題,所以,在真正實(shí)現(xiàn)時(shí)不能簡(jiǎn)單地直接通過(guò) nextSibling 屬性來(lái)解決的。
最后,真正可以實(shí)現(xiàn) insertAfter() 方法的主要邏輯如下:
```javascript
var nextElement = referenceElement.nextSibling;
if(nextElement.nodeType === 3){
nextElement = nextElement.nextSibling;
}
parentElement.insertBefore(newElement, nextElement);
```
如果 referenceElement 沒(méi)有下一個(gè)相鄰的兄弟節(jié)點(diǎn)的話,那 referenceElement 一定是該子節(jié)點(diǎn)列表的最后一個(gè)子節(jié)點(diǎn)。這樣 referenceElement.nextSibling 返回的值為 ull,newElement 就會(huì)被插入到子節(jié)點(diǎn)列表的最后面。
> **值得注意的是:** 關(guān)于 insertAfter() 方法,我們這里只是提供了一個(gè)解決的思路。在具體使用時(shí),可能封裝的具體用法也會(huì)不同。
- 關(guān)于
- 第一章 DOM 是什么
- 第一節(jié) DOM 介紹
- 第二節(jié) DOM 樹(shù)結(jié)構(gòu)
- 第二章 Document 對(duì)象
- 第一節(jié) Document 對(duì)象介紹
- 第二節(jié) 定位頁(yè)面元素
- 第三節(jié) 創(chuàng)建頁(yè)面元素
- 第三章 Node 對(duì)象
- 第一節(jié) Node 對(duì)象介紹
- 第二節(jié) 判斷節(jié)點(diǎn)類型
- 第三節(jié) 遍歷節(jié)點(diǎn)
- 第四節(jié) 插入節(jié)點(diǎn)
- 第五節(jié) 刪除節(jié)點(diǎn)
- 第六節(jié) 替換節(jié)點(diǎn)
- 第七節(jié) 復(fù)制節(jié)點(diǎn)
- 第八節(jié) textContent 屬性
- 第四章 Element 對(duì)象
- 第一節(jié) Element 對(duì)象介紹
- 第二節(jié) DOM 元素樹(shù)
- 第三節(jié) 定位頁(yè)面元素
- 第四節(jié) 遍歷元素
- 第五節(jié) 屬性操作
- 第六節(jié) innerHTML 屬性
- 第五章 樣式操作
- 第一節(jié) 獲取內(nèi)聯(lián)樣式
- 第二節(jié) 獲取外聯(lián)樣式表
- 第三節(jié) 獲取 class 屬性
- 第四節(jié) 獲取當(dāng)前有效樣式
- 第五節(jié) 設(shè)置內(nèi)聯(lián)樣式
- 第六節(jié) 設(shè)置 class 屬性
- 第七節(jié) Element 對(duì)象的樣式屬性
- 第六章 事件
- 第一節(jié) 什么是事件
- 第二節(jié) 注冊(cè)事件
- 第三節(jié) 移除注冊(cè)事件
- 第四節(jié) Event 事件對(duì)象
- 第五節(jié) 獲取目標(biāo)元素
- 第六節(jié) 阻止默認(rèn)行為
- 第七節(jié) 獲取鼠標(biāo)坐標(biāo)
- 第八節(jié) 事件流
- 第九節(jié) 事件委托
- 第七章 表單操作
- 第一節(jié) 獲取表單
- 第二節(jié) 表單操作
- 第三節(jié) 表單驗(yàn)證
- 第四節(jié) 表單提交
- 第八章 BOM
- 第一節(jié) BOM 是什么
- 第二節(jié) Window 對(duì)象
- 第三節(jié) Navigator 對(duì)象
- 第四節(jié) History 對(duì)象
- 第五節(jié) Location 對(duì)象
- 第六節(jié) 定時(shí)器
