JavaScript DOM Manipulating (新增、修改、刪除 DOM 節點)

除了在這邊提過的 innerHTML, innerText, textContent 和 outerHTML 可以用來改變 DOM 的結構和內容之外,我們在這一篇文章會介紹其他新增、修改和刪除 DOM 節點的方法。

document.createElement(tagName)

document.createElement 方法用來建立一個新的 HTML 元素。

例如:

// 建立一個新的 <div>
var newDiv = document.createElement('div');

document.createTextNode(str)

document.createTextNode 方法用來建立一個新的文字節點 (text node)。

用法:

var newtext = document.createTextNode('I love www.fooish.com!');

ParentNode.appendChild(aChild)

DOM 節點的 appendChild 方法,用來新增一個新的子元素到現有子元素的最後面。

範例:

<div id="foo"><span>hello</span></div>

<script>
    // 建立一個新 <div>
    var newDiv = document.createElement('div');

    // 建立一個新的文字節點
    var newContent = document.createTextNode('I love www.fooish.com!');

    // 將文字節點加到剛建立的 <div> 元素中
    newDiv.appendChild(newContent);

    // 取得目前頁面上的 foo 元素
    var currentDiv = document.getElementById('foo');

    // 將剛建立的 <div> 元素加入 foo 元素中
    currentDiv.appendChild(newDiv);

    // 顯示 <span>hello</span><div>I love www.fooish.com!</div>
    alert(currentDiv.innerHTML);
</script>

appendChild 也可以用來移動 DOM 元素的位置:

<div id="container"><div id="foo"></div><div id="bar"><span id="s1">hello</span><span id="s2">world</span></div></div>

<script>
    // 取得目前頁面上的 foo 元素
    var foo = document.getElementById('foo');

    // 取得目前頁面上的 s1 元素
    var s1 = document.getElementById('s1');

    // 將 s1 元素放到 foo 元素中最後面
    foo.appendChild(s1);

    // 顯示 <div id="foo"><span id="s1">hello</span></div><div id="bar"><span id="s2">world</span></div>
    alert(document.getElementById('container').innerHTML);
</script>

ParentNode.insertBefore(newNode, referenceNode)

DOM 節點的 insertBefore 方法,用來將一個新的元素加到某個元素的前面。

<div id="foo"><span id="s1">hello</span><span id="s2">world</span></div>

<script>
    // 建立一個新的 <span>
    var newSpan = document.createElement('span');
    // 增添一些內容
    newSpan.innerHTML = 'new';

    // 取得目前頁面上的 foo 元素
    var foo = document.getElementById('foo');

    // 取得目前頁面上的 s2 元素
    var s2 = document.getElementById('s2');

    // 將新的 span 元素放到 foo 元素中的 s2 子元素前面
    foo.insertBefore(newSpan, s2);

    // 顯示 <span id="s1">hello</span><span>new</span><span id="s2">world</span>
    alert(foo.innerHTML);
</script>

insertBefore 也可以用來移動 DOM 元素的位置:

<div id="foo"><span id="s1">hello</span><span id="s2">world</span></div>

<script>
    // 取得目前頁面上的 foo 元素
    var foo = document.getElementById('foo');

    // 取得目前頁面上的 s1 元素
    var s1 = document.getElementById('s1');
    // 取得目前頁面上的 s2 元素
    var s2 = document.getElementById('s2');

    // 將 s2 元素放到 foo 元素中的 s1 子元素前面
    foo.insertBefore(s2, s1);

    // 顯示 <span id="s2">world</span><span id="s1">hello</span>
    alert(foo.innerHTML);
</script>

ParentNode.removeChild(child)

removeChild 方法用來移除 DOM 節點。

使用方法:

<div id="container"><div id="nested">12</div>34</div>

<script>
    // 取得目前頁面上的 container <div> 元素
    var container = document.getElementById('container');

    // 取得目前頁面上的 nested <div> 元素
    var nested = document.getElementById('nested');

    // 從頁面上移除 nested <div> 元素
    // removeChild 方法會返回被移除的元素
    var garbage = container.removeChild(nested);

    // 顯示 <div id="nested">12</div>
    alert(garbage.outerHTML);

    // 顯示 34
    alert(container.innerHTML);
</script>

ParentNode.replaceChild(newChild, oldChild)

replaceChild 方法用新節點來取代某個子節點,這個新節點可以是某個已存在的節點或是新節點。

範例:

<div><span id="childSpan">foo bar</span></div>

<script>
    // 建立一個新的 <span>
    var sp1 = document.createElement('span');
    // 增加些內容
    sp1.innerHTML = 'new replacement span element.';

    // 取得目前頁面上的 childSpan 元素
    var sp2 = document.getElementById('childSpan');

    // 取得 childSpan 的父親元素
    var parentDiv = sp2.parentNode;

    // 用 sp1 取代 sp2
    // replaceChild 方法會返回被取代的元素
    var replacedNode = parentDiv.replaceChild(sp1, sp2);

    // 顯示 <span id="childSpan">foo bar</span>
    alert(replacedNode.outerHTML);

    // 顯示 <span>new replacement span element.</span>
    alert(parentDiv.innerHTML);
</script>

Node.cloneNode(deep)

cloneNode 方法可以用來複製一個節點,cloneNode 預設不會複製節點的內容,你可以傳入參數 true 來複製節點的內容。

用法:

<div id="foo"><span>bar</span></div>

<script>
    // 取得目前頁面上的 foo 元素
    var foo = document.getElementById('foo');

    // 顯示 <div id="foo"></div>
    alert(foo.cloneNode(false).outerHTML);

    // 顯示 <div id="foo"><span>bar</span></div>
    alert(foo.cloneNode(true).outerHTML);
</script>

document.write(html)

document.write 可以用來在頁面載入的時候,將 HTML 內容寫入頁面中。

範例:

<html>
<head>
  <title>document.write example</title>
</head>
<body>
  <p>first paragraph</p>
  <script>
    document.write('<p>second paragraph</p>');
  </script>
</body>
</html>

待頁面載入後,整份文件的內容會像是這樣:

<html>
<head>
  <title>document.write example</title>
</head>
<body>
  <p>first paragraph</p>
  <script>
    document.write('<p>second paragraph</p>');
  </script>
  <p>second paragraph</p>
</body>
</html>

如果你在頁面載入後,才執行 document.write 則會將畫面的內容都清空後,才寫入新內容,現在實務上也比較少在使用 document.write。