๐ก ์ด ํฌ์คํ ์ DOM์ ๋ํด ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ํน์ฌ๋ ์ผ๋ถ ์ฌ๋ฐ๋ฅด์ง ์์ ์ ๋ณด๊ฐ ์์ ์์ ์ง์ ํด์ฃผ์๋ฉด ์ ์ ํ ๋กํ๊ฒ ์ต๋๋ค.
DOM์ ๋ํ ์ดํด์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถํ๊ณ , ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์ ์ํฉ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๊ฝ๐ป์ธ DOM์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
DOM์ ๊ตฌ์กฐ์ ์ ๊ทผ๋ฐฉ๋ฒ(๋ฉ์๋)์ ๋ํด ์ ๋ฆฌํ๊ณ . DOM๊ณผ ๊ด๋ จ๋ ๊ฐ๋จํ ์์ด๋์ด๊ฐ ๋ ์ฌ๋ผ ํ๋ก์ ํธ๋ฅผ ์ ์ํด๋ณด๊ณ ์ํ๋ค.
์ด๋ฏธ์ง ์ถ์ฒ - ๋ชจ๋ javaScript ํํ ๋ฆฌ์ผ
๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(The Document Object Model, ์ดํ DOM) ์ HTML, XML ๋ฌธ์์ ํ๋ก๊ทธ๋๋ฐ interface ์ด๋ค. DOM์ ๋ฌธ์์ ๊ตฌ์กฐํ๋ ํํ(structured representation)์ ์ ๊ณตํ๋ฉฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ DOM ๊ตฌ์กฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๊ทธ๋ค์ด ๋ฌธ์ ๊ตฌ์กฐ, ์คํ์ผ, ๋ด์ฉ ๋ฑ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋๋ค. DOM ์ nodes์ objects๋ก ๋ฌธ์๋ฅผ ํํํ๋ค.
- mdn web docs
์ ์ ์์ ๋์์๋ DOM ๊ตฌ์กฐ์ ์ ๊ทผํ๊ณ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋๋ก ๋๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
๋ javaScript
๋ผ๊ณ ํ ์ ์๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ธ HTML ๋ฌธ์๋ฅผ ๋ง๋ค์ด๋ณด์.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Basic HTML</title>
</head>
<body>
<div id="root">Helloo</div>
</body>
</html>
์ HTML์ ๊ตฌ์กฐํ๋ ํํ์ ์ ๊ณตํ๋ ๊ฒ์ด DOM์ด๋ค.
javascript๋ฅผ ์ฌ์ฉํ๋ฉด ์ HTML์ ๊ตฌ์กฐ์ ์ ๊ทผํ์ฌ ๋ด์ฉ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์คํ์ผ์ ์์ ํ ์ ์๋ ๊ฒ์ด๋ค.
console.log, dir๋ก ๊ฐ๊ฐ document.body
๋ฅผ ์ฐ์ด๋ณด๋ฉด
์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
HTML๊ณผ javaScript๋ฅผ ๊ฐ์ง๊ณ ์ฃผ์ด์ง ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด DOM์ ์กฐ์ํ์ฌ ์น ์๋น์ค๋ฅผ interactiveํ๊ฒ ์ ์ํ ์ ์๋ ๊ฒ์ด๋ค.
DOM์ ์กฐ์ํ๋ ๊ณผ์ ์์ DOM ๋ ๋๋ง ์์์ ๋ํ ์ดํด๋๊ฐ ๋ถ์กฑํ๋ฉด ๋ถ๋ช ํ ๋ง์ ์ค๋ฅ๋ฅผ ๋ง๋ฑ ๋จ๋ฆฌ๊ฒ ๋ ๊ฒ์ด๋ค.
ํ์๋ ๋ง์ฐฌ๊ฐ์ง์ธ ์ํฉ
DOM์ผ๋ก์ ๋ค์ํ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ๊ณ ํ์ฉํ๋ ์๊ฐ์ ๊ฐ๋๋ค.
์ง๊ธ ์๋ํ๊ณ ์๋ ์น ํ์ด์ง๋ document
๋ผ๋ ํ๋กํผํฐ๋ก ๋ถ๋ฌ์ฌ ์ ์๋ค.
HTML === document
๊ทธ๋ฌ๋, document
๋ผ๋ ํ๋กํผํฐ๋ ์์ผ๋ก DOM์ ์กฐ์ํ ๋ ๋ฌด์กฐ๊ฑด ์ฐ์ผ ๊ฒ์ด๋ค.
DOM Tree์ ์๋จ ๋ ธ๋๋ ์๋์ ๊ฐ์ด ๊ฐ์ ธ์ฌ ์ ์๋ค. (๋น์ฐํ ์๋จ ๋ ธ๋ ๋ฟ๋ง ์๋๋ผ ํ์ ๋ ธ๋๊น์ง ๋ค ๊ฐ์ ธ์จ๋ค.)
<html>
: document.documentElement
<body>
: document.body
<head>
: document.head
child๋ ์์์ด๋ผ๋ ๋ป์ด๋ค. ๊ณ ๋ก ๋ด๊ฐ ์ ํํ Node์ ์์ ์์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
childNodes
: ๋ด๊ฐ ์ ํํ ๋
ธ๋ ๋ค์ *.childNodes ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์์ ๋
ธ๋๋ฅผ ํ์ธํ ์ ์๋ค. (๋ฐฐ์ด์ด ์๋ ์ดํฐ๋ฌ๋ธํ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ธ ์ปฌ๋ ์
์ผ๋ก ๋ฐํ๋๋ค.)firstChild
: ๋ด๊ฐ ์ ํํ ๋
ธ๋์ ์ฒซ ๋ฒ์งธ ์์ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.lastChild
: ๋ด๊ฐ ์ ํํ ๋
ธ๋์ ๋ง์ง๋ง ๋ฒ์งธ ์์ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.sibling์ ํ์ /์๋งค๋ผ๋ ๋ป์ด๋ค. ๊ฐ์ indentation์ ๊ฐ๋ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. (์ด๋ฏธ์ง ์ฌ๋ผ์ด๋ ๋ฑ์ ์์ฃผ ์ฐ์.)
nextSibling
: ๋ค์ ํ์ ์ธ ๋
ธ๋๋ฅผ ๋ฐํํ๋ค.(์๋์ชฝ ๋
ธ๋)previousSibling
: ์ด์ ํ์ ์ธ ๋
ธ๋๋ฅผ ๋ฐํํ๋ค.(์์ชฝ ๋
ธ๋)parent๋ ๋ถ๋ชจ๋ค. ํด๋น ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
parentNode
: ๋ด๊ฐ ์ ํํ ๋
ธ๋์ ์ง๊ณ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.์์ ์์ ํ์ ๋ถ๋ชจ ์ฒ๋ผ ๊ทผ์ฒ์๋ง ์๋ ๋ ธ๋๋ง ํ์ํ ์ ์์๋ค๋ฉด, DOM ์กฐ์์ด ๊ต์ฅํ ๋ถํธํ๊ณ ๊น๋ค๋ก์ ์ ๊ฒ์ด๋ค.
DOM ์กฐ์์ ๊ฝ์ด๋ค.
Tag, Id, ํ๋๋ง ์ฐพ๊ธฐ ์ ๋ถ ์ฐพ๊ธฐ ๋ฑ๋ฑ ๋ง์ด ์์ง๋ง. ์์ฃผ ์ฐ์ด๋ ๋ฉ์๋๋ง ์ ๋ฆฌํ๊ฒ ๋ค.
getElementById
: ํด๋น ์์ด๋๋ก ์ง์ ํ tag๋ฅผ ๊ฐ์ ธ์จ๋ค.querySelector
: CSS Selector๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋์ด๋ค. ์ ํ๋ tag๋ฅผ ๊ฐ์ ธ์จ๋ค. (๊ฐ์ฅ ๋ง์ด์ฐ์ด๋ ๋ฏ ํ๋ค.)querySelectorAll
: CSS Selector๋ก ์ ํ๋ ๋ชจ๋ tag๋ค์ ๊ฐ์ ธ์จ๋ค.node์ Type์ด๋ Name์ผ๋ก ๊ฐ์ ธ์จ Node์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
nodeType
: ์์๋
ธ๋, ์ฃผ์๋
ธ๋ ๋ฑ๋ฑ ๋
ธ๋์ ํ์
์ ์๋ ค์ค๋ค.nodeName
: ๋
ธ๋์ ์ด๋ฆ์ ์๋ ค์ค๋ค. ex) DIV, UL ..node์ HTML์์๋ฅผ ์ฝ์ด์ ๋ฐํํ๋ค.
<span class="text">Hi..</span>
์ ์์ ๋ฅผ ๊ฐ์ ธ์ ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด,
innerHTML
: Hi.. (์์ชฝ HTML์ ์ถ๋ ฅํ๋ค.)outerHTML
: <span class="text">Hi..</span>
(๋ฐ๊นฅ์ชฝ HTML๊น์ง ์ถ๋ ฅํ๋ค.)์์๋ฅผ ๋ง๋๋ ๋ฉ์๋
createElement
: div, ul ๋ฑ๋ฑ ํ์ํ ํ๊ทธ๋ฅผ ๋์ ์ผ๋ก ๋ง๋ค ์ ์๋ค.createTextNode
: text node๋ฅผ ๋ง๋ค ์ ์๋ค.DOM์ ์ ๊ทผํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ํ์ฉํ์ฌ ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์ ์ํ ๊ฒ์ด๋ค.
DOM์ ๋ํด ๊ณต๋ถํ๋ฉด์ ๋ค์ํ ๋ฉ์๋๋ค์ด ์๋ค๋ ๊ฒ์ ์์๋ค. (๋ชจ๋ฅด๋ฉด ์์ฐ๊ฒ ๋๋๋ผ..)
ํญ์ ๊ณต๋ถํ ๊ฒ๋ค์ ์ ๋ฆฌํ๊ณ ๊ธฐ๋กํด ๋๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ๊ณผ๊ฑฐ์ ๊ทธ๋ ๊ฒ ๊ณต๋ถํ๋ ๊ฒ๋ค์ด ์ฌ์ค ๋จธ๋ฆฌ ์์ ์ ํํ ๋ฐํ์ง๋ ์์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์, ๊ณต๋ถํ ๊ฒ๋ค ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋จํ๊ฒ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด์ ๊ฒช์ ์ํ์ฐฉ์ค๋ฅผ ๊ธฐ๋กํด ๋๋ ค๊ณ ํ๋ค.
์ด๋ฒ์ ๋ง๋ค ์๋น์ค๋ DOM Tree maker๋ผ๋ ์ด๋ฆ๋ง ๊ฑฐ์ฐฝํ ๋ณ๋ก ์ธ๋ชจ์๋ ํ๋ก์ ํธ์ด๋ค.
๊ธฐ๋ฅ ๊ตฌํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ์ฉ์์๊ฒ ์ ๋ ฅ๋ฐ๋ ๋ฌธ์์ด(String)์ HTML ํ์ฑํ๋ ๋ถ๋ถ์ด ๋ฌธ์ ์๋ค.
DOMParser ๋ผ๋ Web API๋ฅผ ์ฌ์ฉํ์ฌ string์ HTML๋ก ์ฝ๊ฒ ๋ณํํ ์ ์๋ค.(json->obj ๋ณํํ๋๊ฑฐ๋ ๋น์ทํ๋ค.)
const transformStrToHTML = (str) => {
const parser = new DOMParser();
const doc = parser.parseFromString(str, 'text/html');
return doc;
};
DOM Tree๋ฅผ ๊ทธ๋ฆด๋ 1์ต๊ฐ์ ์์์ ๊ฐ๋ ๋ ธ๋๋ฅผ ๋ง๋๋ฉด ๋ชจ๋ ์ถ๋ ฅํ ์ ์๊ฒ๋ ๋ก์ง์ ์ง์ผํ๋ค.
์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ๊ตฌํํ๋ค.
๋ด๊ฐ Tree๋ฅผ ๊ตฌ์กฐํํ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
// searchNode function
const searchNode = (nodes) => {
const ol = document.createElement("ol");
for (let i = 0; i < nodes.length; i++) {
const li = document.createElement("li");
const text = document.createTextNode(
"NODE NAME: " + nodes[i].nodeName
);
li.appendChild(text);
ol.appendChild(li);
if (nodes[i].hasChildNodes()) {
ol.append(searchNode(nodes[i].childNodes));
}
}
return ol;
};
querySelector๋ getElementById๋ก ๊ฐ์ ธ์ฌ ๋
innerHTML์ ์ฌ์ฉํ๊ฑฐ๋ ๊ทธ๋ฅ Object๋ฅผ Output์ ๋ฟ๋ ค์ฃผ๋ฉด ๊ฐ์ด ์ ๋๋ก ์ถ๋ ฅ๋์ง ์์๋ค.
outerHTML
์ ์ฌ์ฉํด์ ์ ํ๋ ์์๋ฅผ ๋ฌธ์์ด๋ก ์ถ๋ ฅํด์ฃผ์๋ค.
const printQuerySelector = (str) => {
if (str === "") {
alert("HTML์ ์
๋ ฅํด์ฃผ์ธ์~");
return;
}
const doc = transformStrToHTML(str);
const inputQuery = document.querySelector(".selector");
const $result = document.querySelector(".result");
resetResult($result);
if (!inputQuery.value) {
alert("CSS Selector๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.");
return;
}
const text = document.createTextNode(doc.querySelector(inputQuery.value).outerHTML);
$result.appendChild(text);
};
์ ํ์ตํ ์ ๋ณด๋ค๋ก ๋ง๋ค์ด๋ธ DOM tree maker project
์ ๋ด์ฉ๋ค์ ๋ฐํ์ผ๋ก ์์ฑ๋ ํ๋ก์ ํธ์ด๋ค. (Project ๋ฌธ์์ ์น ์๋น์ค ๋งํฌ๊ฐ ์๋ค.)
๋ง์ ์งํ์ ํผ๋๋ฐฑ์ ๋ฐ๊ณ ์ถ๋ค..