μλ°μ€ν¬λ¦½νΈμ DOMμ λν λ΄μ©μΌλ‘ κ΄λ ¨ μμ μΈ DOMμ κΉ¨μ°μΉλ€λ₯Ό ν¬ν¨νμ¬ μ¬λ¬ μλ£λ€μ μ°Έκ³ νμ¬ μμ±νμμ΅λλ€! π
μ¬μ€μ ν΄λΉ μμ λ¦¬λ·°κ° λ§μ§ μλ...
DOM(Document Object Model)μ΄λ 무μμΈκ°. μ λ§ μ΄λμλ μλ DOMμ μλ°μ€ν¬λ¦½νΈλ₯Ό ν΅ν΄ HTMLμ μ‘°μνκΈ° μνμ¬ μμμΌ ν κ°λ μ€ νλλ€. λ¨μ΄ κ·Έλλ‘ DOMμ λ¬Έμ κ°μ²΄ λͺ¨λΈλ‘ XMLμ΄λ HTML λ¬Έμμ μ κ·ΌνκΈ° μν μΌμ’ μ μΈν°νμ΄μ€λ€.
μΈν°νμ΄μ€(interface)λ μλ‘ λ€λ₯Έ λ κ°μ μμ€ν , μ₯μΉ μ¬μ΄μμ μ 보λ μ νΈλ₯Ό μ£Όκ³ λ°λ κ²½μ°μ μ μ μ΄λ κ²½κ³λ©΄μΌλ‘ μ μλλ€. μ΄λ κ² λ§νλ©΄ μ΄λ ΅κ² λ€λ¦¬μ§λ§, λ μ¬μ΄μμ μνΈμμ© νλ κ³³μ΄λΌκ³ ν΄μνλ©΄ μ΄ν΄νκΈ° νΈνλ€.
κ·Έλ λ€λ©΄ μ°λ¦¬κ° νν λ§νλ UI(User Interface)λ μ¬μ©μμ μ»΄ν¨ν° κ°μ μνΈμμ© μ μ μ΄λΌκ³ ν΄μν μ μλ€. λνμ μΈ UI μμλ‘μ λ²νΌ, ν κΈ, λͺ¨λ¬ λ±μ΄ μλλ° κ°κ°μ κΈ°λ₯μ λν΄ μκ°ν΄λ³΄λ©΄ μΈν°νμ΄μ€μ λν μ΄ν΄κ° λ μμν κ²μ΄λ€.
κ·Έλ λ€λ©΄ μ HTMLμ DOMμΌλ‘ λ³νλμ΄μΌ νλ κ²μΌκΉ? μ¬μ€ μλ°μ€ν¬λ¦½νΈ μ μ₯μμ HTMLμ μ μλ―Έν λ°μ΄ν° νμμ΄ μλλ€. λ¨μ§ ν μ€νΈ νμμ λ°μ΄ν°μΈ κ²μ΄λ€. μ΄λ₯Ό μμ λ‘κ² λ€λ£¨κΈ° μν΄μλ κ° νκ·Έ μμκ° μ΄λ ν μκ΄κ΄κ³λ₯Ό κ°κ³ , μ΄λ ν μμ±μ κ°λ μ§μ λν λ΄μ©μ μ μνμ¬ κ°μ²΄ ννλ‘ μ μ₯ν νμκ° μμλ κ²μ΄λ€.
κ°λ¨νκ² λ§νμλ©΄, HTMLμ λ¬Έλ²μ΄ XML λ¬Έλ²μ λΉν΄ λΉκ΅μ μ μ°νκΈ° λλ¬Έμ΄λ€.
HTMLμ κ°λ μμ λλ μ’ λ£μ λν νκ·Έλ₯Ό μλ΅νλ κ²μ΄ κ°λ₯νλ°, μ΄λ κ² λκ·Έλ½κ³ νΈν HTMLμ μμκ° κ³΅μμ μΈ λ¬Έλ²μ μμ±νκΈ° μ΄λ ΅κ² λ§λλ λ¬Έμ κ° μλ€. κ·Έλ κΈ°μ λ³Έλ λΉκ΅μ μ격ν XMLμ μν κ²μ΄μμ§λ§, HTMLμμλ μ¬μ© κ°λ₯νλλ‘ νμ₯λμλ€κ³ νλ€.
μμμ μμ±νλ λΈλΌμ°μ μ μλ λ°©μμμ DOMμ λν μ΄μΌκΈ°λ₯Ό λ§μ΄ νλλ°, μ μ DOMμ λν μμΈν μ€λͺ
λ λΆμ‘±νκ³ , μ΄μ λν κ·Όλ³Έμ μΈ μ΄ν΄κ° λΆμ‘±ν κ² κ°μμ ν΄λΉ ν¬μ€ν
μ μμ±νλ€.
μ΄μ΄μ§λ λ΄μ©μμ DOMμ λν μ΄ν΄λ₯Ό μν΄μ λ
Έλ(node)μ λν΄ μμλ³Ό κ²μ΄λ€.
node
)νκ°λ‘ π±μ μ¬μ±λΆμ²λΌ λ
Έλλ₯Ό μμ μμ¬λ‘ λ€λ£¨κΈ° μν΄ λ
Έλμ λν΄ μμ보μ! ꡬκΈμ λ
Έλ(node)μ μ μμ λν΄ κ²μνλ©΄ μ»΄ν¨ν° κ³Όνμμ μ°μ΄λ κΈ°μ΄μ μΈ λ¨μλΌκ³ νλ€. λ
Έλμ λν λ΄μ©μ μ 리νλ©΄ λ€μκ³Ό κ°μ΄ μ 리ν μ μλ€.
μ΄λ¬ν λ
Έλ μ€ HTML λ¬Έμλ₯Ό λ€λ£° λ κ°μ₯ μΌλ°μ μΈ λ
Έλ μ νμ λ€μκ³Ό κ°λ€.
DOCUMENT_NODE
(μ : window.document
)ELEMENT_NODE
(μ : HTMLμ νκ·Έλ€ <body>
, <a>
λ±)ATTRIBUTE_NODE
(μ : class='funEdges'
)TEXT_NODE
(μ : μ€λ°κΏκ³Ό 곡백μ ν¬ν¨ν HTML λ΄ ν
μ€νΈ λ¬Έμ)DOCUMENT_FRAGMENT_NODE
(μ : document.createDocumentFragment()
)DOCUMENT_TYPE_NODE
(μ : <!DOCTYPE html>
)
μ λ
Έλ μ νλ€μ ν¬ν¨ν λͺ¨λ λ
Έλλ€μ κ°κ°μ μμλ₯Ό μλ³ν μ μλ μ½λ κ°μ κ°μ§λ€. λͺ¨λ λ
Έλ μ νλ€κ³Ό κ°κ°μ ν΄λΉνλ μ½λ κ°μ νννλ©΄ λ€μκ³Ό κ°λ€.
DOM νΈλ¦¬μ κ° λ
Έλ κ°μ²΄λ Node
λ‘ λΆν° μμ±κ³Ό λ©μλλ₯Ό μμλ°λλ€. μ κ·Έλ¦Όμ μμ κ΄κ³λ₯Ό ννν κ·Έλ¦Όμ΄λ€. κ·Έλ¦Όμλ λμ€μ§ μμμ§λ§, Node
λν λ€λ₯Έ κ°μ²΄λ€μ²λΌ Object.prototype
μΌλ‘ λΆν° μμλ°λλ€.
λν, μ κ·Έλ¦Όμμ νμΈν μ μλ―μ΄ κ° λ
Έλ κ°μ²΄λ Node
λ₯Ό ν¬ν¨ν ν΄λΉ λͺ¨λ μμ κ°μ²΄λ‘λΆν° μμ± λ° λ©μλλ₯Ό μμλ°λλ€.
λ
Έλ κ°μ²΄μ μμ±κ³Ό λ©μλμμ μ€μν λ΄μ©μ κ³μΈ΅ κ΅¬μ‘°κ° μ‘΄μ¬νκ³ μ£Όλ‘ κ΄κ³λ₯Ό λ€λ£¬λ€λ μ μ΄λ€. λν μμμ μΈκΈν λ°μ κ°μ΄ μμ λ
Έλ κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό μμλ°λλ€. λ€μμ μμλ‘ μ΄μ λν΄ κ°λ¨ν μμ보μ.
μ°μ κΈ°μ€μ΄ λλ μμλ₯Ό id
κ°μΌλ‘ document.getElementById
λ₯Ό ν΅ν΄ <body>
νκ·Έλ₯Ό λΆλ¬μ λ³μ start
μ μ μ₯νλ€. μ΄μ΄μ ν΄λΉ λ³μλ₯Ό νμ©νμ¬ λ
Έλ κ°μ²΄μ μμ± κ°μ λ°νν΄λ³Έλ€.
κ·Έλ°λ° start
μ 첫 λ²μ§Έ μμ μμλ₯Ό firstChild
λ₯Ό ν΅ν΄ λΆλ¬μλλ°, λ°ν κ°μΌλ‘ <ul>
νκ·Έκ° μλ #text
κ° λ°νλμλ€. μ΄μ λ μμμ μΈκΈν "λͺ¨λ μμκ° λ
Έλμ ν΄λΉνλ©°, 곡백과 μ£Όμλ λ§μ°¬κ°μ§λ€" λΌλ λΆλΆμμ μ μ μλ€. ν΄λΉ HTML λ¬Έμμμ start
μ 첫 λ²μ§Έ μμ μμλ body
μ <ul>
μ¬μ΄μ μλ 곡백μ΄κ³ , κ·Έλ κΈ°μ #text
λ₯Ό λ°νν κ²μ΄λ€. λ§μ½, <ul>
νκ·Έλ₯Ό μ§μ νκ³ μΆμλ€λ©΄ μλ λ κ°μ§ λ°©μμ νμ©νλ©΄ λλ κ²μ΄λ€.
μ΄λ κ² λ
Έλ κ°μ κ΄κ³λ₯Ό νμ©νμ¬ μ°κ΄λ λ
Έλλ₯Ό μ§μ νμ¬ νμ©ν μ μλ€. μμ£Ό μ¬μ©νλ μμ±κ³Ό λ©μλλ λ€μκ³Ό κ°λ€.
childNodes
firstChild
lastChild
nextSibling
parentNode
previousSibling
appendChild()
removeChild()
hasChildNodes()
λ€μμ μμλ₯Ό 보면 λ μ΄ν΄κ° νΈνλ€.
κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ κ° μμμ κ΄κ³λ₯Ό ν΅ν΄ μμ±κ³Ό λ©μλλ₯Ό νμ©ν΄λ³΄κ² λ€.
μ΅μλ¨ λΆν° μ°¨λ‘λ‘ ν΄μν΄λ³΄μ. μ°μ parent
ν΄λμ€λ₯Ό κ°λ μμ μ€ μ²« λ²μ§Έ μΈλ±μ€μ μμΉν μμλ₯Ό λ³μ el
λ‘ μ§μ νλ€. el
μ μ
λ ₯νλ μ¬λ°λ₯΄κ² div.parent
κ° λνλ κ²μ νμΈν μ μλ€. ν΄λΉ λ
Έλκ° κΈ°μ€μ μ΄ λμ΄μ€ κ²μ΄λ€.
μ΄μ΄μ el
μ μμ μμμ κ°―μλ₯Ό el.childElementCount
λ₯Ό ν΅ν΄ μΈ λ³΄λ 5
λΌλ κ°μ΄ μΆλ ₯λλ©΄μ μλ§μ κ°―μλ₯Ό μΆλ ₯ν΄μ£Όμλ€. μ΄μ΄μ el.firstElementChild
λ₯Ό μ¬μ©νμ¬ μ²« λ²μ§Έ μμλ₯Ό μ°Ύκ³ , ν΄λΉ μμμμ λ λ€μ΄κ° el.firstElementChild.nextElementSibling
λ₯Ό ν΅ν΄ 첫 λ²μ§Έ μμμ νμ μμλ₯Ό μ°Ύμλλ μλ§μ κ°μ΄ μΆ λ¨μ νμΈν μ μλ€.
λ§μ§λ§μΌλ‘ ν΄λΉ el
μ μμλ₯Ό μΆκ°νκΈ° μν΄ const div = document.createElement('div')
λ₯Ό ν΅ν΄ div
νκ·Έλ₯Ό νλ μμ±νλ€. κ·Έλ¦¬κ³ ν΄λΉ div
μ classList
λ₯Ό ν΅ν΄ child
λΌλ ν΄λμ€λ₯Ό μΆκ°νμΌλ©°, λ§μ§λ§μΌλ‘ el
μ λ§λ€μ΄ λ div
λ₯Ό μΆκ°νκ³ innerText
λ₯Ό νμ©νμ¬ ν΄λΉ div
λ΄λΆμ 6
μ΄λΌλ ν
μ€νΈλ₯Ό μΆκ°νλ€. κ·Έλ κ² ν΄λΉ κ²°κ³Όμ κ°μ΄ 5κ° μλ μμλ€μ΄ 6κ°λ‘ μΆκ°λμκ³ , κ°μ ν΄λμ€λ₯Ό λΆμ¬νμ¬ κ°μ CSSκ° μ μ© λμμμ νμΈν μ μλ€.
μ μμμμ div.parent
λ
Έλλ₯Ό HTMLμμ className
μ ν΅ν΄ κ°μ Έμ¨ κ²μ νμΈν μ μλ€. μ΄λ κ² DOMμμ λ©μλλ₯Ό μ¬μ©νμ¬ νΉμ λ
Έλλ₯Ό μ°Ύμμ¬ μ μλλ°, κ·Έ λ°©λ²μ λ€μκ³Ό κ°λ€.
document.querySelector('selector')
document.querySelectorAll('selector')
document.getElementsByClassName('className')
document.getElementById('idName')
ν΄λΉ λ©μλλ€μ νμ©νμ¬ DOM λ
Έλλ€μ νΉμ κΈ°μ€μΌλ‘ λΆλ¬μ¬ μ μλ€.
κ° λ©μλμ νμ© λ°©λ²κ³Ό λ°ν κ°μ μ μ μλ μμλ€. ν΄λΉ μμλ μ μμμμ div.child
μ λ§μ§λ§ μμλ§ div#lastChild
λ‘ λ°κΎΌ λ€ μ§νν μμλ€. μ λ©μλλ€μ μΈμμ νμμ΄λ λ°ν κ°μ νμμ λ°λΌ ꡬλΆλλ€.
μ°μ μΈμ νμμ λ°λΌ document.querySelector('selector')
, document.querySelectorAll('selector')
μ μ νμ μμ± λ°©μμΌλ‘ μΈμ κ°μ μ¬μ©νλ€. νμ§λ§ document.getElementsByClassName('className')
, document.getElementById('idName')
μ κ²½μ°λ ν΄λμ€ λͺ
, ID λͺ
μ λ°λ‘ μμ±νλ€λ μ°¨μ΄μ μ΄ μλ€.
κ·Έλ¦¬κ³ λ°ν κ°μ νμμ λ°λΌ document.querySelector('selector')
, document.getElementById('idName')
μ λ¨μΌ κ°μ λ°ννκΈ° λλ¬Έμ, λ
Έλ νλ λ§μ λ°ννκ³ μΌμΉνλ λ
Έλκ° μ‘΄μ¬νμ§ μλ κ²½μ° null
μ λ°ννμ§λ§, document.querySelectorAll('selector')
, document.getElementsByClassName('className')
μ κ²½μ° λ³΅μμ κ°μ λ°ννκΈ° λλ¬Έμ μΈλ±μ€ κ°μ [i]
μ ν΅ν΄ μ
λ ₯ν΄μΌ νκ³ κ°μ΄ μμ λλ λΉ λ°°μ΄μ λ°ννλ€λ μ°¨μ΄κ° μλ€.
μ΄λ κ² λ
Έλλ₯Ό μΆμ νμ¬ νΉμ μμΉμ μμλ₯Ό μΆκ°νκ±°λ λ³κ²½νλ κ²μ΄ κ°λ₯νλ€.
κ·Έλ λ€λ©΄ μμ μΌλΆλ₯Ό μΆμΆνμ¬ μμ μμ±κ³Ό μΆκ°μ κ³Όμ μ μ€λͺ
ν΄λ³΄μ.
μ°μ div
λΌλ λ³μμ createElement
λΌλ λ©μλλ₯Ό μ¬μ©νμ¬ div
νκ·Έ λ
Έλλ₯Ό μμ±νκ³ μ μ₯νλ€. κ·Έλ¦¬κ³ ν΄λΉ div
κ°μ classList
λ₯Ό ν΅ν΄ ,child
λΌλ ν΄λμ€λ₯Ό λΆμ¬ν΄μ€λ€. μ΄ν μμμ μ μΈν΄ μ€ el
μ append
λ₯Ό ν΅ν΄ div
λ³μλ₯Ό μΆκ°νλ€. λ§μ§λ§μΌλ‘ innerText
λ₯Ό ν΅ν΄ el
μ λ§μ§λ§ μμ μμμ 6
μ΄λΌλ κ°μ μΆκ°νλ€.
μμμ κ°μ‘° νμν μμ±κ³Ό μΆκ°μ λν΄ μ΄μ΄μ μμ보μ.
createElement()
createTextNode()
innerHTML/Text = input
outerHTML/Text = input
textContent = input
insertAdjacentHTML()
μ μμλ₯Ό 보면 κ°κ°μ λ°©λ²μΌλ‘ μμ±μ μ§ννκ³ μΆκ°λ μ§νν λ΄μ©μ΄λ€. createElement()
μ κ²½μ°μ μ μ μ μμμμ μ¬μ©νκΈ° λλ¬Έμ μ μΈνμλ€.
μ°μ createElement()
μ createTextNode()
μ κ²½μ° μ μΈκ³Ό λμμ λ³μμ μ μ₯λκ³ κ°μ ννμ κ²½μ°, μ μλ element
λ
Έλ ννλ‘, νμμ κ²½μ° Text
λ
Έλ ννλ‘ μ μ₯λλ€.
κ·Έλ¦¬κ³ μ΄ λ€ κ°μ§μ μΆκ° λ°©λ²μ μμ±νλλ°, innerHTML/Text
μ λ
Έλ μμ λ΄λΆμ, outerHTML/Text
μ κ²½μ° νκ·Έ μ 체λ₯Ό κ°±μ νλ©° κΈ°μ‘΄ νκ·Έκ° μ¬λΌμ§λ€κ³ μκ°νλ©΄ λλ€. textContent
λ Text
μμλ₯Ό μμ±νμ¬ κ°±μ νκ³ , λ§μ§λ§ insertAdjacentHTML()
μ κ²½μ°μ element
λ
Έλμμλ§ λμνλ©° μΈμ κ°μ΄ λ κ°μ§κ° λ€μ΄κ°λλ°, (location, 'textStyleTag')
λ‘ κ΅¬μ±λλ©° μμ μ ν΄μ§ ν€μλ(beforeend
λ±)λ₯Ό μΈμλ‘ κ°κ³ λ€μ outerHTML
μμ±κ³Ό κ°μ΄ μ 체 λ
Έλ νμμ μμ±νλ€.
μ΄μΈμλ μΆκ°μλ λ κ°μ§ λ°©λ²μ΄ λ μλ€.
μμ λ°©μλ€μ λλΆλΆ λ
Έλ κ°μ κ°±μ νλ κ²μ΄μλ€λ©΄, μ λ κ°μ§ λ°©λ²μ μμλ₯Ό μ§μ°μ§ μκ³ μΆκ°λ₯Ό μ§ννλ€. appendChild()
μ κ²½μ° μΆκ°νκ³ μ νλ λ
Έλλ₯Ό ν΄λΉ μμμ 맨 λ μμ μμλ‘ μΆκ°νλ€. λ°°μ΄ λ©μλμ push()
μ κ°μ ꡬ쑰λΌκ³ μκ°νλ©΄ νΈν κ² κ°λ€.
insertBefore()
μ κ²½μ° μΈμ κ°μΌλ‘ λ κ°μ§λ₯Ό λ°λλ°, (element, location)
μ ννλ‘ λ°κ² λλ€. μ°μ μΆκ°νκ³ μ νλ μμλ₯Ό λ°κ³ , μ΄ν κ²½λ‘λ₯Ό μ§μ νμ¬ ν΄λΉ μμ κΈ°μ€μΌλ‘ μμ μμΉνλ€. μ΄λ κ² μ μ°ν λ°©μμΌλ‘ λ
Έλλ₯Ό μΆκ°ν μ λ μλ€.
λ
Έλμ μμ±κ³Ό μΆκ°κ° μ΄λ£¨μ΄μ‘μΌλ©΄, μ κ±°μ λ³κ²½λ κ°λ₯ν κ² μμ μ΄λ―Έ μ§μνμ κ²μ΄λ€. μ κ±°μ λ³κ²½μ λ€μκ³Ό κ°μ λ©μλλ₯Ό μ¬μ©νμ¬ μ§νν μ μλ€.
removeChild()
replaceChild()
μ°μ μ κ±°μ κ²½μ° removeChild()
μ κ°μ΄ μμ κ΄κ³λ₯Ό νμ©νμ¬ μ§νν μ μλ€. μ΄ κ²½μ° ν΄λΉ λ
Έλμ parentNode
νΉμ parentElement
λ₯Ό μ°Έμ‘°νμ¬ μ κ±°λ₯Ό μ§νν μ μλ€.
λ³κ²½λ μ κ±°μ κ°μ΄ μμ κ΄κ³λ₯Ό νμ©νλ©΄μ, μΈμλ₯Ό λ κ°μ§λ₯Ό λ°λλ€. μΈμλ (inputElement, location)
μΌλ‘ location
μ inputElement
λ₯Ό λμ
νμ¬ μ¬μ© κ°λ₯νλ€. μ μμμ κ²½μ° parent
μ λ§μ§λ§ μμ μμλ₯Ό μ§μ νμ¬ λ³κ²½ν λͺ¨μ΅μ΄λ€.
νΉμ λ
Έλμ ꡬ쑰λ₯Ό 볡μ νμ¬ μ¬μ©ν μλ μλ€. κ·Έλ κ² λλ€λ©΄, κ°μ ꡬ쑰μ λ
Έλλ λ°λ³΅μ μΌλ‘ μμ±ν νμκ° μλ κ²μ΄λ€. 볡μ λ λ€μμ λ°©λ²μΌλ‘ μ§νν μ μλ€.
cloneNode()
ν΄λΉ μμλ₯Ό 보면 parent
λ
Έλ μμ²΄λ§ λ³΅μ¬ν κ²½μ°μ, λ
Έλ μ 체λ₯Ό 볡μ¬ν κ²½μ°κ° ꡬλΆλμ΄ μλ€. cloneNode()
λ©μλμ κ²½μ°, νΉμ λ
Έλλ₯Ό 볡μ νλλ° μΈμ κ°μ λ°λΌ μ 체λ₯Ό 볡μ¬ν μ§, λ¨μΌ μμλ§ λ³΅μ¬ν μ§λ₯Ό ꡬλΆν μ μλ€.
cloneOne
μ κ²½μ° μΈμ κ°μ λΆμ¬νμ§ μμκΈ° λλ¬Έμ, parent
λ
Έλ λ¨μΌ κ°μ²΄ λ§μ 볡μ νμ§λ§, cloneAll
μ κ²½μ° μΈμ κ°μ true
λ₯Ό μΆκ°νμ¬ ν΄λΉ λ
Έλμ μμ μμλ€κΉμ§ μ λΆ λ³΅μ νμλ€.
μλ²½νκ² ν΄λΉ μ±
μ λ
ννκ³ μ 체λ₯Ό μ 리νμ¬ μμ±νκ³ μΆμμ§λ§, λΆνΈμΊ ν 컀리νλΌκ³Ό λμμ μ§ννκ³ μ νλ μ½κ° λ²κ±°μ λ΄κ° μ€μ λ‘ νμ©νλ λΆλΆμ λν΄μ μμ±νλ κ²μ 1μ°¨ λͺ©νλ‘ λκ³ κΈ°μ‘΄μ μμ± λͺ©λ‘μ λ§λ¬΄λ¦¬μ§μλ€.
μ΄μ΄μ 리μ‘νΈλ₯Ό μ§νν μμ μ΄μ§λ§, λ°λλΌ μλ°μ€ν¬λ¦½νΈ λν λμΉμ§ μκ³ κΎΈμ€ν 곡λΆν΄μΌ ν¨μ λͺ
μ¬νμ.
DOM : MDN Web Docs : DOM μκ° + κ°μ’ λ©μλλ€