λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
javascript/πŸ“– study

[8μ£Όμ°¨ μŠ€ν„°λ””]39μž₯-DOM

by HomieKim 2022. 3. 27.

DOM

DOM(Document Object Model)은 HTML λ¬Έμ„œμ˜ 계측적 ꡬ쑰와 정보λ₯Ό ν‘œν˜„ν•˜λ©° 이λ₯Ό μ œμ–΄ν•  수 μžˆλŠ” API 즉, ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” 트리 자료ꡬ쑰 이닀.

λ…Έλ“œ

  • HTML μš”μ†ŒλŠ” HTML λ¬Έμ„œλ₯Ό κ΅¬μ„±ν•˜λŠ” κ°œλ³„ 적인 μš”μ†Œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • HTML μš”μ†ŒλŠ” λ Œλ”λ§ 엔진에 μ˜ν•΄ νŒŒμ‹±λ˜μ–΄ DOM을 κ΅¬μ„±ν•˜λŠ” μš”μ†Œ λ…Έλ“œ 객체둜 λ³€ν™˜
  • HTML μš”μ†Œ κ°„μ—λŠ” 쀑첩 관계λ₯Ό κ°€μ§ˆ 수 있으며 μ΄λŸ¬ν•œ 관계λ₯Ό λ°˜μ˜ν•˜μ—¬ HTML μš”μ†Œλ₯Ό κ°μ²΄ν™”ν•œ λͺ¨λ“  λ…Έλ“œ 객체듀을 트리 자료 ꡬ쑰둜 κ΅¬μ„±ν•œλ‹€.

λ…Έλ“œ 객체의 νƒ€μž…

  • λ…Έλ“œ κ°μ²΄λŠ” 상속 ꡬ쑰λ₯Ό 가지고 총 12개 μ’…λ₯˜μ˜ λ…Έλ“œκ°€ μžˆλ‹€.
  • λŒ€ν‘œμ μœΌλ‘œ 4가지 μ€‘μš”ν•œ λ…Έλ“œ νƒ€μž…μ„ 정리 ν•  수 μžˆλ‹€.
    1. λ¬Έμ„œ λ…Έλ“œ(document node)
      • DOM 트리의 μ΅œμƒμœ„μ— μ‘΄μž¬ν•˜λŠ” 루트 λ…Έλ“œ, document 객체 λ₯Ό 가리킨닀.
      • document κ°μ²΄λŠ” λΈŒλΌμš°μ €κ°€ λ Œλ”λ§ν•œ HTMLλ¬Έμ„œ 전체λ₯Ό κ°€λ¦¬ν‚€λŠ” 객체
      • window.document ν˜Ήμ€ document둜 μ°Έμ‘° κ°€λŠ₯
      • script νƒœκ·Έλ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 λΆ„λ¦¬λ˜μ–΄ μžˆμ–΄λ„ μ „μ—­ 객체 window.document에 λ°”μΈλœ 객체λ₯Ό λ”°λ¦…λ‹ˆλ‹€. (즉, HTML λ¬Έμ„œλ‹Ή documentκ°μ²΄λŠ” 유일)
      • documentκ°μ²΄λŠ” DOM트리의 루트 λ…Έλ“œ μ΄λ―€λ‘œ DOM 트리의 λ…Έλ“œλ“€μ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ μ§„μž…μ  역할을 ν•©λ‹ˆλ‹€.
    2. μš”μ†Œ λ…Έλ“œ(element node)
      • HTML μš”μ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 객체
      • 각 HTML μš”μ†Œλ“€μ€ 상속관계λ₯Ό κ°€μ§€λ―€λ‘œ, μš”μ†Œ λ…Έλ“œλŠ” λ¬Έμ†Œμ˜ ꡬ쑰λ₯Ό ν‘œν˜„ν•œλ‹€
    3. μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œ(attribute node)
      • HTML μš”μ†Œμ˜ μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό κ°€λ¦¬ν‚€λŠ” 객체
      • μ§€μ •λœ HTML μš”μ†Œμ˜ λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆλ‹€.
      • μš”μ†Œ λ…Έλ“œμ—λ§Œ μ—°κ²°λ˜μ–΄ 있고 λΆ€λͺ¨ λ…Έλ“œλ₯Ό 가지지 μ•ŠμŒ
      • λ”°λΌμ„œ, μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œμ— μ ‘κ·Όν•˜λ €λ©΄ μš”μ†Œ λ…Έλ“œμ— λ¨Όμ € μ ‘κ·Ό 해야함
    4. ν…μŠ€νŠΈ λ…Έλ“œ(text node)
      • HTML μš”μ†Œμ˜ ν…μŠ€νŠΈλ₯Ό κ°€λ¦¬ν‚€λŠ” 객체
      • μš”μ†Œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œ
      • μžμ‹ λ…Έλ“œλ₯Ό κ°€μ§ˆ 수 μ—†λŠ” 리프 λ…Έλ“œ(leaf node) 즉, DOM 트리의 μ΅œμ’…λ‹¨
      • λ”°λΌμ„œ , ν…μŠ€νŠΈ λ…Έλ“œμ— μ ‘κ·Όν•˜λ €λ©΄ λΆ€λͺ¨λ…Έλ“œμΈ μš”μ†Œ λ…Έλ“œμ— μ ‘κ·Ό ν•΄μ•Ό ν•œλ‹€.

λ…Έλ“œ 객체의 상속 ꡬ쑰

  • DOM 을 κ΅¬μ„±ν•˜λŠ” λ…Έλ“œ κ°μ²΄λŠ” ν‘œμ€€ 빌트인 객체가 μ•„λ‹ˆλΌ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ μΆ”κ°€μ μœΌλ‘œ μ œκ³΅ν•˜λŠ” 호슀트 객체
  • λ…Έλ“œ 객체도 μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄μ΄λ―€λ‘œ ν”„λ‘œν† νƒ€μž…μ— μ˜ν•œ 상속 ꡬ쑰λ₯Ό 가짐.
  • λͺ¨λ“  λ…Έλ“œ κ°μ²΄λŠ” Object, EventTarget, Node μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속.
  • HTML μš”μ†Œμ˜ μ’…λ₯˜μ— 따라 고유의 κΈ°λŠ₯을 가지기도 ν•œλ‹€.

    DOM은 HTML λ¬Έμ„œμ˜ 계측적 ꡬ쑰와 정보λ₯Ό ν‘œν˜„ν•˜λŠ” 것은 λ¬Όλ‘  λ…Έλ“œ 객체의 μ’…λ₯˜. 즉, λ…Έλ“œ νƒ€μž…μ— 따라 ν•„μš”ν•œ κΈ°λŠ₯을 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œμ˜ 집합인 DOM API둜 제곡.

이 DOM APIλ₯Ό 톡해 HTML의 κ΅¬μ‘°λ‚˜ λ‚΄μš© λ˜λŠ” μŠ€νƒ€μΌ 등을 λ™μ μœΌλ‘œ μ‘°μž‘ κ°€λŠ₯.

μš”μ†Œ 취득 λ…Έλ“œ

idλ₯Ό μ΄μš©ν•œ μš”μ†Œ λ…Έλ“œ 취득

  • Document.prototype.getElementById λ©”μ„œλ“œ μ‚¬μš©
  • 인수둜 μ „λ‹¬λœ id 값을 κ°–λŠ” 첫 번째 μš”μ†Œ λ…Έλ“œλ§Œ λ°˜ν™˜

νƒœκ·Έ 이름을 μ΄μš©ν•œ μš”μ†Œ λ…Έλ“œ 취득

  • getElementsByTagName λ©”μ„œλ“œ μ‚¬μš©
    • Document.prototype.getElementsByTagName : 루트 λ…Έλ“œμΈ λ¬Έμ„œλ…Έλ“œ(document)λ₯Ό 톡해 호좜
    • Element.prototype.getElementsByTagName : νŠΉμ • μš”μ†Œ λ…Έλ“œλ₯Ό 톡해 호좜 (νŠΉμ • μš”μ†Œ λ…Έλ“œμ˜ μžμ‹ μ€‘μ—μ„œ 탐색)
  • DOM μ»¬λ ‰μ…˜ 객체인 HTMLCollection 객체 λ°˜ν™˜(μœ μ‚¬ λ°°μ—΄ μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”)

classλ₯Ό μ΄μš©ν•œ μš”μ†Œ λ…Έλ“œ 취득

  • getElementsByClassName λ©”μ„œλ“œ μ‚¬μš©
  • 인수둜 μ „λ‹¬ν•œ class μ–΄νŠΈλ¦¬λ·°νŠΈ κ°’ κ°–λŠ” λͺ¨λ“  μš”μ†Œ λ…Έλ“œλ₯Ό 탐색 ν•˜μ—¬ λ°˜ν™˜
  • DOM μ»¬λ ‰μ…˜ 객체인 HTMLCollection 객체 λ°˜ν™˜(μœ μ‚¬ λ°°μ—΄ μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”)

CSS μ„ νƒμžλ₯Ό μ΄μš©ν•œ μš”μ†Œ λ…Έλ“œ 취득

/* 전체 μ„ νƒμž: λͺ¨λ“  μš”μ†Œλ₯Ό 선택 */
* { ... }
/* νƒœκ·Έ μ„ νƒμž: λͺ¨λ“  p νƒœκ·Έ μš”μ†Œλ₯Ό λͺ¨λ‘ 선택 */
p { ... }
/* id μ„ νƒμž: id 값이 'foo'인 μš”μ†Œλ₯Ό λͺ¨λ‘ 선택 */
#foo { ... }
/* class μ„ νƒμž: class 값이 'foo'인 μš”μ†Œλ₯Ό λͺ¨λ‘ 선택 */
.foo { ... }
/* μ–΄νŠΈλ¦¬λ·°νŠΈ μ„ νƒμž: input μš”μ†Œ 쀑에 type μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 'text'인 μš”μ†Œλ₯Ό λͺ¨λ‘ 선택 */
input[type=text] { ... }
/* 후손 μ„ νƒμž: div μš”μ†Œμ˜ 후손 μš”μ†Œ 쀑 p μš”μ†Œλ₯Ό λͺ¨λ‘ 선택 */
div p { ... }
/* μžμ‹ μ„ νƒμž: div μš”μ†Œμ˜ μžμ‹ μš”μ†Œ 쀑 p μš”μ†Œλ₯Ό λͺ¨λ‘ 선택 */
div > p { ... }
/* 인접 ν˜•μ œ μ„ νƒμž: p μš”μ†Œμ˜ ν˜•μ œ μš”μ†Œ 쀑에 p μš”μ†Œ λ°”λ‘œ 뒀에 μœ„μΉ˜ν•˜λŠ” ul μš”μ†Œλ₯Ό 선택 */
p + ul { ... }
/* 일반 ν˜•μ œ μ„ νƒμž: p μš”μ†Œμ˜ ν˜•μ œ μš”μ†Œ 쀑에 p μš”μ†Œ 뒀에 μœ„μΉ˜ν•˜λŠ” ul μš”μ†Œλ₯Ό λͺ¨λ‘ 선택 */
p ~ ul { ... }
/* 가상 클래슀 μ„ νƒμž: hover μƒνƒœμΈ a μš”μ†Œλ₯Ό λͺ¨λ‘ 선택 */
a:hover { ... }
/* 가상 μš”μ†Œ μ„ νƒμž: p μš”μ†Œμ˜ μ½˜ν…μΈ μ˜ μ•žμ— μœ„μΉ˜ν•˜λŠ” 곡간을 선택
   일반적으둜 content ν”„λ‘œνΌν‹°μ™€ ν•¨κ»˜ μ‚¬μš©λœλ‹€. */
p::before { ... }

querySelector()

  • 인수둜 전달할 CSS μ„ νƒμžλ₯Ό λ§Œμ‘±μ‹œν‚€λŠ” μš”μ†Œ λ…Έλ“œκ°€ μ—¬λŸ¬ 개인 경우 첫 번째 μš”μ†Œ λ…Έλ“œλ§Œ λ°˜ν™˜
  • 인수둜 μ „λ‹¬λœ CSS μ„ νƒμžλ₯Ό λ§Œμ‘±μ‹œν‚€λŠ” μš”μ†Œ λ…Έλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 null을 λ°˜ν™˜
  • 인수둜 μ „λ‹¬ν•œ CSS μ„ νƒμžκ°€ 문법에 λ§žμ§€ μ•ŠλŠ” 경우 DOMException μ—λŸ¬ λ°œμƒ
  • Document.prototype / Element.prototype 에 μ •μ˜ 된 λ©”μ„œλ“œλ‘œ λ‚˜λ‰¨

querySelectorAll()

  • 인수둜 μ „λ‹¬ν•œ CSS μ„ νƒμžλ₯Ό 만쑱 μ‹œν‚€λŠ” λͺ¨λ“  μš”μ†Œ λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜μ—¬ λ°˜ν™˜
  • μ—¬λŸ¬κ°œμ˜ μš”μ†Œ λ…Έλ“œ 객체λ₯Ό κ°–λŠ” DOM μ»¬λ ‰μ…˜ 객체인 NodeList λ₯Ό λ°˜ν™˜
  • NodeListλŠ” μœ μ‚¬ λ°°μ—΄ 객체 μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”
  • μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 빈 NodeList 객체 λ°˜ν™˜
  • 문법에 λ§žμ§€ μ•ŠλŠ” 경우 DOMException

νŠΉμ • μš”μ†Œ 취득할 수 μžˆλŠ”μ§€ 확인

  • Element.prototype.matches λ©”μ„œλ“œ μ‚¬μš©
  • 인수둜 μ „λ‹¬ν•œ CSS μ„ νƒμžλ₯Ό 톡해 νŠΉμ • μš”μ†Œ λ…Έλ“œλ₯Ό 취득할 수 μžˆλŠ”μ§€ 확인
const $apple = document.querySelector('.apple');

// $apple λ…Έλ“œλŠ” '#fruits > li.apple'둜 취득할 수 μžˆλ‹€.
console.log($apple.matches('#fruits > li.apple'));  // true

// $apple λ…Έλ“œλŠ” '#fruits > li.banana'둜 취득할 수 μ—†λ‹€.
console.log($apple.matches('#fruits > li.banana')); // false
  • 이벀트 μœ„μž„μ„ μ‚¬μš©ν•  λ•Œ μœ μš©ν•˜λ‹€.

HTMLCollection κ³Ό NodeList

HTMLCollection

  • HTMLCollection은 객체의 μƒνƒœ λ³€ν™”λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ 반영 ν•©λ‹ˆλ‹€.
  • μ‚΄μ•„ μžˆλŠ” 객체라고 λΆ€λ₯΄κΈ°λ„ 함
  • μƒνƒœκ°€ μ¦‰μ‹œ 반영 되기 λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ‚˜κΈ°λ„ 함, 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ°°μ—΄λ‘œ λ³€ν™˜ ν•˜μ—¬ μ‚¬μš© ꢌμž₯
// class 값이 'red'인 μš”μ†Œ 객체λ₯Ό λͺ¨λ‘ HTMLCollection 으둜 λ°˜ν™˜ 
const $elems = document.getElementsByClassName('red');
// 객체 μƒνƒœκ°€ μ‹€μ‹œκ°„μœΌλ‘œ λ°˜μ˜λ˜λ©΄μ„œ forλ¬Έ 으둜 μ‚¬μš©ν•  경우 μ›ν•˜λŠ” λŒ€λ‘œ μ‘°μž‘ν•˜κΈ° 어렀움
// λ°°μ—΄λ‘œ λ³€ν™˜ν•΄μ„œ μ‚¬μš©
[...$elems].forEach(ele => ele.className = 'blue');

NodeList

  • μ‹€μ‹œκ°„μœΌλ‘œ 객체의 μƒνƒœ 변경을 λ°˜μ˜ν•˜μ§€ μ•ŠλŠ” 객체
  • NodeList.prototype.forEach λ©”μ„œλ“œλ₯Ό 상속 λ°›μ•„ μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ˜ˆμ™Έλ‘œ, childNodes ν”„λ‘œνΌν‹°κ°€ λ°˜ν™˜ν•˜λŠ” NodeList κ°μ²΄λŠ” HTMLCollectionκ³Ό 같이 μƒνƒœκ°€ μ‹€μ‹œκ°„μœΌλ‘œ λ°˜μ˜λœλ‹€.

λ…Έλ“œ 객체의 μƒνƒœ λ³€κ²½κ³Ό 상관없이 μ‚¬μš©ν•˜λ €λ©΄ HTMLColleciton μ΄λ‚˜ NodeList 객체λ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•΄μ„œ μ‚¬μš©μ„ ꢌμž₯

두 κ°μ²΄λŠ” λͺ¨λ‘ μœ μ‚¬ λ°°μ—΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€. 즉, μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μœΌλ‘œ λ°°μ—΄λ‘œ λ³€ν™˜ κ°€λŠ₯

λ…Έλ“œ 탐색

  • DOM 트리 μƒμ˜ λ…Έλ“œλ₯Ό 탐색 ν•  수 μžˆλ„λ‘ Node, Element μΈν„°μŠ€νŽ˜μ΄μŠ€λŠ” 트리 탐색 ν”„λ‘œνΌν‹°λ₯Ό 제곡

  • Node.prototype 이 μ œκ³΅ν•˜λŠ” ν”„λ‘œνΌν‹°

    • parentNode : λΆ€λͺ¨ λ…Έλ“œ 탐색, (λΆ€λͺ¨ λ…Έλ“œλŠ” ν…μŠ€νŠΈ λ…Έλ“œκ°€ 될 수 μ—†λ‹€.)
    • previousSibling : 이전 ν˜•μ œ λ…Έλ“œ νƒμƒ‰ν•˜μ—¬ λ°˜ν™˜, μš”μ†Œ λ…Έλ“œ λ˜λŠ” ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό λ°˜ν™˜
    • firstChild : 첫 번째 μžμ‹ λ…Έλ“œ λ°˜ν™˜ , μš”μ†Œ λ…Έλ“œ 또 λŠ” ν…μŠ€νŠΈ λ…Έλ“œ
    • childNodes : μžμ‹ λ…Έλ“œλ₯Ό λͺ¨λ‘ 탐색 ν•˜μ—¬ NodeList둜 λ°˜ν™˜, ν…μŠ€νŠΈ λ…Έλ“œ 포함 될 수 μžˆλ‹€.
  • Element.prototype 이 μ œκ³΅ν•˜λŠ” ν”„λ‘œνΌν‹°

    • previousElementSibling : 이전 ν˜•μ œ λ…Έλ“œ λ°˜ν™˜, μš”μ†Œ λ…Έλ“œλ§Œ λ°˜ν™˜
    • nextElementSibling : μžμ‹ μ˜ λ‹€μŒ ν˜•μ œ μš”μ†Œ λ…Έλ“œ λ°˜ν™˜, μš”μ†Œ λ…Έλ“œλ§Œ λ°˜ν™˜
    • children : μžμ‹ λ…Έλ“œ μ€‘μ—μ„œ μš”μ†Œ λ…Έλ“œλ§Œ λͺ¨λ‘ νƒμƒ‰ν•˜μ—¬ HTMLCollection 으둜 λ°˜ν™˜ (ν…μŠ€νŠΈ λ…Έλ“œ 포함 x)
  • 이외에도 λͺ‡κ°€μ§€ ν”„λ‘œνΌν‹° 더 μžˆμ§€λ§Œ μœ„μ˜ λ©”μ„œλ“œ λ™μž‘κ³Ό λΉ„μŠ·ν•¨

λ…Έλ“œ 정보 취득

Node.prototype.nodeType

  • λ…Έλ“œ 객체의 μ’…λ₯˜. 즉, λ…Έλ“œ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λŠ” μƒμˆ˜λ₯Ό λ°˜ν™˜.
  • λ…Έλ“œ νƒ€μž… μƒμˆ˜λŠ” Node에 μ •μ˜λ˜μ–΄ 있음.
  • Node.ELEMENT_NODE: μš”μ†Œ λ…Έλ“œ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λŠ” μƒμˆ˜ 1을 λ°˜ν™˜.
  • Node.TEXT_NODE: ν…μŠ€νŠΈ λ…Έλ“œ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λŠ” μƒμˆ˜ 3을 λ°˜ν™˜.
  • Node.DOCUMENT_NODE: λ¬Έμ„œ λ…Έλ“œ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λŠ” μƒμˆ˜ 9λ₯Ό λ°˜ν™˜.

Node.prototype.nodeName

  • λ…Έλ“œμ˜ 이름을 λ¬Έμžμ—΄λ‘œ λ°˜ν™˜.
  • μš”μ†Œ λ…Έλ“œ: λŒ€λ¬Έμž λ¬Έμžμ—΄λ‘œ νƒœκ·Έ 이름("UL", "LI" λ“±)을 λ°˜ν™˜.
  • ν…μŠ€νŠΈ λ…ΈνŠΈ: λ¬Έμžμ—΄ "#text"λ₯Ό λ°˜ν™˜.
  • λ¬Έμ„œ λ…Έλ“œ: λ¬Έμžμ—΄ "#document"λ₯Ό λ°˜ν™˜.

μš”μ†Œ λ…Έλ“œμ˜ ν…μŠ€νŠΈ μ‘°μž‘

nodeValue

  • λ…Έλ“œ 객체의 κ°’(ν…μŠ€νŠΈ λ…Έλ“œμ˜ ν…μŠ€νŠΈ)을 λ°˜ν™˜
  • λ¬Έμ„œ λ…Έλ“œλ‚˜ μš”μ†Œ λ…Έλ“œλŠ” nodeValue μ°Έμ‘°ν•˜λ©΄ null λ°˜ν™˜
<!DOCTYPE html>
<html>
  <body>
    <div id="foo">Hello</div>
  </body>
  <script>
    // 1. #foo μš”μ†Œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œμΈ ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό μ·¨λ“ν•œλ‹€.
    const $textNode = document.getElementById('foo').firstChild;

    // 2. nodeValue ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈ λ…Έλ“œμ˜ 값을 λ³€κ²½ν•œλ‹€.
    $textNode.nodeValue = 'World';

    console.log($textNode.nodeValue); // World
  </script>
</html>

textContent

  • μš”μ†Œ λ…Έλ“œμ˜ ν…μŠ€νŠΈμ™€ μžμ† λ…Έλ“œμ˜ ν…μŠ€νŠΈλ₯Ό λͺ¨λ‘ 취득
  • 즉, textContentλŠ” μš”μ†Œλ…Έλ“œμ˜ μ½˜ν…μΈ  μ˜μ—­(μ‹œμž‘ νƒœκ·Έμ™€ μ’…λ£Œνƒœκ·Έ 사이)의 λͺ¨λ“  ν…μŠ€νŠΈλ₯Ό λͺ¨λ‘ λ°˜ν™˜
  • μ΄λ•Œ HTML λ§ˆν¬μ—…μ€ λ¬΄μ‹œλ¨
<!DOCTYPE html>
<html>
  <body>
    <div id="foo">Hello <span>world!</span></div>
  </body>
  <script>
    // #foo μš”μ†Œ λ…Έλ“œμ˜ ν…μŠ€νŠΈλ₯Ό λͺ¨λ‘ μ·¨λ“ν•œλ‹€. μ΄λ•Œ HTML λ§ˆν¬μ—…μ€ λ¬΄μ‹œλœλ‹€.
    console.log(document.getElementById('foo').textContent); // Hello world!
  </script>
</html>

innerText ν”„λ‘œνΌν‹° μ—­μ‹œ textContent와 μœ μ‚¬ν•œ λ™μž‘μ„ ν•©λ‹ˆλ‹€.
단, innerTextλŠ” CSS에 μ˜ν•΄ λΉ„ν‘œμ‹œ 둜 μ§€μ •λœ μš”μ†Œμ˜ λ…Έλ“œ ν…μŠ€νŠΈλŠ” λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

DOM μ‘°μž‘

  • μƒˆλ‘œμš΄ λ…Έλ“œλ₯Ό DOM에 μΆ”κ°€ν•˜κ±°λ‚˜, κΈ°μ‘΄ λ…Έλ“œλ₯Ό μ‚­μ œ, ꡐ체 λ“± μ‘°μž‘ν•  수 μžˆλ‹€.

innerHTML

  • μš”μ†Œ λ…Έλ“œμ˜ μ½˜ν…μΈ  μ˜μ—­ 사이에 ν¬ν•¨λœ λͺ¨λ“  HTML λ§ˆν¬μ—…μ„ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
  • innerHTML ν”„λ‘œνΌν‹°μ— λ¬Έμžμ—΄μ„ ν• λ‹Ήν•˜λ©΄ μš”μ†Œλ…Έλ“œμ˜ λͺ¨λ“  μžμ‹λ…Έλ“œκ°€ 제거된고 ν• λ‹Ήν•œ λ¬Έμžμ—΄μ˜ νŒŒμ‹±λ˜μ–΄ DOM에 반영
<!DOCTYPE html>
<html>
  <body>
    <ul id="fruits">
      <li class="apple">Apple</li>
    </ul>
  </body>
  <script>
    const $fruits = document.getElementById('fruits');

    // λ…Έλ“œ μΆ”κ°€
    $fruits.innerHTML += '<li class="banana">Banana</li>';

    // λ…Έλ“œ ꡐ체
    $fruits.innerHTML = '<li class="orange">Orange</li>';

    // λ…Έλ“œ μ‚­μ œ
    $fruits.innerHTML = '';
  </script>
</html>
  • innerHTML 단점
    • 크둜슀 μ‚¬μ΄νŠΈ 슀크립트 곡격에 μ·¨μ•½
    • λͺ¨λ“  μžμ‹μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  ν• λ‹Ήν•˜κΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨μ 
    • μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μ‚½μž…ν•  λ•Œ μœ„μΉ˜λ₯Ό 지정할 수 μ—†μŒ

insertAdjacentHTML λ©”μ„œλ“œ

  • κΈ°μ‘΄ μš”μ†Œλ₯Ό μ œκ±°ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μœ„μΉ˜λ₯Ό 지정해 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μ‚½μž…ν•œλ‹€.
  • 첫 번재 인수둜 μœ„μΉ˜λ₯Ό 지정 (beforebegin, afterbegin, beforend, afterend)
<!DOCTYPE html>
<html>
  <body>
    <!-- beforebegin -->
    <div id="foo">
      <!-- afterbegin -->
      text
      <!-- beforeend -->
    </div>
    <!-- afterend -->
  </body>
</html>

λ…Έλ“œ 생성과 μΆ”κ°€

μš”μ†Œ λ…Έλ“œ 생성

  • Document.prototype.createElement(tagName) λ©”μ„œλ“œλŠ” μš”μ†Œ λ…Έλ“œλ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜.
  • tagName μΈμˆ˜μ—λŠ” νƒœκ·Έ 이름을 λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μ„ 전달.
  • createElement λ©”μ„œλ“œλ‘œ μƒμ„±ν•œ μš”μ†Œ λ…Έλ“œλŠ” κΈ°μ‘΄ DOM에 μΆ”κ°€λ˜μ§€ μ•Šκ³  ν™€λ‘œ μ‘΄μž¬ν•˜λŠ” μƒνƒœλ‘œ, 이후에 DOM에 μΆ”κ°€ν•˜λŠ” μ²˜λ¦¬κ°€ ν•„μš”.
  • createElement λ©”μ„œλ“œλ‘œ μƒμ„±ν•œ μš”μ†Œ λ…Έλ“œλŠ” μ•„λ¬΄λŸ° μžμ‹ λ…Έλ“œκ°€ μ—†λŠ” μƒνƒœ.

ν…μŠ€νŠΈ λ…Έλ“œ 생성

  • Document.prototype.createTextNode(text) λ©”μ„œλ“œλŠ” ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜.
  • createTextNode λ©”μ„œλ“œλ‘œ μƒμ„±ν•œ ν…μŠ€νŠΈ λ…Έλ“œλŠ” μš”μ†Œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œμ— μΆ”κ°€λ˜μ§€ μ•Šκ³  ν™€λ‘œ μ‘΄μž¬ν•˜λŠ” μƒνƒœλ‘œ, 이후에 μš”μ†Œ λ…Έλ“œμ— μΆ”κ°€ν•˜λŠ” μ²˜λ¦¬κ°€ ν•„μš”.

ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό μš”μ†Œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ‘œ μΆ”κ°€

  • Node.prototype.appendChild(childNode) λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬ν•œ λ…Έλ“œλ₯Ό λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ…Έλ“œμ˜ λ§ˆμ§€λ§‰ μžμ‹ λ…Έλ“œλ‘œ μΆ”κ°€.
  • childNode μΈμˆ˜μ—λŠ” μΆ”κ°€ν•  μžμ‹ λ…Έλ“œλ₯Ό 전달.
  • μš”μ†Œ λ…Έλ“œμ— μžμ‹ λ…Έλ“œκ°€ ν•˜λ‚˜λ„ μ—†λŠ” κ²½μš°μ—λŠ” textContent ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 것이 λ”μš± κ°„νŽΈ.
  • μš”μ†Œ λ…Έλ“œμ— μžμ‹ λ…Έλ“œκ°€ μžˆλŠ” 경우 textContent ν”„λ‘œνΌν‹°μ— λ¬Έμžμ—΄μ„ ν• λ‹Ήν•˜λ©΄ μš”μ†Œ λ…Έλ“œμ˜ λͺ¨λ“  μžμ‹ λ…Έλ“œκ°€ 제거되고 ν• λ‹Ήν•œ λ¬Έμžμ—΄μ΄ ν…μŠ€νŠΈλ‘œ μΆ”κ°€λ˜λ―€λ‘œ 주의.

λ…Έλ“œ μ‚½μž…

λ§ˆμ§€λ§‰ λ…Έλ“œλ‘œ μΆ”κ°€

  • Node.prototype.appendChild
  • ν˜ΈμΆœν•œ λ…Έλ“œμ˜ λ§ˆμ§€λ§‰ μžμ‹ λ…Έλ“œλ‘œ DOM에 μΆ”κ°€

μ§€μ •ν•œ μœ„μΉ˜μ— λ…Έλ“œ ν•©μž…

  • Node.prototype.insertBefore(newNode, childNode)
  • 첫 번째 인수둜 전달받은 λ…Έλ“œλ₯Ό 두 번째 인수둜 전달받은 λ…Έλ“œ μ•žμ— μ‚½μž…
  • 두 번째 인수둜 전달받은 λ…Έλ“œλŠ” λ°˜λ“œμ‹œ insertBefore λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œ 이어야 ν•œλ‹€.

λ…Έλ“œ 이동

  • DOM에 이미 μ‘΄μž¬ν•˜λŠ” λ…Έλ“œλ₯Ό appendChild λ˜λŠ” insertBefore λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ DOM에 λ‹€μ‹œ μΆ”κ°€ν•˜λ©΄ ν˜„μž¬ μœ„μΉ˜μ—μ„œ λ…Έλ“œλ₯Ό μ œκ±°ν•˜κ³  μƒˆλ‘œμš΄ μœ„μΉ˜μ— λ…Έλ“œλ₯Ό μΆ”κ°€.

λ…Έλ“œ 볡사

  • Node.prototype.cloneNode([deep: true | false])
  • λ§€κ°œλ³€μˆ˜ deep 에 trueλ₯Ό μ „λ‹¬ν•˜λ©΄ κΉŠμ€λ³΅μ‚¬ ,falseλ₯Ό 전달 ν•˜λ©΄ 얕은 볡사
  • 얕은 볡사 경우 μžμ† λ…Έλ“œλ₯Ό λ³΅μ‚¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ,ν…μŠ€νŠΈ λ…Έλ“œλ„ μ—†λ‹€.

λ…Έλ“œ ꡐ체

  • Node.prototype.replaceChild(newChild, oldChild)
  • oldChild λ…Έλ“œλ₯Ό newChild λ…Έλ“œλ‘œ ꡐ체
  • μ΄λ•Œ oldChild λ…Έλ“œλŠ” ν˜ΈμΆœν•œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œ 이어야 ν•œλ‹€.

λ…Έλ“œ μ‚­μ œ

  • Node.prototype.removeChild(child)
  • 인수둜 μ „λ‹¬ν•œ λ…Έλ“œλ₯Ό DOMμ—μ„œ μ‚­μ œ

μ–΄νŠΈλ¦¬ 뷰트

  • HTML λ¬Έμ„œκ°€ νŒŒμ‹± 될 λ•Œ μ–΄ν‹°λ¦¬λ·°νŠΈλŠ” μ–΄ν‹°λ¦¬λ·°νŠΈ λ…Έλ“œλ‘œ λ³€ν™˜ λ˜μ–΄ μš”μ†Œ λ…Έλ“œμ™€ μ—°κ²° 됨
  • ν•˜λ‚˜μ˜ μ–΄νŠΈλ¦¬λ·°νŠΈλ‹Ή ν•˜λ‚˜μ˜ μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œ 생성
  • μ΄λ•Œ λͺ¨λ“  μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œμ˜ μ°Έμ‘°λŠ” μœ μ‚¬ λ°°μ—΄ 객체이자 μ΄ν„°λŸ¬λΈ”μΈ NamedNodeMap 객체에 λ‹΄κ²¨μ„œ μš”μ†Œ λ…Έλ“œμ˜ attributes ν”„λ‘œνΌν‹°μ— μ €μž₯

HTML μ–΄νŠΈλ¦¬λ·°νŠΈ μ‘°μž‘

  • Element.prototype.getAttirbute(attributeName) : μ–΄νŠΈλ¦¬λ·°νŠΈ 값을 μ°Έμ‘°
  • Element.prototype.setAttirbute(attributeName, attributeValue) : μ–΄νŠΈλ¦¬λ·°νŠΈ 값을 λ³€κ²½
  • Element.prototype.hasAttirbute(attributeName) : μ–΄νŠΈλ¦¬λ·°νŠΈ μ‘΄μž¬ν•˜λŠ”μ§€ 확인
  • Element.prototype.removeAttirbute(attributeName) : νŠΉμ • μ–΄νŠΈλ¦¬λ·°νŠΈ μ‚­μ œ

HTML μ–΄νŠΈλ¦¬λ·°νŠΈ vs DOM ν”„λ‘œνΌν‹°

  • μš”μ†Œ λ…Έλ“œ κ°μ²΄μ—λŠ” HTML μ–΄νŠΈλ¦¬λ·°νŠΈμ— λŒ€μ‘ ν•˜λŠ” DOM ν”„λ‘œνΌν‹°κ°€ 쑴재
  • 즉, HTML μ–΄νŠΈλ¦¬ λ·°νŠΈλŠ” 쀑볡 관리 λ˜λŠ” κ²ƒμ²˜λŸΌ 보인닀.
    • μš”μ†Œ λ…Έλ“œμ˜ attributes ν”„λ‘œνΌν‹°μ—μ„œ κ΄€λ¦¬ν•˜λŠ” μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œ
    • μš”μ†Œ λ…Έλ“œμ˜ DOM ν”„λ‘œνΌν‹°

차이점 ꡬ뢄

  • HTML μ–΄νŠΈλ¦¬λ·°νŠΈμ˜ 역할을 HTML μš”μ†Œμ˜ μ΄ˆκΈ°μƒνƒœλ₯Ό 지정, 초기 μƒνƒœλ₯Ό μ˜λ―Έν•˜λ©° λ³€ν•˜μ§€ μ•ŠμŒ
  • μš”μ†Œ λ…Έλ“œλŠ” μƒνƒœ(state)λ₯Ό 가지고 μžˆλ‹€.
  • μš”μ†Œ λ…Έλ“œλŠ” 2κ°œμ΄μƒμ˜ μƒνƒœ(초기 μƒνƒœ 와 μ΅œμ‹  μƒνƒœ)λ₯Ό κ΄€λ¦¬ν•΄μ•Όν•œλ‹€.
  • μš”μ†Œ λ…Έλ“œμ˜ 초기 μƒνƒœλŠ” μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œκ°€ 관리
  • μš”μ†Œ λ…Έλ“œμ˜ μ΅œμ‹  μƒνƒœλŠ” DOM ν”„λ‘œνΌν‹°κ°€ 관리

μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œ

  • HTML μ–΄νŠΈλ¦¬λ·°νŠΈλ‘œ μ§€μ •ν•œ μ΄ˆκΈ°μƒνƒœλŠ” μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œμ—μ„œ 관리
  • 초기 μƒνƒœ 값을 μ·¨λ“ν•˜κ±°λ‚˜ λ³€κ²½ ν•˜λ €λ©΄ getAttribute / setAttribute λ©”μ„œλ“œλ₯Ό μ‚¬μš©

DOM ν”„λ‘œνΌν‹°

  • μ‚¬μš©μžκ°€ μž…λ ₯ν•œ μ΅œμ‹  μƒνƒœλ₯Ό 관리
  • 단 μ‚¬μš©μž μž…λ ₯에 μ˜ν•œ μƒνƒœ 변화와 κ΄€κ³„μžˆλŠ” DOM ν”„λ‘œνΌν‹°λ§Œ μ΅œμ‹  μƒνƒœ 값을 관리( ex- input)

getAttribute λ©”μ„œλ“œλ‘œ μ·¨λ“ν•œ 값은 μ–Έμ œλ‚˜ λ¬Έμžμ—΄ μ΄μ§€λ§Œ, DOM ν”„λ‘œνΌν‹°λ‘œ μ·¨λ“ν•œ μ΅œμ‹  μƒνƒœκ°’μ€ λ¬Έμžμ—΄μ΄ 아닐 수 μžˆλ‹€.

data μ–΄νŠΈλ¦¬λ·°νŠΈμ™€ dataset ν”„λ‘œνΌν‹°

  • data μ–΄ν‹°λ¦¬λ·°νŠΈμ™€ dataset ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•΄ μ–΄νŠΈλ¦¬λ·°νŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈ 간에 데이터λ₯Ό κ΅ν™˜ν•  수 μžˆλ‹€.
  • data μ–΄νŠΈλ¦¬λ·°νŠΈλŠ” data- 접두사 뒀에 μž„μ˜μ˜ 이름을 λΆ™μ—¬ μ‚¬μš©
  • data μ–΄νŠΈλ¦¬λ·°νŠΈ 값은 HTMLElement.dataset ν”„λ‘œνΌν‹°λ‘œ 취득
  • 쑴재 ν•˜μ§€ μ•ŠλŠ” 이름을 ν‚€λ‘œ dataset ν”„λ‘œνΌν‹°μ— ν• λ‹Ήν•˜λ©΄ HTML μš”μ†Œμ— data μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ μΆ”κ°€

μŠ€νƒ€μΌ

인라인 μŠ€νƒ€μΌ μ‘°μž‘

  • HTMLElement.prototype.style ν”„λ‘œνΌν‹°
  • getter / setter κ°€ λͺ¨λ‘ μ‘΄μž¬ν•˜λŠ” μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ‘œ μš”μ†Œ λ…Έλ“œμ˜ 인라인 μŠ€νƒ€μΌμ„ μ·¨λ“ν•˜κ±°λ‚˜ μΆ”κ°€ λ˜λŠ” λ³€κ²½
<!DOCTYPE html>
<html>
<body>
  <div style="color: red">Hello World</div>
  <script>
    const $div = document.querySelector('div');

    // 인라인 μŠ€νƒ€μΌ 취득
    console.log($div.style); // CSSStyleDeclaration { 0: "color", ... }

    // 인라인 μŠ€νƒ€μΌ λ³€κ²½
    $div.style.color = 'blue';

    // 인라인 μŠ€νƒ€μΌ μΆ”κ°€
    $div.style.width = '100px';
    $div.style.height = '100px';
    $div.style.backgroundColor = 'yellow';
  </script>
</body>
</html>

클래슀 μ‘°μž‘

  • class μ–΄νŠΈλ¦¬λ·°νŠΈμ— λŒ€μ‘ν•˜λŠ” DOM ν”„λ‘œνΌν‹°λŠ” class κ°€ μ•„λ‹ˆλΌ className κ³Ό classList
  • class κ°€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ˜ˆμ•½μ–΄μ΄κΈ° λ•Œλ¬Έ

className

  • Element.prototype.className
  • class μ–΄νŠΈλ¦¬λ·°νŠΈμ˜ 값을 λ¬Έμžμ—΄λ‘œ λ°˜ν™˜
  • 클래슀 값이 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μžˆμ„ 경우 κ·ΈλŒ€λ‘œ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜

classList

  • Element.prototype.classList
  • class μ–΄νŠΈλ¦¬λ·°νŠΈμ˜ 정보λ₯Ό 담은 DOMTokenList 객체λ₯Ό λ°˜ν™˜
  • DOMTokenList κ°μ²΄λŠ” class μ–΄νŠΈλ¦¬λ·°νŠΈμ˜ 정보λ₯Όλ‚˜νƒ€λ‚΄λŠ” μ»¬λ ‰μ…˜ 객체둜 μœ μ‚¬ λ°°μ—΄μ΄λ©΄μ„œ 이터블
  • DOMTokenList μ£Όμš” λ©”μ„œλ“œ
    • add(... className) : 인수둜 μ „λ‹¬λœ 1개의 μ΄μƒμ˜ λ¬Έμžμ—΄μ„ class μ–΄νŠΈλ¦¬λ·°νŠΈ κ°’μœΌλ‘œ μΆ”κ°€
    • remove(... className) : 인수둜 μ „λ‹¬ν•œ 1개 μ΄μƒμ˜ λ¬Έμžμ—΄κ³Ό μΌμΉ˜ν•˜λŠ” class μ–΄νŠΈλ¦¬λ·°νŠΈμ—μ„œ μ‚­μ œ (일치 ν•˜λŠ” ν΄λž˜μŠ€κ°€ μ—†μœΌλ©΄ λ¬΄μ‹œλ¨)
    • item(index) : 인수둜 μ „λ‹¬ν•œ index에 ν•΄λ‹Ήν•˜λŠ” 클래슀λ₯Ό class μ–΄νŠΈλ¦¬λ·°νŠΈμ—μ„œ λ°˜ν™˜
    • contains(className) : 인수둜 μ „λ‹¬ν•œ λ¬Έμžμ—΄κ³Ό μΌμΉ˜ν•˜λŠ” ν΄λž˜μŠ€κ°€ class μ–΄νŠΈλ¦¬λ·°νŠΈμ— ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인
    • replace(oldClassName, newClassName) : 첫 번째 인수 클래슀λ₯Ό λ‘λ²ˆμ§Έ 클래슀둜 λ³€κ²½
    • toggle(className[, force]) : 인수둜 μ „λ‹¬ν•œ λ¬Έμžμ—΄κ³Ό μΌμΉ˜ν•˜λŠ” ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λ©΄ μ œκ±°ν•˜κ³  μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ μΆ”κ°€

이 밖에도 forEach, entires, keys, values, supports λ“±μ˜ λ©”μ„œλ“œλ₯Ό 제곡

λŒ“κΈ€