โ ๊ฒฐ๊ตญ ๋น์ ์ฝ๋๋ฅผ ์ ์ง๋ณด์ํ๊ฒ ๋ ์น๊ตฌ๊ฐ ๋น์ ์ด ์ด๋์ ์ฌ๋์ง ์๋ ๊ดํญํ ์ธ์ด์ฝํจ์ค๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์ฌ๊ธฐ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ผ. โ
- Martin Golding

๋ธ๋ผ์ฐ์ DOM ์ข ๋ฅ
๋ธ๋ผ์ฐ์ ๋ HTML ๋ฌธ์๋ฅผ ๋ก๋ํ ํ, ํด๋น ๋ฌธ์์ ๋ํ ๋ชจ๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑํ๋ค.
์ด๋ ๋ชจ๋ธ์ ๊ฐ์ฒด์ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ๋๋๋ฐ, ์ด๊ฒ์ DOM tree๋ผ ํ๋ค.

๋ฌธ์ ๋ ธ๋(Document Node)
ํธ๋ฆฌ์ ์ต์์์ ์กด์ฌํ๋ฉฐ ๊ฐ๊ฐ ์์, ์ดํธ๋ฆฌ๋ทฐํธ, ํ ์คํธ ๋ ธ๋์ ์ ๊ทผํ๋ ค๋ฉด ๋ฌธ์ ๋ ธ๋๋ฅผ ํตํด์ผ ํ๋ค.
์ฆ, DOM tree์ ์ ๊ทผํ๊ธฐ ์ํ ์์์ (entry point)์ด๋ค.
โ
์์ ๋ ธ๋(Element Node)
์์ ๋ ธ๋๋ HTML ์๋ฆฌ๋จผํธ๋ฅผ ํํํ๋ค.
์ดํธ๋ฆฌ๋ทฐํธ, ํ ์คํธ ๋ ธ๋์ ์ ๊ทผํ๋ ค๋ฉด ๋จผ์ ์์ ๋ ธ๋๋ฅผ ์ฐพ์ ์ ๊ทผํด์ผ ํ๋ค. ๋ชจ๋ ์์ ๋ ธ๋๋ ์์๋ณ ํน์ฑ์ ํํํ๊ธฐ ์ํด HTMLElement ๊ฐ์ฒด๋ฅผ ์์ํ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ค.
document.getElementById(id) // -> id ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ผ๋ก ์์ ๋
ธ๋๋ฅผ ํ ๊ฐ ์ ํ
์ดํธ๋ฆฌ๋ทฐํธ ๋ ธ๋(Attribute Node)
์ดํธ๋ฆฌ๋ทฐํธ ๋ ธ๋๋ HTML ์์์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํํํ๋ค.
์ดํธ๋ฆฌ๋ทฐํธ ๋ ธ๋๋ ํด๋น ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ์ง์ ๋ ์์์ ์์์ด ์๋๋ผ ํด๋น ์์์ ์ผ๋ถ๋ก ํํ๋๋ค.
๋ฐ๋ผ์ ํด๋น ์์ ๋ ธ๋๋ฅผ ์ฐพ์ ์ ๊ทผํ๋ฉด ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฐธ์กฐ, ์์ ํ ์ ์๋ค.
document.querySelector('h1').id = 'heading'; // -> id ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ ๋ณ๊ฒฝ
โ
ํ ์คํธ ๋ ธ๋(Text Node)
ํ ์คํธ ๋ ธ๋๋ HTML ์์์ ํ ์คํธ๋ฅผ ํํํ๋ค.
ํ ์คํธ ๋ ธ๋๋ ์์ ๋ ธ๋์ ์์์ด๋ฉฐ ์์ ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
์ฆ, ํ ์คํธ ๋ ธ๋๋ DOM tree์ ์ต์ข ํ๋จ์ด๋ค.
์์์ ํ ์คํธ๋ ํ ์คํธ ๋ ธ๋์ ์ ์ฅ๋์ด ์๋ค. ํ ์คํธ ๋ ธ๋์ ์ ๊ทผํ๋ ค๋ฉด ์์์ด ํ์ํ๋ค.
<> ~ </> ๊บฝ์ ํ์์ด ๊ณง ๋ ธ๋ ๊ฐ์ฒด ํ ๊ฐ๋ค.

์๋ฐ์คํฌ๋ฆฝํธ ๋ธ๋ผ์ฐ์ DOM ๋ฌธ๋ฒ
DOM ์์ ์ ํ
์ฝ๋ | ์ค๋ช |
document.getElementById("id๋ช ") | ํด๋น id๋ช ์ ๊ฐ์ง ์์ ํ๋๋ฅผ ๋ฐํ |
document.querySelector("์ ํ์") | ํด๋น ์ ํ์๋ฅผ ๋ง์กฑํ๋ ์์ ํ๋๋ฅผ ๋ฐํ |
document.getElementsByClassName("class๋ช ")[์์] | ํด๋น class๋ช
์ ๊ฐ์ง ๋ชจ๋ ์์๋ค์ ๋ฐฐ์ด์ ๋ด์ ์ธ๋ฑ์ค์ ๋ง๋ ์์๋ฅผ ๋ฐํ Return: HTMLCollection (live) ๋ฐฐ์ด HTMLCollecion ๋ foreach ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. |
document.getElementsByTagName("ํ๊ทธ๋ช ")[์์] | ํด๋น ํ๊ทธ๋ช
์ ๊ฐ์ง ๋ชจ๋ ์์๋ค์ ๋ฐฐ์ด์ ๋ด์ ์ธ๋ฑ์ค์ ๋ง๋ ์์๋ฅผ ๋ฐํ Return: HTMLCollection (live) ๋ฐฐ์ด |
document.querySelectorAll("์ ํ์๋ช ")[์์] | ํด๋น ์ ํ์๋ฅผ ๋ง์กฑํ๋ ๋ชจ๋ ์์๋ค์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค์ ๋ง๋ ์์๋ฅผ ๋ฐํ Return: NodeList (non-live) ๋ฐฐ์ด nodeList ๋ foreach ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. |
var selectedItem = document.getElementsByTagName("li"); // ๋ชจ๋ <li> ์์๋ฅผ ์ ํํจ.
for (var i = 0; i < selectedItem.length; i++) {
console.log(selectedItem[i]); // ํ๊ทธ ๋ฐฐ์ด๋ค์ ์ํํจ
}
document.getElementById("idname"); // id๊ฐ ๊ฐ์ ธ์ด
document.getElementsByClassName("classname")[0]; // ์ ํ๋ ์์์ค ์ฒซ๋ฒ์งธ ์์ => ์ธ๋ฑ์ค 0
document.getElementsByTagName("button")[0];
// <div>ํ๊ทธ๋ค์ ๋ชจ๋ ๊ฐ์ ธ์ค๊ณ ๊ทธ์ค ์ฒซ๋ฒ์งธ divํ๊ทธ์์, ํด๋์ค๊ฐ button์ธ๊ฒ๋ค์ค์ ์ฒซ๋ฒ์งธ ์ ํ
document.getElementsByClassName("div")[0].getElementsByClassName("button")[0];
document.querySelector("#idname"); // ์ ํ์ฟผ๋ฆฌ๋ฌธ ์ ํ
document.querySelector("#idname, .classname"); // ์ฌ๋ฌ ์์ฑ ์ ํ ๊ฐ๋ฅ !!
document.querySelectorAll(".classname")[0];
<div id="login-form">
<input type="text" placeholder="what is your name?" />
<button>Log In</button>
</div>
<script>
const $loginForm = document.querySelector('#login-form');
const $loginInput = $loginForm.querySelector('input'); // divํ๊ทธ์ ์์์ ์ ํํ๋ ์ฟผ๋ฆฌ
const $loginButton = $loginForm.querySelector('button');
</script>
์์ ๋ฐฐ์ด ์ํ
getElementsByClassName ๋ฉ์๋์ ๋ฐํ๊ฐ์ HTMLCollection์ด๋ค.
HTMLCollection ์ผ๋ก ๋ฐํ๋ ๋ฆฌ์คํธ๋ ์ค์๊ฐ ์ ์ฌ๋ฐฐ์ด์ด๋ค.
์ค์๊ฐ์ผ๋ก Node์ ์ํ ๋ณ๊ฒฝ์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ loop๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฃผ์๊ฐ ํ์ํ๋ค. (์ค๊ฐ์ ๋ฐฐ์ด ๊ฐ์ ๋ผ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ฉด ์๋์ผ๋ก ์ธ๋ฑ์ค ์ ๋ ฌ์ ํ๋ค.)
โ
--> ํด๊ฒฐ์ฑ : ์ด๋๊ฐ ๋ฐฐ์ด์ ๋ณต์ฌ๋ฅผ ๊ฑฐ์ณ์ ๊ทธ๊ฑธ๋ก ์ด์ฉํ๋ค.
const elems = document.getElementsByClassName('red');
// ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ธ HTMLCollection์ ๋ฐฐ์ด๋ก ๋ณต์ฌ&๋ณํํ๋ค.
// ๋ฐฐ์ด๋ก ๋ณํ๋ HTMLCollection์ ๋ ์ด์ liveํ์ง ์๋ค.
// ๋ฐฐ์ด๊ฐ๋ค์ ๋ณต์ฌ๋ฅผ ํด๋, dom์ ๋ ํผ๋ฐ์ค๋ก ์ฐ๊ฒฐ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์๋ค.
console.log([...elems]); // [li#one.red, li#two.red, li#three.red]
[...elems].forEach(elem => elem.className = 'blue');
HTMLCollection vs NodeList
HTMLCollection | NodeList | |
๊ณตํต์ | DOM API๋ก ์์๋ฅผ ์ทจ๋ํ ๋ ๋ฐํ๋๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ค. ๋ฐ๋ผ์ for...of, ์คํ๋ ๋๋ฌธ๋ฒ, ๊ตฌ์กฐ๋ถํดํ ๋น์ด ๊ฐ๋ฅํ๋ค. | |
์ถ์ฒ | getElementsByTagName, getElementsByClassName | querySelectorAll, childNodes |
API์ ์ ๋ฌํ ์ธ์๋ฅผ ๋ง์กฑํ๋์ง์ ๋ฐ๋ผ ๊ฐ์ฒด ๊ตฌ์ฑ ์์ ๋ชฉ๋ก์ด ๋์ ์ผ๋ก ๋ฐ๋๋๊ฐ? |
๋์ | ์ ์ ๋จ, childNodes๋ง ์์ธ๋ก ๋์ |
โ
HTML ์ ํ์ฟผ๋ฆฌ๋ฌธ
๊ฐ์ฒด ์งํฉ | ์ค๋ช |
document.anchors | name ์์ฑ์ ๊ฐ์ง๋ <a>์์๋ฅผ ๋ชจ๋ ๋ฐํํจ. |
document.applets | applet ์์๋ฅผ ๋ชจ๋ ๋ฐํํจ. (HTML5์์ ์ ์ธ๋จ) |
document.body | <body>์์๋ฅผ ๋ฐํํจ. |
document.cookie | HTML ๋ฌธ์์ ์ฟ ํค(cookie)๋ฅผ ๋ฐํํจ. |
document.domain | HTML ๋ฌธ์๊ฐ ์์นํ ์๋ฒ์ ๋๋ฉ์ธ ๋ค์(domain name)์ ๋ฐํํจ. |
document.forms | <form>์์๋ฅผ ๋ชจ๋ ๋ฐํํจ. |
document.images | <img>์์๋ฅผ ๋ชจ๋ ๋ฐํํจ. |
document.links | href ์์ฑ์ ๊ฐ์ง๋ <area>์์์ <a>์์๋ฅผ ๋ชจ๋ ๋ฐํํจ. |
document.referrer | ๋งํฌ(linking)๋์ด ์๋ ๋ฌธ์์ URI๋ฅผ ๋ฐํํจ. |
document.title | <title>์์๋ฅผ ๋ฐํํจ. |
document.URL | HTML ๋ฌธ์์ ์์ ํ URL ์ฃผ์๋ฅผ ๋ฐํํจ. |
document.baseURI | HTML ๋ฌธ์์ ์ ๋ URI(absolute base URI)๋ฅผ ๋ฐํํจ. |
document.doctype | HTML ๋ฌธ์์ ๋ฌธ์ ํ์ (doctype)์ ๋ฐํํจ. |
document.documentElement | <html>์์๋ฅผ ๋ฐํํจ. |
document.documentMode | ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ๋๋ฅผ ๋ฐํํจ. |
document.documentURI | HTML ๋ฌธ์์ URI๋ฅผ ๋ฐํํจ. |
document.domConfig | HTML DOM ์ค์ ์ ๋ฐํํจ. (๋๋ ์ฌ์ฉํ์ง ์์) |
document.embeds | <embed>์์๋ฅผ ๋ชจ๋ ๋ฐํํจ. |
document.head | <head>์์๋ฅผ ๋ฐํํจ. |
document.implementation | HTML DOM ๊ตฌํ(implementation)์ ๋ฐํํจ. |
document.inputEncoding | HTML ๋ฌธ์์ ๋ฌธ์ ์ธ์ฝ๋ฉ(character set) ํ์์ ๋ฐํํจ. |
document.lastModified | HTML ๋ฌธ์์ ๋ง์ง๋ง ๊ฐฑ์ ๋ ์ง ๋ฐ ์๊ฐ์ ๋ฐํํจ |
document.readyState | HTML ๋ฌธ์์ ๋ก๋ฉ ์ํ(loading status)๋ฅผ ๋ฐํํจ. |
document.scripts | <script>์์๋ฅผ ๋ชจ๋ ๋ฐํํจ. |
document.strictErrorChecking | ์ค๋ฅ์ ๊ฐ์ ๊ฒ์ฌ ์ฌ๋ถ๋ฅผ ๋ฐํํจ. |
DOM ์์ ํ์

ํ๋กํผํฐ | ํน์ง | ํ ์คํธ ๋ ธ๋ ํฌํจ ์ฌ๋ถ |
parentNode | ๋ถ๋ชจ ๋ ธ๋๋ฅผ ํ์ | O |
parentElement | ๋ถ๋ชจ ๋ ธ๋ ํ์ | X |
childNodes | ํ์ ๋ชจ๋ ๋
ธ๋ ๊ฐ์ฒด๋ฅผ NodeList๋ก ๋ฐํ Return: NodeList (live) |
O |
children | ํ์ ๋ชจ๋ ๋
ธ๋ ๊ฐ์ฒด๋ฅผ HTMLCollection์ผ๋ก ๋ฐํ Return: HTMLCollection (live) |
X |
firstChild | ์ง๊ณ ์์ ๊ฐ์ฒด ์ค์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๋ ธ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ | O |
lastChild | ์ง๊ณ ์์ ๊ฐ์ฒด ์ค์์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ ธ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ | O |
firstElementChild | ์ง๊ณ ์์ ๊ฐ์ฒด ์ค์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๋ ธ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ | X |
lastElementChild | ์ง๊ณ ์์ ๊ฐ์ฒด ์ค์์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ ธ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ | X |
hasChildNodes() | ์์ ๋ ธ๋ ๊ฐ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ฅผ boolean์ผ๋ก ๋ฐํ | O |
children.length | ์์ ๋ ธ๋ ๊ฐ์ฒด ์ ๋ฐํ | X |
childElementCount | ์์ ๋ ธ๋ ๊ฐ์ฒด ์ ๋ฐํ | X |
previousSibling | ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ๋ ธ๋ ๊ฐ์ฒด ์ค์์ ์ด์ ๋ ธ๋ ๋ฐํ | O |
nextSibling | ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ๋ ธ๋ ๊ฐ์ฒด ์ค์์ ๋ค์ ๋ ธ๋ ๋ฐํ | O |
previousElementSibling | ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ๋ ธ๋ ๊ฐ์ฒด ์ค์์ ์ด์ ๋ ธ๋ ๋ฐํ | X |
nextElementSibling | ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ๋ ธ๋ ๊ฐ์ฒด ์ค์์ ๋ค์ ๋ ธ๋ ๋ฐํ | X |
<html>
<head>
</head>
<body>
<ul id="languages">
<li class="html">HTML</li>
<li class="css">CSS</li>
<li class="js">JS</li>
</ul>
<script>
const $css = document.querySelector('.css');
console.log($css.previousSibling);
console.log($css.nextSibling);
console.log($css.previousElementSibling);
console.log($css.nextElementSibling);
</script>
</body>
</html>

<html>
<head>
</head>
<body>
<ul id="languages">
<li class="html">HTML</li>
<li class="css">CSS</li>
<li class="js">JS</li>
</ul>
<script>
const $languages = document.getElementById('languages');
console.log($languages);
console.log($languages.childNodes);
console.log($languages.children);
console.log($languages.firstChild);
console.log($languages.lastChild);
console.log($languages.firstElementChild);
console.log($languages.lastElementChild);
console.log($languages.hasChildNodes());
console.log($languages.children.length);
console.log($languages.childElementCount);
</script>
</body>
</html>

DOM ์์ ์์ฑ ์กฐ์
์ฝ๋ | ์ค๋ช |
hasAttribute(attribute) | ์ง์ ํ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ๊ฒ์ฌํ๋ค. |
getAttribute(attribute) | ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ ์ทจ๋ํ๋ค. |
setAttribute(attribute, value) | ์ดํธ๋ฆฌ๋ทฐํธ์ ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ์ค์ ํ๋ค. |
removeAttribute(attribute) | ์ง์ ํ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ๊ฑฐํ๋ค. |
.attributes | ์์ฑ๋ค์ ๋ชจ์์ ๋ฐฐ์ด๋ก ๋ฐํ |
<!DOCTYPE html>
<html>
<body>
<input type="text">
<script>
const input = document.querySelector('input[type=text]');
console.log(input);
if (!input.hasAttribute('value')) { // value ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด
// value ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ถ๊ฐํ๊ณ ๊ฐ์ผ๋ก 'hello!'๋ฅผ ์ค์
input.setAttribute('value', 'hello!');
}
// value ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ์ทจ๋
console.log(input.getAttribute('value')); // hello!
// value ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ๊ฑฐ
input.removeAttribute('value');
</script>
</body>
</html>
์ฝ๋ | ์ค๋ช |
element.id | id ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ ์ทจ๋ ๋๋ ๋ณ๊ฒฝํ๋ค. id ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด id ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์์ฑํ๊ณ ์ง์ ๋ ๊ฐ์ ์ค์ ํ๋ค. |
element.style.property | ํด๋น ์์์ ์ ์ฉ๋ css์์ฑ์ ๊ฐ์ ๋ํ๋ ๋๋ค. |
element.attribute | ํด๋น ์์์ ์์ฑ์ ๋ํ๋ ๋๋ค. |
<form>
<input type="password" name="input"/>
</form>
input {
display: block;
background-color: red;
width: 200px;
height: 10px;
}
const input = document.querySelector("input");
input.style.display = "none";
input.style.width = "100px";
input.name = "output";
input.id = "input_id";
input.style['font-size'] = '2rem';
//์ฃผ์ํ ์ ์ css ์์ฑ ๊ฐ์ ๋ฐ์ดํ๋ก ๊ฐ์ธ์ ๋ฌธ์์ด์ ํํ๋ก ๋์
ํด์ผ ๋๋ค๋ ๊ฒ์
๋๋ค.
DOM ํด๋์ค ์์ฑ ์กฐ์
์ฝ๋ | ์ค๋ช |
element.className | class ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ ์ทจ๋ ๋๋ ๋ณ๊ฒฝํ๋ค. class ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด class ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์์ฑํ๊ณ ์ง์ ๋ ๊ฐ์ ์ค์ ํ๋ค. โ class ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด์ด ๋ฐํ๋๋ฏ๋ก String ๋ฉ์๋ split(', ')๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉํ๋ค. |
element.classList | ๋ณดํต ๋ถํธ์คํธ๋ฉ๊ฐ์ด, ํด๋์ค๋ช
์ผ๋ก css ์คํ์ผ์ ์กฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด๋, classList์์ ์ ๊ณตํ๋ ๋ฉ์๋๋ก ํด๋์ค๋ช
์ ๊ฐํธํ๊ฒ ์กฐ์ ํ ์ ์๋ค. add, remove, item, toggle, contains, replace ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. |
<p id="a11"class="document, aa, bb, cc, dd"></p>
<script>
let a = document.querySelector("#a11");
console.log(a.className) // "document, aa, bb, cc, dd"
let arr = a.className.split(", "); // [ 'document', 'aa', 'bb', 'cc', 'dd' ]
</script>
classList ๋ฉ์๋ | ๊ธฐ๋ฅ |
add() | ํด๋์ค ๋ชฉ๋ก์ ์ถ๊ฐํ ๋ฌธ์์ด์ 1๊ฐ ์ด์ ์ธ์๋ก ์ ๋ฌํ๋ค. |
remove() | ํด๋์ค ๋ชฉ๋ก์์ ์ ๊ฑฐํ ๋ฌธ์์ด์ 1๊ฐ ์ด์ ์ธ์๋ก ์ ๋ฌํ๋ค. |
item() | ํด๋์ค ๋ชฉ๋ก์์, ์ธ์๋ก ์ ๋ฌํ ์ ์ ์ธ๋ฑ์ค์ ์์นํ ๋ฌธ์์ด์ ๋ฐํํ๋ค. |
contains() | ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด์ด ํด๋์ค ๋ชฉ๋ก์ ์กด์ฌํ๋ ์ง ํ๋จํ์ฌ boolean์ ๋ฐํํ๋ค. |
replace() | ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด์ ํด๋์ค ๋ชฉ๋ก์์ ์ฐพ์ ํ, ๋๋ฒ์งธ ์ธ์๋ฅผ ๋์ ํ๋ค. |
toggle() | ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๋ฌธ์์ด์ด ํด๋์ค ๋ชฉ๋ก์ ์์ผ๋ฉด ์ญ์ ๋ฅผ, ์์ผ๋ฉด ์ถ๊ฐํ๋ค. |
toggle(true/false) | ์ฒซ๋ฒ์งธ ์ธ์๊ฐ ํด๋์ค ๋ชฉ๋ก์ ์ด๋ฏธ ์กด์ฌํ๋์ง ํ์
ํ์ง ์๊ณ , true๋ ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ํด๋์ค ๋ชฉ๋ก์ ๊ฐ์ ์ถ๊ฐ, false๋ ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ํด๋์ค ๋ชฉ๋ก์์ ๊ฐ์ ์ญ์ ํ๋ค. |
var element = document.createElement('tagName');
var addClass = element.classList.add('className'); // Class ์ถ๊ฐ
var removeClass = element.classList.remove('className'); // Class ์ญ์
var toggleClass = element.classList.toggle('className'); // Class ํ ๊ธ
// class๊ฐ ์กด์ฌํ๋ค๋ฉด ์ ๊ฑฐํ๊ณ ์กด์ฌํ์ง ์์ผ๋ฉด class๋ฅผ ์ถ๊ฐํ๋ค.
const div = document.createElement('div');
div.className = 'foo';
// our starting state: <div class="foo"></div>
console.log(div.outerHTML);
// use the classList API to remove and add classes
div.classList.remove("foo");
div.classList.add("anotherclass");
// <div class="anotherclass"></div>
console.log(div.outerHTML);
// if visible is set remove it, otherwise add it
div.classList.toggle("visible");
// add/remove visible, depending on test conditional, i less than 10
div.classList.toggle("visible", i < 10 );
console.log(div.classList.contains("foo"));
// add or remove multiple classes
div.classList.add("foo", "bar", "baz");
div.classList.remove("foo", "bar", "baz");
// add or remove multiple classes using spread syntax
const cls = ["foo", "bar"];
div.classList.add(...cls);
div.classList.remove(...cls);
// replace class "foo" with class "bar"
div.classList.replace("foo", "bar");
DOM ๋ ธ๋ ์กฐํ
๋ ธ๋(Node) : HTML ํ์ด์ง์ ๊ฐ ์์(html, head, body . . . ๋ฑ)
- ์์ ๋ ธ๋(Element Node) : HTML ํ๊ทธ
- ํ ์คํธ ๋ ธ๋(Text Node) : ์์ ๋ ธ๋ ์์ ์๋ ๊ธ์
์ฝ๋ | ์ค๋ช |
nodeName | ๋
ธ๋์ ์ด๋ฆ์ ๋ํ๋ด๋ ๋ฌธ์์ด ๋ฐํ โ ์์ ๋ ธ๋ : ํ๊ทธ ์ด๋ฆ์ ์๋๋ฌธ์ ํ ์คํธ ๋ ธ๋ : #text ๋ฌธ์ ๋ ธ๋ : #document |
nodeValue | ํน์ ๋
ธ๋์ ์ฒซ๋ฒ์งธ ํ์ ํ
์คํธ ๋
ธ๋์ ๊ฐ(ํ
์คํธ)์ ์กฐํ/์์ ํ๋ค. firstChild๋ก ํ ์คํธ ๋ ธ๋๋ฅผ ์ง์ ์ฐพ์์ค์ผ ํ๋ค. ํ ์คํธ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋์ ์ ์ฉํ๋ฉด null์ ๋ฐํํ๋ค. |
nodeType | ๋
ธ๋ ๊ณ ์ ์ ํ์
์ ์กฐํ. ์์ X โ ์์ ๋ ธ๋(element node) : 1 ์์ฑ ๋ ธ๋(attribute node) : 2 ํ ์คํธ ๋ ธ๋(text node) : 3 ์ฃผ์ ๋ ธ๋(comment node) : 8 ๋ฌธ์ ๋ ธ๋(document node) : 9 |
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>JavaScript Node Access</title>
</head>
<body>
<h1>nodeName ํ๋กํผํฐ</h1>
<p id="document"></p>
<p id="html"></p>
<h1 id="heading">nodeValue ํ๋กํผํฐ</h1>
<p id="text1">ํ
์คํธ</p>
<script>
// ๋ฌธ์์ ์ฒซ ๋ฒ์งธ ์์ ๋
ธ๋๋ <!DOCTYPE html>์ด๋ฉฐ, ๋ ๋ฒ์งธ ์์ ๋
ธ๋๋ <html>์
๋๋ค.
console.log(document.childNodes[1].nodeName)
// ๋ฌธ์์ ๋๋ฒ์งธ ์์๋
ธ๋ html ์ ์ฒซ ์์์ head ๋
ธ๋.
console.log(document.childNodes[1].childNodes[0].nodeName)
// ๋ฌธ์์ ๋๋ฒ์งธ ์์๋
ธ๋ html ์ ์ธ๋ฒ์งธ ์์๋
ธ๋ body์ ์ฒซ ์์๋
ธ๋ h1์ ์ฒซ ์์ ๋
ธ๋ text๋
ธ๋
console.log(document.childNodes[1].childNodes[2].childNodes[0].nodeName)
// ์์ด๋๊ฐ "heading"์ธ ์์์ ์ฒซ ๋ฒ์งธ ์์ ๋
ธ๋(ํ
์คํธ๋
ธ๋)์ ๋
ธ๋๊ฐ์ ์ ํํจ.
console.log(document.getElementById("heading").firstChild.nodeValue)
</script>
</body>
</html>

๐ก ๋น ํ ์คํธ ๋ ธ๋์ ์ฒ๋ฆฌ
ํ์ฌ ๋๋ถ๋ถ์ ์ฃผ์ ์น ๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ W3C DOM ๋ชจ๋ธ์ ์ง์ํ์ง๋ง, ๊ทธ ์ฒ๋ฆฌ ๋ฐฉ์์ ์์ด ์ฝ๊ฐ์ฉ์ ์ฐจ์ด๊ฐ ์๋ค.
๊ทธ์ค์์๋ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋์ด์ฐ๊ธฐ์ ์ค ๋ฐ๊ฟ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
ํ์ด์ดํญ์ค๋ ๊ธฐํ ๋ธ๋ผ์ฐ์ ๋ค์ ๋์ด์ฐ๊ธฐ๋ ์ค ๋ฐ๊ฟ์ ํ ์คํธ ๋ ธ๋(text node)๋ก ์ทจ๊ธํ๋ค.
ํ์ง๋ง ์ต์คํ๋ก๋ฌ๋ ๋์ด์ฐ๊ธฐ๋ ์ค ๋ฐ๊ฟ์ ํ ์คํธ ๋ ธ๋๋ก ์ทจ๊ธํ์ง ์๋๋ค.
๋ฐ๋ผ์ ์์ ๋ ธ๋๋ ํ์ ๋ ธ๋๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ๋ ธ๋์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด ์ฐจ์ด๋ฅผ ์์ ๋ ๊ฐ์ฅ ์์ฌ์ด ๋ฐฉ๋ฒ์ nodeType ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ ์์์ ํ์ ์ ๊ฒ์ฌํ๋ ๊ฒ์ด๋ค.
โDOM ์ฐ๊ธฐ
์์์ ์ ๊ทผํ๋ฉด ์์์ ์ฌ๋ฌ ๊ฐ์ง ์์ฑ์ ์ ๊ทผํ์ฌ ๋ณ๊ฒฝํ ์ ์๋ค.
* ๋งํฌ์ ์ด ํฌํจ๋ ์ฝํ ์ธ ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํฌ๋ก์ค ์คํฌ๋ฆฝํ ๊ณต๊ฒฉ(XSS: Cross-Site Scripting Attacks)์ ์ทจ์ฝํ๋ค
์ฝ๋ | ์ค๋ช |
element.innerHTML | ํด๋น ์์์ ๋ชจ๋ ์์ ์์๋ฅผ ํฌํจํ๋ ๋ชจ๋ ์ฝํ
์ธ ๋ฅผ ํ๋์ ๋ฌธ์์ด๋ก ์ทจ๋ํ ์ ์๋ค. ์ด ๋ฌธ์์ด์ ๋งํฌ์ ์ ํฌํจํ๋ค. innerHTML์์ ์ง์ ํ ์์ ํ๊ทธ๋ฅผ ์ ์ธํ ์์ชฝ ํ๊ทธ๋ง ๊ฐ์ ๊ฐ์ ธ์จ๋ค ์๊ธฐ์์ ๋ฏธํฌํจ |
element.outerHTML | outerHTML์์ ์ง์ ํ ์์ ํ๊ทธ๋ ํฌํจํ์ฌ ์ ์ฒด ํ๊ทธ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ ํํ ์๋ฆฌ๋จผํธ๋ฅผ ํฌํจํด์ ์ฒ๋ฆฌ ์๊ธฐ์์ ํฌํจ |
document.write() document.writeln() |
์ธ์๋ก ์ ๋ฌํ ๋ด์ฉ์ DOM์ ๊ทธ๋ฆด ์ ์๋ค. ln์ ๊ฐํ๋ฌธ์ ํฌํจํด์ ์ถ๋ ฅ |
textContent | ์์์ ํ
์คํธ ์ฝํ
์ธ ๋ฅผ ์ทจ๋ ๋๋ ๋ณ๊ฒฝํ๋ค. ์ด๋ ๋งํฌ์ ์ ๋ฌด์๋๋ค. textContent๋ฅผ ํตํด ์์์ ์๋ก์ด ํ ์คํธ๋ฅผ ํ ๋นํ๋ฉด ํ ์คํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ์ด๋ ์์ํ ํ ์คํธ๋ง ์ง์ ํด์ผ ํ๋ฉฐ ๋งํฌ์ ์ ํฌํจ์ํค๋ฉด ๋ฌธ์์ด๋ก ์ธ์๋์ด ๊ทธ๋๋ก ์ถ๋ ฅ๋๋ค. |
element.insertAdjacentHTML | innerHTML๋ก ๊ธฐ์กด ์์๋ฅผ ์์ ํ ๋ ์๋ณธ์ด ๋ถํ์ํ๊ฒ ์ง์์ก๋ค๊ฐ ๋ค์ ํ ๋น๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค. โ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์๋ 4๊ฐ์ง ์์น ๋ฌธ์์ด ์ค ํ๋๋ฅผ, ๋๋ฒ์งธ ์ธ์๋ก ์ฝ์ ํ ๋งํฌ์ ๋ฌธ์์ด์ ์ ๋ฌํ๋ฉด ๋๋ค. โ ํ๊ทธ๊ฐ ์ด๋ฆฌ๊ธฐ ์ง์ ์ ์ฝ์ : beforebegin ํ๊ทธ๊ฐ ์ด๋ฆฐ ์งํ์ ์ฝ์ : afterbegin ํ๊ทธ๊ฐ ๋ซํ๊ธฐ ์ง์ ์ ์ฝ์ : beforeend ํ๊ทธ๊ฐ ๋ซํ ์งํ์ ์ฝ์ : afterend |
<div id="test">TEST</div>
<script type="text/javascript">
alert(document.getElementById('test').innerHTML);
//๊ฒฐ๊ณผ๋ TEST
alert(document.getElementById('test').outerHTML);
//๊ฒฐ๊ณผ๋ <div id="test">TEST</div>
</script>
const one = document.getElementById('one');
// ๋งํฌ์
์ด ํฌํจ๋ ์ฝํ
์ธ ์ทจ๋
console.log(one.innerHTML); // Seoul
// ๋งํฌ์
์ด ํฌํจ๋ ์ฝํ
์ธ ๋ณ๊ฒฝ
one.innerHTML += '<em class="blue">, Korea</em>';
// ๋งํฌ์
์ด ํฌํจ๋ ์ฝํ
์ธ ์ทจ๋
console.log(one.innerHTML); // Seoul <em class="blue">, Korea</em>
<div>
<h1>Cities</h1>
<ul>
<li id="one" class="red">Seoul</li>
<li id="two" class="red">London</li>
<li id="three" class="red">Newyork</li>
<li id="four">Tokyo</li>
</ul>
</div>
<script>
const ul = document.querySelector('ul');
console.log(ul.textContent); // ์์์ ํ
์คํธ ์ทจ๋
/*
Seoul
London
Newyork
Tokyo
*/
const one = document.getElementById('one');
console.log(one.textContent); // ์์์ ํ
์คํธ ์ทจ๋ // Seoul
one.textContent += ', Korea'; // ์์์ ํ
์คํธ ๋ณ๊ฒฝ
console.log(one.textContent); // Seoul, Korea
// ์์์ ๋งํฌ์
์ด ํฌํจ๋ ์ฝํ
์ธ ๋ณ๊ฒฝ.
one.textContent = '<h1>Heading</h1>';
// ๋งํฌ์
์ด ๋ฌธ์์ด๋ก ํ์๋๋ค.
console.log(one.textContent); // <h1>Heading</h1>
</script>

<body>
<ul id="languages">
<li class="html">HTML</li>
<li class="css">CSS</li>
<li class="js">JS</li>
</ul>
<script>
const $languages = document.getElementById('languages');
$languages.insertAdjacentHTML('beforebegin', '<p>Insert into beforebegin</p>');
$languages.insertAdjacentHTML('afterbegin', '<p>Insert into afterbegin</p>');
$languages.insertAdjacentHTML('beforeend', '<p>Insert into beforeend</p>');
$languages.insertAdjacentHTML('afterend', '<p>Insert into afterend</p>');
</script>
</body>

innerHTML๊ณผ insertAdjacentHTML()์
ํฌ๋ก์ค ์คํฌ๋ฆฝํ ๊ณต๊ฒฉ(XSS: Cross-Site Scripting Attacks)์ ์ทจ์ฝํ๋ค.
โ
ํ ์คํธ๋ฅผ ์ถ๊ฐ ๋๋ ๋ณ๊ฒฝ์์๋ textContent,
์๋ก์ด ์์์ ์ถ๊ฐ ๋๋ ์ญ์ ์์๋ DOM ์กฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ก ํ๋ค.
DOM ์ถ๊ฐ / ์ญ์
innerHTML ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ก์ด ์ฝํ
์ธ ๋ฅผ ์ถ๊ฐํ ์ ์๋ ๋ฐฉ๋ฒ์ DOM์ ์ง์ ์กฐ์ํ๋ ๊ฒ์ด๋ค.
- ์์ ๋ ธ๋ ์์ฑ createElement() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ์์ ๋ ธ๋๋ฅผ ์์ฑํ๋ค. createElement() ๋ฉ์๋์ ์ธ์๋ก ํ๊ทธ ์ด๋ฆ์ ์ ๋ฌํ๋ค.
- ํ ์คํธ ๋ ธ๋ ์์ฑ createTextNode() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ํ ์คํธ ๋ ธ๋๋ฅผ ์์ฑํ๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ต๋ ์ ์์ง๋ง ์๋ตํ๋ ๊ฒฝ์ฐ, ์ฝํ ์ธ ๊ฐ ๋น์ด ์๋ ์์๊ฐ ๋๋ค.
- ์์ฑ๋ ์์๋ฅผ DOM์ ์ถ๊ฐ appendChild() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๋ ธ๋๋ฅผ DOM tree์ ์ถ๊ฐํ๋ค. ๋๋ removeChild() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ DOM tree์์ ๋ ธ๋๋ฅผ ์ญ์ ํ ์๋ ์๋ค.
์ฝ๋ | ์ค๋ช |
createElement(tagName) | ํ๊ทธ์ด๋ฆ์ ์ธ์๋ก ์ ๋ฌํ์ฌ ์์๋ฅผ ์์ฑํ๋ค. |
createTextNode(text) | ํ
์คํธ๋ฅผ ์ธ์๋ก ์ ๋ฌํ์ฌ ํ
์คํธ ๋
ธ๋๋ฅผ ์์ฑํ๋ค. Return: Text ๊ฐ์ฒด |
appendChild(Node) | ์ธ์๋ก ์ ๋ฌํ ๋
ธ๋๋ฅผ ๋ง์ง๋ง ์์ ์์๋ก DOM ํธ๋ฆฌ์ ์ถ๊ฐํ๋ค. Return: ์ถ๊ฐํ ๋ ธ๋ |
removeChild(Node) | ์ธ์๋ก ์ ๋ฌํ ๋
ธ๋๋ฅผ DOM ํธ๋ฆฌ์์ ์ ๊ฑฐํ๋ค. Return: ์ถ๊ฐํ ๋ ธ๋ |
replaceChild(after, before) | โ๋๋ฒ์งธ ์ธ์๋ฅผ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฎ์ด์์ฐ๋๋ฐ, ๋๋ฒ์งธ ์ธ์๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋
ธ๋ ๊ฐ์ฒด์ ์์ ๊ฐ์ฒด์ฌ์ผ ํ๋ค. Return: ๋์ฒดํ ๋ ธ๋ |
.remove() | ํ์ฌ ์๋ฆฌ๋จผํธ๋ฅผ ์ญ์ . ์ญ์ ํ ์๋ฆฌ๋จผํธ์ ์ฐธ์กฐ๋ง ์์ผ๋ฉด ๋จ. |
insertBefore(newNode, childNode) | ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋
ธ๋๋ฅผ, ๋๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ๋
ธ๋์ ๋ฐ๋ก ์์ ์ฝ์
ํ๋ค. โ ๋จ, ๋๋ฒ์งธ ์ธ์๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ธ๋ ๊ฐ์ฒด์ ์์ ๋ ธ๋์ฌ์ผ ํ๋ค. โ ๋ง์ฝ ์์ ๋ ธ๋๊ฐ ์๋๋ผ๋ฉด DOMException ์๋ฌ๊ฐ ๋๋ฉฐ, ๋๋ฒ์งธ ์ธ์์ null์ ์ ๋ฌํ๋ฉด appendChild์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฅ ๋ง์ง๋ง ์์ ๋ ธ๋ ์์น๋ก ์ถ๊ฐ๋๋ค. |
cloneNode() | ํ์ฌ ๋
ธ๋๋ฅผ ๋ณต์ฌํด ๋ฐํํฉ๋๋ค. ํ๋ผ๋ฉํฐ๋ก true/false ๋ฅผ ์ธ์๋ก ๋ณด๋ผ ์ ์์ต๋๋ค. true ๋ฉด ๋ ธ๋๊ฐ ๋ด๊ณ ์๋ ํ ์คํธ ๋ฑ ์์ ํ๊ทธ ๋ด์ฉ๊น์ง ๋ณต์ฌ๋ฉ๋๋ค. false ๋ฉด ๋ ธ๋ ์ธํ๋ง ๋ณต์ฌํฉ๋๋ค. |
before() after() |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ์๋ โ ์์๋ฅผ ์ธ๋ถ๋ก ์ถ๊ฐํจ |
after(): ์ ํํ ๋
ธ๋์ ๋ค์ ์ถ๊ฐํจ. before(): ์ ํํ ๋ ธ๋์ ์์ ์ถ๊ฐํจ. โ ๋ฌธ์์ด, ์๋ฆฌ๋จผํธ(๋ ธ๋) ๊ฐ์ฒด ๋ชจ๋ ์ถ๊ฐ ์์๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๋ฌธ์์ด์ ์ธ์๋ก ๋ฃ์ ๊ฒฝ์ฐ ํ ์คํธ ๋ ธ๋๊ฐ ์ถ๊ฐ๋จ. ๋ฐํ๊ฐ์ด ์์(undefined ๋ฐํ) ๋๋จธ์ง ํ๋ผ๋ฉํฐ๋ก ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋์ ๋ฌธ์์ด์ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅ. |
prepend() append() |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฉ์๋ โ ์์๋ฅผ ๋ด๋ถ(์์)๋ก ์ถ๊ฐํจ |
prepend(): ํ์ฌ ์๋ฆฌ๋จผํธ์ ์ฒซ๋ฒ์งธ ์์ ์๋ฆฌ๋จผํธ ์์ ์ถ๊ฐํจ. append(): ํ์ฌ ์๋ฆฌ๋จผํธ์ ์์ ์๋ฆฌ๋จผํธ ์ค ๋ง์ง๋ง ์๋ฆฌ๋จผํธ ๋ค์ ์ถ๊ฐํจ. โ ๋ฌธ์์ด, ์๋ฆฌ๋จผํธ(๋ ธ๋) ๊ฐ์ฒด ๋ชจ๋ ์ถ๊ฐ ์์๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๋ฌธ์์ด์ ์ธ์๋ก ๋ฃ์ ๊ฒฝ์ฐ ํ ์คํธ ๋ ธ๋๊ฐ ์ถ๊ฐ๋จ. ๋ฐํ๊ฐ์ด ์์(undefined ๋ฐํ) ๋๋จธ์ง ํ๋ผ๋ฉํฐ๋ก ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋์ ๋ฌธ์์ด์ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅ. |
createTextNode(), createElement() ์ด์ฉํ ๋ ธ๋ ์์ฑ ๋ฐ ์ถ๊ฐ ๊ณผ์ ์ before()/after()/prepend()/append() 1๊ฐ์ ๋ฉ์๋๋ก ์ค์ฌ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋ ์ต์ ํ ๋ฐ ๊ฐ๋ ์ฑ ํฅ์์ ์ ๋ฆฌํฉ๋๋ค.
๊ฐ๊ธ์ before(), after() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด DOM ์ ์ ์ดํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.

HTML ๋ํ๋จผํธ ์์ฑ
// HTML ๋ํ๋จผํธ ์์ฑ
let newdoc = document.implementation.createHTMLDocument("HTML Document");
// div ํ๊ทธ ์์ ๋ด์ฉ์ ๋ง๋ค์ด ๋ฃ์.
let div = newdoc.createElement("div");
div.innerHTML = "<span>HTML ๋ฌธ์ ์ํ</span>";
newdoc.body.appendChild(div); // ๋ํ๋จผํธ ๋ฐ๋(body)์ ์์์ผ๋ก ๋ถ์
//HTML ๋ํ๋จผํธ๋ฅผ ๋ถ์ฌ๋ฃ์ ์์ดํ๋ ์ ์ฐธ์กฐ ์ป๊ธฐ
targetdoc = document.getElementById('newframe').contentDocument;
// ๋ถ์ฌ๋ฃ์ ์ ๋
ธ๋๋ฅผ ๋ณต์ฌํด์ด
let newnode = targetdoc.importNode(newdoc.documentElement, true);
// ์์ดํ๋ ์ ๋ํ๋จผํธ๋ฅผ ์ ๋
ธ๋๋ก ๋์ฒด
targetdoc.replaceChild(newnode, targetdoc.documentElement);
โ
์๋ฆฌ๋จผํธ ์์ฑ
let div = document.createElement('div'); //div ํ๊ทธ ์์ฑ
let span = document.createElement('span'); //span ํ๊ทธ ์์ฑ
span.textContent = 'HTML ๋ฌธ์ ์ํ'; //spanํ๊ทธ ์์ ํ
์คํธ ๋ฃ์
div.appendChild(span); // spanํ๊ทธ๋ฅผ div ์์์ผ๋ก์ ์์
document.body.appendChild(div); // divํ๊ทธ๋ฅผ body ์์์ผ๋ก์ ์์ -> ํ๊ทธ ์ถ๊ฐ
โ
์๋ฆฌ๋จผํธ ์ญ์
document.getElementById('delid').remove(); //์ ํํ ํ๊ทธ ์๊ธฐ์์ ์ญ์
let parent = document.getElementById('parentdiv');
let child = document.getElementById('childspan');
parent.removeChild(child); //๋ถ๋ชจ์์.removeChild(์์์์); ํ์์ผ๋ก ๋ถ๋ชจ ์์ ์๋ ์์ ์ญ์
โ
์๋ฆฌ๋จผํธ ์ฝ์ , ์ด๋
<!DOCTYPE html>
<html>
<head>
<title>Elemetnt Insert</title>
</head>
<body>
<ul id="friends">
<li class="animal">๋ผ์ด์ธ</li>
<li class="fruit">์ดํผ์น</li>
<li class="animal">ํ๋ก๋</li>
<li class="alien">์ฝ
<ul class="keyword">
<li>3์ธ</li>
<li>์๋ค๋ฆฌ</li>
<li>์ด๋ก๊ดด์</li>
</ul>
</li>
</ul>
<ul class="icons">
<li>
<span>์ค๋ชฐ</span>
<span>๋ฏธ๋์</span>
<span>๋น
</span>
</li>
</ul>
<ul id="newfriends">
</ul>
</body>
</html>

โ
/* javascript */
// ์ <li> ์๋ฆฌ๋จผํธ ์์ฑ
let li = document.createElement('li');
let litext = document.createTextNode('๋ฌด์ง');
li.appendChild(litext);
// ์ <li> ์๋ฆฌ๋จผํธ๋ฅผ ๋ถ์ผ ๋์ ๋ถ๋ชจ ์ ํ
let targetul = document.getElementById('friends');
targetul.appendChild(li); // friends ID๋ฅผ ๊ฐ์ง ul ์์๋ค ๋งจ๋์ ์๋ก ๋ง๋ <li> ํ๊ทธ๋ฅผ ๋ถ์.

//์ด๋ํ ์๋ฆฌ๋จผํธ ์ ํ
let sourceli = document.querySelector('ul#friends li:first-child');
//์ฝ์
ํ ์์น ๊ธฐ์ค ์๋ฆฌ๋จผํธ ์ ํ
let targetli = document.querySelector('ul#friends li:last-child');
//๋ถ์ฌ๋ฃ๋ ์์น์ ์ฃผ์ํด์ผ ํจ
//1๋์ค ul ๋ง์ง๋ง ์์๊ฐ ์๋๋ผ ์ค์ฒฉ๋ ๋ด๋ถ ul ๋์ ๋ถ๊ฒ๋จ.
targetli.after(sourceli);
// '๋ฌด์ง' ์์ ๋ถ์ ์ด์ ๋ '๋ฌด์ง'๋ ์คํฌ๋ฆฝํธ๋ก ์ถ๊ฐ๋๊ฑฐ๊ณ ์๋ doument์์๋ '์ด๋ก๊ดด์'๊ฐ ๋์ด๋๊น

//๋ฌธ์์ด์ ๊ฐ์ง๋ li ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํด ์์ ์๋ฆฌ๋จผํธ๋ก ๋ถ์
var appendli = document.createElement("li");
appendli.append("์๋์ด");
document.querySelector('ul li ul').append(appendli);

//๋ง์ง๋ง ์ฐจ์ผ๋ ์๋ฆฌ๋จผํธ ์ ํ
let selected = document.querySelector('.icons li span:last-child');
//์ถ๊ฐํ span ๋
ธ๋ ์์ฑ-
let newspan = document.createElement('span');
let newspantext = document.createTextNode('๋ผ์ง ');
newspan.appendChild(newspantext);
//๋ง์ง๋ง ์๋ฆฌ๋จผํธ ์์ ์ถ๊ฐ
selected.parentNode.insertBefore(newspan,selected);

//animal ํด๋์ค ์์ฑ์ ๊ฐ์ง li ์๋ฆฌ๋จผํธ๋ค์ ์ ํ
let items = document.querySelectorAll('.animal');
// ๋๋จธ์ง ํ๋ผ๋ฉํฐ๋ก newfriend ID ๋ฅผ ๊ฐ์ง๋ ์ ul ์ ์ ํํ ์๋ฆฌ๋จผํธ๋ค์ ์ถ๊ฐ
document.querySelector('#newfriends').prepend(...items);

โ
์๋ฆฌ๋จผํธ ๊ต์ฒด
์ ํํ ์๋ฆฌ๋จผํธ ์์ฒด๋ฅผ ์๋ก ์์ฑํ ์๋ฆฌ๋จผํธ, ๋๋ ์ ํํ ๋ค๋ฅธ ์๋ฆฌ๋จผํธ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
replaceChild() ๋ฉ์๋๋ ํ์ฌ ์๋ฆฌ๋จผํธ์ ํ์์ ์๋ ์์ ์๋ฆฌ๋จผํธ 1๊ฐ๋ฅผ ์ ์๋ฆฌ๋จผํธ๋ก ๊ต์ฒดํฉ๋๋ค.
let p = document.createElement('p'); // <p> ์๋ฆฌ๋จผํธ ์์ฑ
let ptext = document.createTextNode('๋ฌธ๋จ ํ
์คํธ ๋ด์ฉ'); // ๋ฌธ๋จ ๋ด์ฉ ํ
์คํธ ์์ฑ
p.appendChild(ptext); // ๋ฌธ๋จ ๋ด์ฉ์ <p>์ ํ
์คํธ ์ฑ์
let originalp = document.getElementById('paragraphid'); // ๊ต์ฒดํ ์๋ฆฌ๋จผํธ ์ ํ
let oldp = originalp.parentNode.replaceChild(p, originalp); // ๊ต์ฒดํ ์๋ฆฌ๋จผํธ์ ๋ถ๋ชจ ํ๊ทธ์์ ์์ ์๋ฆฌ๋จผํธ ๊ต์ฒด
DOM ์์ ์คํ์ผ ๋ณ๊ฒฝ
์ข์ ์ ์ดํด๋ณธ Element.prototype.style ๋ฐฉ์์ ์ค๋ฌด์์ ์ ๋๋ก ์๋ํ์ง ์์ ์ ์๋ค.
โ์ด ๋ฐฉ์์ ์ธ๋ผ์ธ ์คํ์ผ๋ง ๋ฐํํ๊ธฐ ๋๋ฌธ์ด๋ค.
โ์ค์ ๋ก๋ ์ธ๋ถ *.css ํ์ผ, ์ธ๋ถ *.js ํ์ผ, ๋ฏธ๋์ด์ฟผ๋ฆฌ, ์ด๋ฒคํธ, css ์ ์ฒ๋ฆฌ๊ธฐ ์ฌ์ฉ ๋ฑ, CSS ์คํ์ผ์ ์ธ๋ถ์์ ๋ณ๊ฒฝ์ ๊ฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
โ
์ด๋ window.getComputedStyle ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด, ํด๋น ์์์ ์ ์ญ์ ์ผ๋ก ์ ์ฉ๋ ๋ชจ๋ ํํ์ style์ ๋ฐํ ํ ์ ์๋ค.โ
๊ทธ๋ฆฌ๊ณ ์ด ๋ฉ์๋๋ ๋๋ฒ์งธ ์ธ์๋ฅผ ๊ฑฐ์ ์๋ตํ์ง๋ง, :after/:before ๊ฐ์ ์ ํ์๋ฅผ ์ ๋ฌํ๋ฉด, ๊ทธ์ ๋ํ ๊ฒ๋ ๋ชจ๋ ๋ณผ ์ ์๋ค.
window.getComputedStyle ๋ฉ์๋๋ ์ธ์๋ก ์ฃผ์ด์ง ์์์ ๋ชจ๋ CSS ํ๋กํผํฐ ๊ฐ์ ๋ฐํํ๋ค.
<html>
<head>
<style>
.box {
width: 100px;
height: 50px;
background-color: red;
border: 1px solid black;
}
</style>
</head>
<body>
<div class="box"></div>
<script>
const box = document.querySelector('.box');
const width = getStyle(box, 'width');
const height = getStyle(box, 'height');
const backgroundColor = getStyle(box, 'background-color');
const border = getStyle(box, 'border');
console.log('width: ' + width);
console.log('height: ' + height);
console.log('backgroundColor: ' + backgroundColor);
console.log('border: ' + border);
/*
* ์์์ ์ ์ฉ๋ CSS ํ๋กํผํฐ๋ฅผ ๋ฐํํ๋ค.
* @param {HTTPElement} elem - ๋์ ์์ ๋
ธ๋.
* @param {string} prop - ๋์ CSS ํ๋กํผํฐ.
* @returns {string} CSS ํ๋กํผํฐ์ ๊ฐ.
*/
function getStyle(elem, prop) {
return window.getComputedStyle(elem, null).getPropertyValue(prop);
}
</script>
</body>
</html>

# ์ฐธ๊ณ ์๋ฃ
http://tcpschool.com/javascript/js_dom_element
https://poiemaweb.com/js-dom
https://ko.javascript.info/modifying-document
https://oursmalljoy.com/js-dom/
https://blogpack.tistory.com/670
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.