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。