[WebAPIs] Node Element 在 appendChild 後消失(disappear)!
為什麼無法正確 appendChild !?
情況描述:Node.appendChild 的使用
Node.appendChild()
是我們在 JavaScript 中操作 DOM 的時候經常會使用到的方法,特別是在我們使用 JS 建立一個 DOM Element 之後。
舉例來說,假設現在我們的 HTML 結構長這樣:
<div class="demo-1">
<div class="block block-1"></div>
<div class="block block-2"></div>
<div class="block block-3"></div>
</div>
這時候的畫面長這樣子:
img
假設我想要在每一個 .block
中都添加一個 .inner
的 div
時,我們直覺上可能會這樣做:
// STEP1: 利用 document.createElement 建立 DOM Element
let innerElement = document.createElement('div');
innerElement.classList.add('inner');
// STEP2: 選擇每一個 .blocks 並且 appendChild 上去
const blocks = document.querySelectorAll('.block');
blocks.forEach((block) => {
block.appendChild(innerElement);
});
但這時候卻不會出現你預想的畫面,而是只有最後一個 .block 有添加到 .inner 這個 div,畫面會像這樣:
可是我們想要的畫面應該要是這樣:
到底為什麼會這樣呢?
你可能會猜想是 Array.prototype.forEach
的問題,於是我們試著一個一個 appendChild 上去:
// STEP1: 利用 document.createElement 建立 DOM Element
let innerElement = document.createElement('div');
innerElement.classList.add('inner');
// STEP2: 分別選擇各個 block
const block1 = document.querySelector('.block-1');
const block2 = document.querySelector('.block-2');
const block3 = document.querySelector('.block-3');
// STEP3-1: 先 appendChild 到 block1 上
block1.appendChild(innerElement);
看起來好像沒有太大的問題,如我們所料的,appendChild 到 .block1 這個 div 上了:
接著我們來對 .block2 做 appendChild()
// STEP3-2: appendChild 到 block2 上
block1.appendChild(innerElement);
block2.appendChild(innerElement);