DOM์ Document Object Model์ ์ฝ์๋ก, HTML(Document)์ ์ ๊ทผํ์ฌ Object(JavaScript Object)์ฒ๋ผ HTML์ ์กฐ์ํ ์ ์๋ Model์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฆ, ์น ํ์ด์ง์ ๋ํ ์ธํฐํ์ด์ค์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฌ ํ๋ก๊ทธ๋จ๋ค์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ฐ ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ ์คํ์ผ์ ์ฝ๊ณ ์กฐ์ํ ์ ์๋๋ก API๋ฅผ ์ ๊ณตํ๋ค.
Document ๊ฐ์ฒด
document
๊ฐ์ฒด๋ ์ฐ๋ฆฌ๊ฐ ์น์ฌ์ดํธ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋ ๋ง์ ํ๋กํผํฐ(properties) ์ ๋ฉ์๋(methods)๋ฅผ ๊ฐ์ง ์ค๋ธ์ ํธ์ด๋ค.
์ฆ, document
๋ ํ์ด์ง์ URL์ ์ป๊ฑฐ๋ ๋ฌธ์์ ์๋ก์ด ์์๋ฅผ ์์ฑํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ์ญ์ ์ผ๋ก ์ ๊ณตํ๋ค.
DOM์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์๋์ง๋ง DOM์ด ์๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด๋ ์น ํ์ด์ง ๋๋ XML ํ์ด์ง ๋ฐ ์์๋ค๊ณผ ๊ด๋ จ๋ ๋ชจ๋ธ์ด๋ ๊ฐ๋ ๋ค์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ๋ชปํ๊ฒ ๋๋ค.
ํ์ด์ง ์ฝํ ์ธ (the page content)๋ DOM์ ์ ์ฅ๋๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ ๊ทผํ๊ฑฐ๋ ์กฐ์ํ ์ ์๋ค.
API (web or XML page) = DOM + JS
DOM์ ์ด๋ป๊ฒ ์์ ํด์ผ ํ๋์ง ์ดํดํ๊ธฐ ์ํด, ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค๋ธ์ ํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด ์ดํดํ๋ ๊ฒ์ ํ์์ ์ด๋ค.
DOM์ด ์๋ ๊ฒ
1. DOM์ HTML์ด ์๋๋ค.
DOM์ HTML ๋ฌธ์๋ก๋ถํฐ ์์ฑ๋์ง๋ง ํญ์ ๋์ผํ์ง ์๋ค.
2. DOM์ ๋ธ๋ผ์ฐ์ ์์ ๋ณด์ด๋ ๊ฒ์ด ์๋๋ค.
๋ธ๋ผ์ฐ์ ๋ทฐ ํฌํธ์ ๋ณด์ด๋ ๊ฒ์ ๋ ๋ ํธ๋ฆฌ๋ก DOM๊ณผ CSSOM์ ์กฐํฉ์ด๋ค. ๋ ๋ ํธ๋ฆฌ๋ ์ค์ง ์คํฌ๋ฆฐ์
๊ทธ๋ ค์ง๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด DOM๊ณผ ๋ค๋ฅด๋ค.
์ฆ, ๋ ๋๋ง ๋๋ ์์๋ง์ด ๊ด๋ จ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ ์ผ๋ก ๋ณด์ด์ง ์๋ ์์๋ ์ ์ธ๋๋ค.
์๋ฅผ ๋ค์ด, display: none
์คํ์ผ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ ์์์ด๋ค.
DOM ์ XML์ด๋ HTML ๋ฌธ์์ ์ ๊ทผํ๊ธฐ ์ํ ์ผ์ข ์ ์ธํฐํ์ด์ค์ด๋ค. ๋ฌธ์ ๋ด์ ๋ชจ๋ ์์๋ฅผ ์ ์ํ๊ณ , ๊ฐ๊ฐ์ ์์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ??
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ฌํ ๊ฐ์ฒด ๋ชจ๋ธ์ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋ก์ด HTML ์์๋ ์์ฑ์ ์ถ๊ฐํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์กด์ฌํ๋ HTML ์์๋ ์์ฑ์ ์ ๊ฑฐํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ HTML ๋ฌธ์์ ๋ชจ๋ HTML ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ HTML ๋ฌธ์์ ๋ชจ๋ HTML ์์ฑ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ HTML ๋ฌธ์์ ๋ชจ๋ CSS ์คํ์ผ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ HTML ๋ฌธ์์ ์๋ก์ด HTML ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ HTML ๋ฌธ์์ ๋ชจ๋ HTML ์ด๋ฒคํธ์ ๋ฐ์ํ ์ ์๋ค.
//Syntax
document.createDocumentFragment();
DocumentFragment ๋ ๋น DocumentFragment ๊ฐ์ฒด๋ฅผ ๋ํ๋ธ๋ค.
DocumentFragment ํ์ ์ ๋งํฌ์ ์ ํํ๋์ง ์๋ ์ ์ผํ ๋ ธ๋ ํ์ ์ด๋ค. DocumentFragment ๋ ธ๋๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ฉด
๋ผ์ด๋ธ DOM ํธ๋ฆฌ ์ธ๋ถ์ ๊ฒฝ๋ํ๋ ๋ฌธ์ DOM์ ๋ง๋ค ์ ์๋ค. ๋ฉ๋ชจ๋ฆฌ์์์๋ง ์กด์ฌํ๋ ๋น ๋ฌธ์ ํ ํ๋ฆฟ๊ฐ์
DocumentFragment์ ์์๋ ธ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์์ ์์ฝ๊ฒ ์กฐ์ํ ํ, ๋ผ์ด๋ธ DOM์ ์ถ๊ฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
ํน์ง
const div = document.createElement("div");
const text = document.createTextNode("ํ
์คํธ");
const fragment = document.creatDocumentFragment();
div.appendChild(text);
fragment.appendChild(div);
document.body.appendChild(fragment);
div์ text๋ฅผ ๋ด๊ณ , ๊ทธ๊ฒ์ fragment์ ๋ด์ ํ ์ต์ข ์ ์ผ๋ก body์๋ fragment๋ฅผ ๋ด์๋ค. ์ง์ ์ ์ผ๋ก body์ ์ํฅ์ ์ฃผ๋ ๊ฒ์ fragment๋ฅผ ์ถ๊ฐํ ๋, ๋จ ํ ๋ฒ ์์๋ค.
๋ง์ฝ appendChild ๋ฅผ ๋ง์ด ์กฐ์ํด์ผํ ๊ฒฝ์ฐ, fragment์ ๋ด๊ณ ๋ง์ง๋ง์ fragment๋ฅผ body์ append ํด์ค๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ถ๋ชจ์ ๋ง์ง๋ง ์์์ผ๋ก ์ถ๊ฐํ๊ธฐ ์ํด appendChild()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ถ๋ชจ์ ์ฒซ๋ฒ์งธ ์์์ผ๋ก ์ถ๊ฐ๋ ์ด๋ป๊ฒ ํด์ผํ ๊น??
insertBefore() ์ firstChild๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
//html
<ul class="parent">
<li class="newEl">์์</li>
<li class="El">button</li>
<li class="El">button</li>
<li class="El">button</li>
</ul>;
//js
let El = document.querySelector(".newEl");
let parent = document.querySelector(".parent");
parent.insertBefore(El, null); //๋งจ ๋์ ์ฝ์
parent.insertBefore(El, parent.firstChild); //๋งจ ์์ ์ฝ์
HTML template ์์๋ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์จ ์๊ฐ ์ฆ์ ํ๋ฉด์ ๋์ค์ง๋ ์์ง๋ง, ์ดํ Javascript๋ฅผ ์ฌ์ฉํด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ HTML ์ฝ๋์ด๋ค.
์ฆ, template ์์ ๋ด์ ์ฝํ ์ธ ๋ ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ์ฆ์ ๋ ๋๋ง๋์ง ์์ผ๋ฉฐ, ๋ฐ๋ผ์ ์ฌ์ฉ์์๊ฒ๋ ๋ณด์ด์ง ์๋๋ค.
ํ์ง๋ง ๋์ค์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ, ํด๋น ์ฝํ ์ธ ๋ฅผ ๋ณต์ ํ ํ ๋ณด์ด๋๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
//html
<template>
<h3>์ฝ๋์คํ
์ด์ธ </h3>
<img src="/examples/images/img_codestates.png" alt="์ฝ๋์คํ
์ด์ธ ">
</template>
//js
const t = document.querySelector("template");
nodes: DOM API์์ ์กด์ฌํ๋ ๋ชจ๋ ๊ฒ๋ค. ๊ทธ๊ฒ๋ค์ ๋ชจ๋ ํฌ๊ดํ๋ ์ด๋ฆ์ด node์ด๋ค.
Node์ ๋ฐ์ Element๊ฐ ์๊ณ
element: one specific type of node. ์๋ฅผ ๋ค์ด div, body, window ๊ฐ์ ํน์ ํ ํ์ .
๋ชจ๋ element๋ HTMLElement์ ์์์ด๋ค. ๋ฐ๋ผ์, HTMLElement์ property๋ฅผ ๋๊ฐ์ด ๊ฐ์ง๊ณ ์๋ค. ๋์์, element์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ์ ์์ ๋ง์ property๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋ฐ๋ก ๋ถ๋ชจ ์์๊ฐ ํ์์์. remove()๋ ๋ ธ๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํ๊ณ ์ข ๋ฃํ๋ค.
๋ ธ๋๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด ์๋๋ค.
๋ฉ๋ชจ๋ฆฌ์ ํด๋น ๋ ธ๋๋ ๊ทธ๋๋ก ์กด์ฌํ๋ฉฐ, ๋ถ๋ชจ ๋ ธ๋์์ ๋ถ๋ชจ-์์๊ด๊ณ๋ฅผ ๋์ด DOM ํธ๋ฆฌ์์ ํด์ ํ๋ ๊ฒ์ด๋ค.
์ต์ข ์ ์ผ๋ก๋ ๊ด๊ณ๋ฅผ ๋์ ํด๋น ๋ ธ๋์ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ค.
๋ฐํ๊ฐ์ ๋ณ์์ ์ ์ฅํ์ง ์์ผ๋ฉด ์ญ์ ํ๋ ๋ ธ๋์ ์ฐธ์กฐ๊ฐ ๋์ด์ ์๊ธฐ ๋๋ฌธ์, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ GC(Garbage Collection)์ ์ํด ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ๋๋ค.
๋ฐํ๋ ๋ ธ๋ ์ฐธ์กฐ๋ฅผ ๋ณ์์ ๋ด์ ๋ค๋ฅธ DOM ์์น์ ๋ถ์ผ ์ ์๋ค.
let id = document.querySelector("#id");
let rm = id.parentNode.removeChild(id);
document.body.prepend(rm);
์ด๋ฐ์์ผ๋ก ์ญ์ ํ ๋ ธ๋์ ๋ฐํ๊ฐ์ ๋ค๋ฅธ ๋ ธ๋์ ๋ถ์ฌ์ ๋ ธ๋์ ์์น๋ฅผ ์ด๋ํ๋ ์์ ์๋ ์ฌ์ฉํ ์ ์๋ค.
๋ ธ๋๋ฅผ ์ญ์ ํ๋ฉด ์ญ์ ํ๋ ๋ ธ๋ ํ์์ ์๋ ์์ ๋ ธ๋๋ค๋ ๋ชจ๋ ์ญ์ ๋๋ค.
๋ ธ๋๋ค์ ๋ถ๋ชจ/์์ ๊ด๊ณ๋ก ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์ญ์ ๋๋ฉด, ์์ ๋ ธ๋๋ ์๋์ผ๋ก ์ญ์ ๋๋ค.
.prepend()๋ ์ ํํ ์์์ ๋ด์ฉ์ ์์ ์ฝํ ํธ๋ฅผ ์ถ๊ฐํ๋ค.
Syntax $(target).prepend(source)
์์
<ol id="list">
<li>์ฒซ ๋ฒ์งธ ์์ดํ
</li>
<li>๋ ๋ฒ์งธ ์์ดํ
</li>
</ol>
$(#"list").prepend("<li>์๋ก ์ถ๊ฐ ๋ ์์ดํ
</li>")
//after
<ol id="list">
<li>์๋ก ์ถ๊ฐ ๋ ์์ดํ
</li>
<li>์ฒซ ๋ฒ์งธ ์์ดํ
</li>
<li>๋ ๋ฒ์งธ ์์ดํ
</li>
</ol>
NodeList๋?
element.childNodes ํ๋กํผํฐ๋ document.querySelectorAll ๋ฉ์๋๋ก ๋ฐํ๋๋ ๋ ธ๋์ ๋ชจ์์ด๋ค.
NodeList๋ ์ ์ฌ ๋ฐฐ์ด์ธ๋ฐ, forEach ๋ฉ์๋๋ ๊ฐ์ง๊ณ ์๋ค.
ํ์ง๋ง map, filter,reduce ๋ฑ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐฐ์ด๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ๋ฐฐ์ด๋ก ๋ฐ๊พธ์ด์ค ์ ์์๊น?? ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ดํด๋ฅผ ํด๋ณด์.
const div = document.querySelectorAll("div");
const array = Array.prototype.slice.call(div);
//๋๋
const nodelist = document.querySelectorAll(".divy");
const divyArray = Array.from(nodelist);
//๋๋
const divyArray = [...document.querySelectorAll(".divy")];
์ด๋ฐ์์ผ๋ก nodelist๋ค์ ๋ฐฐ์ด๋ก ๋ณํ์ํค๋ฉด forEach() ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค!!
๐ ๋ด์ผ์ TIW(today I Will)
์ ํจ์ฑ ๊ฒ์ฌ, ํธ์ํ๋ฌ ํจ์