DOM์์ ๋ ธ๋ ์ถ๊ฐ-์ญ์ ํ๊ธฐ
๋ ธ๋ ๋ฆฌ์คํธ๋
DOM์์ ์๋ก์ด ๋ ธ๋๋ฅผ ๋ง๋ค์ด ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ค๋ฉด ๋ ธ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๋ ธ๋ ๋ฆฌ์คํธ๋ ๋ฌด์์ผ๊น?
DOM์ ์ ๊ทผํ ๋ querySelectorAll() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ธ๋๋ฅผ ํ๊บผ๋ฒ์ ์ฌ๋ฌ ๊ฐ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ด๋ ๋ ธ๋ ์ ๋ณด๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์ฅํ ๊ฒ์ด ๋ ธ๋ ๋ฆฌ์คํธ์ด๋ค.
๋ฐฐ์ด๊ณผ ๋น์ทํ๊ฒ ๋์ํ๋ค.
ํ ์คํธ ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ ์๋ก์ด ์์ ์ถ๊ฐํ๊ธฐ
์ฌ๊ธฐ์์๋ [๋ ๋ณด๊ธฐ] ๋งํ๋ฅผ ํด๋ฆญํ๋ฉด ๊ทธ ์๋์ ๊ฐ๋จํ ํ ์คํธ๊ฐ ํ์๋๋ ์คํฌ๋ฆฝํธ ์์ค๋ฅผ ์์ฑํด ๋ณด๊ฒ ๋ค.
๋ฌธ์์๋ ๋จ์ํ <p> ํ๊ทธ ํ๋๊ฐ ์ถ๊ฐ๋์ด ๋ณด์ด์ง๋ง DOM์์๋ ์ฌ๋ฌ ๋จ๊ณ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
1. ์์ ๋ง๋ค๊ธฐ - createElement() ๋ฉ์๋
DOM์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ๋ ๊ฐ์ฅ ๋จผ์ ํ ์ผ์ ์์ ๋ ธ๋๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
์ด๋ ์ฌ์ฉํ๋ ๋ฉ์๋๋ createElement()์ธ๋ฐ ๊ดํธ ์์ ํด๋นํ๋ ์์ ๋ ธ๋๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
document.reateElement(๋
ธ๋๋ช
)
์๋ฅผ ๋ค์ด ์๋ก์ด p ์์๋ฅผ ๋ง๋ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
var newP = document.createElement("p");
ํ์ง๋ง createElement() ๋ฉ์๋๋ ์๋ก์ด ๋ ธ๋๋ฅผ ๋ง๋ค ๋ฟ ์์ง ์น ๋ฌธ์์ ์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ ๊ฒ์ ์๋๋ค.
์ด์ <p> ํ๊ทธ์ ๋ด์ฉ์ ํด๋นํ๋ ํ ์คํธ ๋ ธ๋๋ ๋ง๋ค์ด์ผ ํ๋ค.
2. ํ ์คํธ ๋ ธ๋ ๋ง๋ค๊ธฐ - createTextNode() ๋ฉ์๋
์๋ก์ด ์์ ๋ ธ๋๋ฅผ ๋ง๋ค์๋ค๋ฉด ๊ทธ๋ค์์ ๋ด์ฉ์ ๋ด๋ ํ ์คํธ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋๋ก ๋ง๋ค์ด ์ฐ๊ฒฐํด์ผ ํ๋ค.
ํ ์คํธ ๋ ธ๋๋ฅผ ๋ง๋๋ ๋ฉ์๋๋ createTextNode()์ด๊ณ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ฌ์ฉํ๋ค.
document.createTextNode(ํ
์คํธ);
์๋กญ๊ฒ ๋ง๋ p ์์์ ๋ค์ด๊ฐ ๋ด์ฉ์ด ์๋ ํ ์คํธ ๋ ธ๋๋ txtNode ๋ณ์๋ก ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ DOM ํธ๋ฆฌ์ ์ถ๊ฐํ๋ฉด ๋๋ค.
3. ์์ ๋ ธ๋ ์ฐ๊ฒฐํ๊ธฐ- appendChild() ๋ฉ์๋
์ง๊ธ๊น์ง ์๋ก์ด p ๋ ธ๋(newP)์ ์ฌ์ฉํ ํ ์คํธ ๋ ธ๋(txtNode)๋ฅผ ๋ง๋ค์๋ค.
์์ง๊น์ง๋ ๋ ธ๋๋ฅผ ๋ง๋ ์ํ์ด๋ฉฐ ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋๋ก ์ฐ๊ฒฐ๋์ง ์์๋ค.
appendChild() ๋ฉ์๋๋ ํ ์คํธ ๋ ธ๋๋ ์์ฑ ๋ ธ๋๋ฅผ ๋ง๋ ํ ์์ ๋ ธ๋์ ์ฐ๊ฒฐํ ๋ ์ฌ์ฉํ๋ค.
์ด๋ appendChild() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ฒฐํ๋ ๋ ธ๋๋ ์์ ๋ ธ๋ ์ค ๋งจ ๋์ ์ถ๊ฐ๋๋ค.
๋ถ๋ชจ๋
ธ๋.appendChild(์์๋
ธ๋)
๋ค์์ ํ ์คํธ ๋ ธ๋ txtNode๋ฅผ ์์ ๋ ธ๋ newP์ ์์ ๋ ธ๋๋ก ์ฐ๊ฒฐํ๊ณ , newP ๋ ธ๋๋ฅผ ๋ค์ <div di="info"></div>์ ์์ ๋ ธ๋๋ก ์ฐ๊ฒฐํ๋ค.
newP.appendChild(txtNode);
document.getElementById("info").appendChild(newP);
4. ์ ์ฒด ์์ค ์ฝ๋ ์์ฑํ๊ธฐ
์ง๊ธ๊น์ง ์์๋ฅผ ์์ฑํ๊ณ ์๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์์ผ๋ ์ ์ฒด ์์ค๋ฅผ ์์ฑํด ๋ณด๊ฒ ๋ค.
๋ค์ ์์ ๋ฅผ ๋ณด๋ฉด [๋ ๋ณด๊ธฐ] ๋งํฌ๋ฅผ ํด๋ฆญํ๋ ๋ถ๋ถ์ addP() ํจ์์ this.onclick='' ์ฝ๋๊ฐ ์ถ๊ฐ๋์๋ค.
์ด๊ฒ์ addP() ํจ์๊ฐ ํ ๋ฒ๋ง ์คํ๋๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
๋ง์ผ ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ์ง ์์ผ๋ฉด ๋งํฌ๋ฅผ ํด๋ฆญํ ๋๋ง๋ค p ์์๊ฐ ๊ณ์ ์ถ๊ฐ๋๋ค.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>innerText, innerHTML ํ๋กํผํฐ</title>
</head>
<body>
<div id="container">
<h1>DOM์ ๊ณต๋ถํฉ์๋ค</h1>
<a href="#" onclick="addP(); this.onclick='';">๋ ๋ณด๊ธฐ</a>
<div id="info"></div>
</div>
<script>
function addP() {
var newP = document.createElement("p");
var txtNode = document.createTextNode("DOM์ document object model์ ์ค์๋ง์ด๋ค.");
newP.appendChild(txtNode);
document.getElementById("info").appendChild(newP);
}
</script>
</body>
</html>
์์ฑ๊ฐ์ด ์๋ ์๋ก์ด ์์ ์ถ๊ฐํ๊ธฐ
HTML ํ๊ทธ์์๋ ์ฌ๋ฌ ๊ฐ์ง ์์ฑ์ ์ฌ์ฉํด์ ์น ์์๋ฅผ ์ ์ดํ๋ค.
๋ฐ๋ผ์ ์๋ก์ด ์์๋ฅผ ๋ง๋ค๋ฉด ๊ทธ์ ๊ด๋ จ๋ ์์ฑ ๋ ธ๋๋ ๋ง๋ค์ด์ ์์ ๋ ธ๋๋ก ์ฐ๊ฒฐํด์ผ ํ๋ค.
์์ผ ์์ ์ ์ด์ด์ '๋ ๋ณด๊ธฐ' ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ๊ทธ ์๋์ ํ ์คํธ๋ ๋ฌผ๋ก ์ด๋ฏธ์ง๊น์ง ํ์๋๋ ์คํฌ๋ฆฝํธ ์์ค๋ฅผ ์ถ๊ฐ๋ก ์์ฑํด ๋ณด๊ฒ ๋ค.
์น ๋ฌธ์์์ ์ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ ์ฃผ๋ ค๋ฉด img ์์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ ํ src ์์ฑ ๋ ธ๋๋ฅผ ๋ง๋ค์ด ์์ ๋ ธ๋๋ก ์ฐ๊ฒฐํด์ผ ํ๋ค.
1. ์์ ๋ ธ๋ ๋ง๋ค๊ธฐ - createElement() ๋ฉ์๋
ํ ์คํธ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก createElement() ๋ฉ์๋๋ฅผ ์์ฉํด์ ์๋ก์ด ์ด๋ฏธ์ง ๋ ธ๋๋ฅผ ๋ง๋ ๋ค.
var newImg = document.createElement("img")
2. ์์ฑ ๋ ธ๋ ๋ง๋ค๊ธฐ - createAttribute() ๋ฉ์๋
img ์์๋ src ์์ฑ์ ์ฌ์ฉํด์ ์ด๋ฏธ์ง ํ์ผ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ผ ๋ธ๋ผ์ฐ์ ์ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ ์ค ์ ์๋ค.
๊ทธ๋์ createAttribute() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์์ฑ ๋ ธ๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
document.createAttribute(์์ฑ๋ช
)
๋ค์์ ์ด๋ฏธ์ง ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ src์ ๋์ฒด ํ ์คํธ๋ฅผ ์ง์ ํ alt๋ฅผ ์ํด ์์ฑ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ์์ ์ด๋ค.
์์ฑ ๋ ธ๋๋ฅผ ๋ง๋ ํ ์์ฑ๊ฐ์ value ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ ์ง์ ํ๋ค.
var srcNode = document.createAttribute("src");
var altNode = document.createAttribute("alt");
srcNode.value = "images/dom.jpg";
altNode.value = "๋ ํธ๋ฆฌ ์์ ์ด๋ฏธ์ง";
3. ์์ฑ ๋ ธ๋ ์ฐ๊ฒฐํ๊ธฐ - setAttributeNode() ๋ฉ์๋
์์ฑ ๋ ธ๋๋ ์์ ๋ ธ๋์ ์์์ผ๋ก ์ฐ๊ฒฐํด์ผ ํ๋ค.
์๋ก ๋ง๋ ์์ฑ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋์ ์ถ๊ฐํ๋ ค๋ฉด setAttributeNode() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
์์๋ช
.setAttributeNode(์์ฑ๋
ธ๋)
๋ง์ฝ ์ถ๊ฐํ ์์ฑ์ด ์์ ๋ ธ๋์ ์ด๋ฏธ ๋ค์ด ์๋ค๋ฉด ๊ธฐ์กด ์์ฑ ๋ ธ๋๋ฅผ ์ ์์ฑ ๋ ธ๋๋ก ๋์ฒดํ๋ค.
๋ค์์ newImg๋ผ๋ ์ ์ด๋ฏธ์ง ์์๋ฅผ ๋ง๋ค๊ณ srcNode๋ผ๋ ์์ฑ ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ฌ ์์ฑํ ๊ฒ์ด๋ค.
๋ค๋ฅธ ์์ฑ๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ผ๋ง๋ ์ง ์ถ๊ฐํ ์ ์๋ค.
newImg.setAttributeNode(srcNode);
4. ์์ ๋ ธ๋ ์ฐ๊ฒฐํ๊ธฐ - appendChild() ๋ฉ์๋
์์ฑ ๋ ธ๋๊น์ง ์ฐ๊ฒฐํ์ง๋ง ์์ง img ์์๋ ๋ง๋ค์ด ๋๊ธฐ๋ง ํ ์ํ์ด๋ค.
img ์์๋ฅผ ํ๋ฉด์ ํ์ํ๋ ค๋ฉด ์น ๋ฌธ์์ DOM์ ์ถ๊ฐํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ ค๋ฉด appendChild() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ํ์ํ ์์น์ ์์ ๋ ธ๋๋ก ์ถ๊ฐํ๋ฉด ๋๋ค
๋ค์์ #info ์์น์ ์๋ก ๋ง๋ img ์์๋ฅผ ์์ ์์๋ก ์ถ๊ฐํ๋ ์์ ์ด๋ค.
document.getElementById("info").appendChild(newImg);
+์์ ๋ ธ๋ ์์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
appendChild๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก ์์์ด ๋๋ ๋ ธ๋๊ฐ ๊ธฐ์กด ์์๋ ธ๋ ๋ค์ ๋ถ์ฌ์ ธ์ ๋ ธ๋๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋๋ค.
๋ง์ฝ ๊ธฐ์กด ์์๋ ธ๋ ๋ค๊ฐ ์๋ ๋ค๋ฅธ ์์๋ก ์๋ก์ด ์์ ๋ ธ๋๋ฅผ ๋ฑ๋กํ๊ณ ์ถ๋ค๋ฉด
insertBefore ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
insertBefore ๋ฉ์๋๋ ๋ ธ๋์ ๋ ธ๋๋ฅผ ์ฝ์ ํ ์์น๋ฅผ ์ ๋ฌํ์ฌ ์์์ผ๋ก ๋ง๋ค ์ ์๋ค.
์๋ฅผ ๋ค์ด ์ฒซ ๋ฒ์งธ ๋ ธ๋๋ก ๋ฑ๋ก์ํค๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํ๋ฉด ๋๋ค.
parentNode.appendChild(newNode, parentNode.childNodes[0])
๋ ธ๋ ์ญ์ ํ๊ธฐ
๋ ธ๋๋ฅผ ์ญ์ ํ ๋ ๊ธฐ์ตํด ๋ ๊ฒ์ ๋ถ๋ชจ ๋ ธ๋์์ ์์ ๋ ธ๋๋ฅผ ์ญ์ ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ์ญ์ ํด์ผ ํ ๋ ธ๋๊ฐ ์๋ค๋ฉด ๋ฐ๋์ ๋ถ๋ชจ ๋ ธ๋ ๋จผ์ ์ฐพ์์ผ ํ๋ค.
๊ทธ๋์ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ ๋ฉ์๋ ์ธ์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ฐพ๋ ํ๋กํผํฐ๊ฐ ํ์ํ๋ค.
parentNode ํ๋กํผํฐ
DOM ํธ๋ฆฌ์ ๋ ธ๋๋ ๋ฐ๋ก ์ญ์ ํ ์ ์์ผ๋ฏ๋ก ๋จผ์ ๋ถ๋ชจ ๋ ธ๋์ ์ ๊ทผํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ ค๋ฉด ์ญ์ ํ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค.
parentNode ํ๋กํผํฐ๋ ํ์ฌ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋์ ์ ๊ทผํด์ ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋๋ฅผ ๋ฐํํ๋ค.
๋
ธ๋.parentNode
removeChild() ๋ฉ์๋
์ด๋ฆ์์๋ ์ ์ ์๋ฏ์ด ์์ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ ์ญํ ์ ํ๋ค.
๋ถ๋ชจ ๋ ธ๋๋ง ์ฐพ๋๋ค๋ฉด removeChild()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋จํ๋ค.
๋ถ๋ชจ๋
ธ๋.removeChild(์์๋
ธ๋)
์๋ฅผ ๋ค์ด li ๋ ธ๋๋ฅผ ์ญ์ ํ๋ ค๋ฉด li์ ๋ถ๋ชจ ๋ ธ๋์์ ์ญ์ ํด์ผ ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
li.parentNode.removeChild(li)