Search
Duplicate

DOM

์ƒ์„ฑ์ผ
2023/02/25 06:26
ํƒœ๊ทธ
WEB

DOM (Document Object Model)

DOM์€ XML์ด๋‚˜ HTML ๋ฌธ์„œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ผ์ข…์˜ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.
๋ฌธ์„œ์˜ ๊ตฌ์กฐํ™”๋œ ํ‘œํ˜„์„ ์ œ๊ณตํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋‚˜ DOM ๊ตฌ์กฐ์— ์ ‘๊ทผํ•ด ๋ฌธ์„œ์˜ ์ปจํ…์ธ  ๋ฐ ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ€์ผ์„ ์ฝ๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
์ฆ‰, ์ด๋ฅผ ํ†ตํ•ด ์›นํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ฒŒ ์—ฐ๊ฒฐ ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์ด๋‹ค.

์›น ํŽ˜์ด์ง€ ๋งŒ๋“œ๋Š” ๊ณผ์ •

โ€ข
๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ์–ด๋–ค ๋‚ด์šฉ์„ ํŽ˜์ด์ง€์— ๋ Œ๋”๋งํ• ์ง€ ๊ฒฐ์ • โ†’ ๋ Œํ„ฐ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
โ—ฆ
๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด DOM ์ด ํ•„์š”ํ•˜๋‹ค
โ€ข
๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋ง ์ˆ˜ํ–‰
ํŒŒ์‹ฑ์ด๋ž€? ํ…์ŠคํŠธ ๋ฌธ์ž์˜ ๋ฌธ์ž์—ด์„ ํ† ํฐ์œผ๋กœ ๋ถ„ํ•ดํ•˜๊ณ , ๋ฌธ๋ฒ•์  ์˜๋ฏธ์™€ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•ด์„œ Parse Tree๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • ํ† ํฐ์ด๋ž€? ๋ฌธ๋ฒ•์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์ตœ์†Œ ๋‹จ์œ„ ๋ Œ๋”๋ง์ด๋ž€? HTML , CSS ๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์‹œ๊ฐ์ ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ

DOM์˜ ๊ตฌ์กฐ

โ€ข
DOM์˜ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋‹จ์ˆœ ํ…์ŠคํŠธ๋กœ ๊ตฌ์„ฑ๋œ HTML ๋ฌธ์„œ์˜ ๋‚ด์šฉ๊ณผ ๊ตฌ์กฐ๊ฐ€ ๊ฐ์ฒด ๋ชจ๋ธ๋กœ ๋ณ€ํ™˜๋˜์–ด ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
โ€ข
DOM์˜ ๊ฐœ์ฒด ๊ตฌ์กฐ๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ํ‘œํ˜„๋œ๋‹ค,
โ€ข
<HTML> ์€ ๋ฃจํŠธ, ๊ทธ ์•ˆ์˜ Tag ๋“ค์œผ ์ž์‹, ํƒœ๊ทธ ์•ˆ์˜ ์ปจํ…์ธ ๋Š” ์žŽ์— ํ•ด๋‹นํ•œ๋‹ค.
โ€ข
์ด๋ฅผ ํ†ตํ•ด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ™์€ ์–ธ์–ด๋ฅผ ์ด์šฉํ•ด์„œ DOM์— ์ ‘๊ทผํ•ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

DOM์˜ ๊ตฌ์„ฑ์š”์†Œ

โ€ข
document node (๋ฌธ์„œ ๋…ธ๋“œ)
โ—ฆ
DOM ํŠธ๋ฆฌ์—์„œ ์ตœ์ƒ์œ„ ๋ฃจํŠธ ๋…ธ๋“œ์ด๊ณ , document ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
โ—ฆ
window.document , document ๋กœ ์ฐธ์กฐํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ—ฆ
HTML ๋ฌธ์„œ์— 1๊ฐœ๋งŒ ์กด์žฌ
โ€ข
element node (์š”์†Œ ๋…ธ๋“œ)
โ—ฆ
๋ชจ๋“  ํƒœ๊ทธ๋“ค์ด ์š”์†Œ ๋…ธ๋“œ์ด๋‹ค.
โ—ฆ
์†์„ฑ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์œ ์ผ ๋…ธ๋“œ
โ€ข
attribute node (์†์„ฑ ๋…ธ๋“œ)
โ—ฆ
element node์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
โ—ฆ
๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
โ€ข
text node (ํ…์ŠคํŠธ ๋…ธ๋“œ)
โ—ฆ
์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋…ธ๋“œ (๋ฆฌํ”„๋…ธ๋“œ๋ผ๊ณ ๋„ ํ•œ๋‹ค)

DOM๊ณผ HTML์ด ๊ฐ™์„๊นŒ?

Nope!

์ฐจ์ด์ 

โ€ข
ํ•ญ์ƒ ์œ ํšจํ•œ HTML ํ˜•์‹์ด๋‹ค.
โ€ข
javascript ๋กœ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋Š” ๋™์  ๋ชจ๋ธ์ด๋‹ค.
โ€ข
๊ฐ€์ƒ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค
โ€ข
๋ณด์ด์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ ํฌํ•จํ•œ๋‹ค
*๊ฐ€์ƒ ์š”์†Œ๋ž€ ์„ ํƒํ•œ ์š”์†Œ์˜ ์ผ๋ถ€์—๋งŒ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ::before, ::after ์„ ๋งํ•œ๋‹ค.
*display: none ์†์„ฑ์˜ ์š”์†Œ๋Š” DOM์— ํฌํ•จ๋˜์ง€ ์•Š๊ณ , visibility: hidden ์†์„ฑ์˜ ์š”์†Œ๋Š” ๋ณด์ด์ง€ ์•Š์ง€๋งŒ DOM์—๋Š” ํฌํ•จ๋œ๋‹ค.

DOM์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

โ€ข
๋‹จ์ˆ˜ ๊ฐ์ฒด ์ ‘๊ทผ : getElementByxx(), querySelector() ์‚ฌ์šฉ
โ€ข
๋ณต์ˆ˜ ๊ฐ์ฒด ์ ‘๊ทผ : getElements(), querySelectorAll() ์‚ฌ์šฉ
1๊ฐœ์˜ DOM ์š”์†Œ๋Š” Tagname, ID, Classname, CSSSelector ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
// TagName์œผ๋กœ ์ฐพ๊ธฐ document.getElementsByTagName('input') // ID๋กœ ์ฐพ๊ธฐ document.getElementsById('search') // ClassName์œผ๋กœ ์ฐพ๊ธฐ document.getElementsByClassName('search-input-style') // CSSSeletor๋กœ ์ฐพ๊ธฐ document.querySelector('.search-input-style')
JavaScript
๋ณต์‚ฌ

์ฃผ์š” DataTypes

document
member*๊ฐ€ document type์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•  ๋•Œ, ์ด ๊ฐ์ฒด๋Š” root document object ์ž์ฒด์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `document.getElementById("myP").ownerDocument` ๋Š” ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ*๊ฐ€ ์†ํ•ด ์žˆ๋Š” document๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
element
element๋Š” DOM API์˜ member์— ์˜ํ•ด ๋ฆฌํ„ด๋œ element ๋˜๋Š” element type์˜ node๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, `document.createElement()` ๋ฉ”์†Œ๋“œ*๊ฐ€ DOM์•ˆ์—์„œ ์ƒ์„ฑ๋˜๋Š” element๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
nodeList
nodeList๋Š” element์˜ ๋ฐฐ์—ด์ด๋‹ค. `document.getElementsByTagName()`์˜ ๋ฆฌํ„ด๊ฐ’๋„ nodeList ํ˜•ํƒœ์ด๋‹ค. nodeList์˜ item์€ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
attribute
attribute๊ฐ€ member์— ์˜ํ•ด ๋ฆฌํ„ด๋˜๋Š” ๊ฒƒ์€ attribute์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋…ธ์ถœํ•˜๋Š” Object reference์ด๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด attribute๋Š” element์™€ ๊ฐ™์€ ๋…ธ๋“œ์ด๋‹ค. `createAttribute()`๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑ
namedNodeMap
nameNodeMap์€ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๊ฐ item์€ name์ด๋‚˜ ์ธ๋ฑ์Šค์— ์˜ํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. nameNodeMap์€ item() ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๊ณ , item์„ ์ถ”๊ฐ€/์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
*๋ฉค๋ฒ„(member)๋Š” ํ”„๋กœํผํ‹ฐ ํ˜น์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งํ•œ๋‹ค.
*ํ”„๋กœํผํ‹ฐ(property)๋Š” DOM ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ด๊ณ , HTML ํƒœ๊ทธ์˜ ์†์„ฑ์„ ๋ฐ˜์˜ํ•œ๋‹ค.
*๋ฉ”์†Œ๋“œ๋ž€ DOM ๊ฐ์ฒด๊ฐ€ ๊ฐ–๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ, HTML ํƒœ๊ทธ๋ฅผ ์ œ์–ดํ•œ๋‹ค.
window.document ์™€ node.ownerDocument ๋Š” ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ๋™์ผํ•œ document ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ๋„ ์กด์žฌํ•œ๋‹ค.
๋Œ€ํ‘œ์ ์œผ๋กœ iframe(inline frame) ์„ ์ด์šฉํ•ด ๋‹ค๋ฅธ URL ๋“ฑ์˜ ์™ธ๋ถ€ HTML ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ iframe ๋‚ด๋ถ€์—์„œ window.document๋Š” iframe์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ถ€๋ชจ document๋ฅผ, node.ownerDocument๋Š” iframe์ด ํ‘œ์‹œํ•˜๋Š” ๋‚ด๋ถ€ document๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

DOM ์‚ฌ์šฉ์˜ˆ์‹œ(JS)

<script type="text/javascirpt"> window.onload = function() { var header = document.createElement('p'); var textNode = document.createTextNode('์ด๊ฒƒ์ด DOM์ด๋‹ค.'); header.appendChild(textNode); document.body.appendChild(header); }; </script>
HTML
๋ณต์‚ฌ
1.
document ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์„œ p ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑ
2.
document ๊ฐ์ฒด์— ๋‹ค์‹œ ์ ‘๊ทผํ•ด์„œ TextNode๋ฅผ ์ƒ์„ฑ ํ›„, String์„ ์‚ฝ์ž…
3.
appendChild ๋ฉ”์„œ๋“œ๋กœ textNode๋ฅผ ์ž์‹๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
4.
document ๊ฐ์ฒด์— ์žˆ๋Š” body ํƒœ๊ทธ์— header๋ฅผ ์ž์‹๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ DOM์€ ์—„๋ฐ€ํžˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋กœ๋„ DOM์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ € ์ƒ์—์„œ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ์–ธ์–ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฟ์ด๋ฏ€๋กœ ์ฃผ์š” ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ์ฒด ํ˜•ํƒœ

DOM์˜ ๋งŽ์€ ๊ฐ์ฒด๋“ค์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋“ค๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, table ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋“ค์ด ํฌํ•จ๋œ HTMLTableElement ๋ฅผ ๊ตฌํ˜„ํ•จ๊ณผ ๋™์‹œ์— HTML Element ์ด๊ธฐ๋„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Element ์ธํ„ฐํŽ˜์ด์Šค๋„ ๊ตฌํ˜„ํ•œ๋‹ค.

DOM์˜ ํ•ต์‹ฌ ์ธํ„ฐํŽ˜์ด์Šค

โ€ข
document.getElementById(id)
โ€ข
document.getElementByTagName(name)
โ€ข
document.createElement(name)
โ€ข
parentNode.appendChild(node)
โ€ข
element.innerHTML
โ€ข
element.setAttribute
โ€ข
element.getAttribute

ref)