11. DOM ν™•μž₯

· β˜• 3 min read · πŸ‘€... views

λ‹€λ£¨λŠ” λ‚΄μš©

  1. μ„ νƒμž API 에 λŒ€ν•œ 이해
  2. HTML5 DOM ν™•μž₯ μ‚¬μš©
  3. λΈŒλΌμš°μ € μ „μš© DOM ν™•μž₯ μ‚¬μš©

1. μ„ νƒμž API

  • CSS μ„ νƒμžλ‘œ νŒ¨ν„΄μ„ λ§Œλ“€κ³  그에 λ§žλŠ” DOM μš”μ†Œλ₯Ό μ„ νƒν•˜λŠ” λŠ₯λ ₯
    • (Ex. jQuery)

1-1 querySelector()

  • CSS 쿼리λ₯Ό λ°›κ³  νŒ¨ν„΄μ— μΌμΉ˜ν•˜λŠ” 첫 번째 μžμ† μš”μ†Œλ₯Ό λ°˜ν™˜ μ—†μœΌλ©΄ null

    1
    2
    3
    4
    5
    6
    7
    
    var body = document.querySelector('body');
      
    // ID κ°€ 'div1' 인 μš”μ†Œ
    var div1 = document.querySelector('#div1');
      
    // ν΄λž˜μŠ€κ°€ selected 인 것 쀑 첫 번째
    var selected = document.querySelector('.selected')
    
  • Document νƒ€μž…μ—μ„œ ν˜ΈμΆœν•˜λ©΄ νŒ¨ν„΄μ— λ§žλŠ” μš”μ†Œλ₯Ό λ¬Έμ„œμ—μ„œ 찾으며 Element νƒ€μž…μ—μ„œ ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή μš”μ†Œμ˜ μžμ†μ—μ„œλ§Œ 쿼리

1-2 querySelectorAll()

  • querySelector() 와 λΉ„μŠ·ν•˜λ‚˜ μΌμΉ˜ν•˜λŠ” λ…Έλ“œ 전체λ₯Ό λ°˜ν™˜

  • 처음 μ ‘κ·Όν•œ μƒνƒœμ˜ NodeList 의 정적 μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

    1
    2
    3
    
    var ems = document.getElementById('myDiv').querySelectorAll('em');
      
    var selecteds = document.querySelectorAll('.selected');
    

2. HTML5

  • λ§ˆν¬μ—… 언어와 ν•¨κ»˜ μ‚¬μš©ν•˜λ„λ‘ λ””μžμΈλœ μžλ°”μŠ€ν¬λ¦½νŠΈ API λ₯Ό μƒμ„Ένžˆ μ„€λͺ…ν•˜κ³  μ •μ˜

2-1 클래슀 κ΄€λ ¨

  1. getElementsByClassName()

    • 클래슀 이름 λ¬Έμžμ—΄μ„ λ§€κ°œλ³€μˆ˜λ‘œ λ°›μŒ
    • ν•΄λ‹Ή 클래슀λ₯Ό κ°€λͺ¨λ‘ 가진 μš”μ†Œμ˜ NodeList λ°˜ν™˜
    1
    2
    3
    
    // div1 의 μžμ† 쀑 selected ν΄λž˜μŠ€κ°€ μžˆλŠ” μš”μ†Œλ₯Ό λͺ¨λ‘ 찾음
    var selected = document.getElementById('div1')
    .getElementByClassName('selected');
    
  2. classList ν”„λ‘œνΌν‹°

    • 클래슀 이름을 μ•ˆμ „ν•˜κ³  λ‹¨μˆœν•˜κ²Œ μ‘°μž‘ κ°€λŠ₯
    • DOMTokenListλž€ μ»¬λ ‰μ…˜ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€
    • add(value) - 주어진 λ¬Έμžμ—΄ 값을 λͺ©λ‘μ— μΆ”κ°€
    • contains(value) - 주어진 값이 λͺ©λ‘μ— μ‘΄μž¬ν•˜λ©΄ ? true : false
    • remove(value) - 주어진 λ¬Έμžμ—΄ 값을 λͺ©λ‘μ—μ„œ 제거
    • toggle(value) - 값이 λͺ©λ‘μ— μ‘΄μž¬ν•˜λ©΄ ? 제거 : μΆ”κ°€
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    // disabled 클래슀 제거
    div.classList.remove('disabled');
       
    // current 클래슀 μΆ”κ°€
    div.classList.add('current');
       
    // user 클래슀 ν† κΈ€
    div.classList.toggle('user');
       
    // bd 클래슀 포함여뢀 확인
    if(div.classList.contains('bd')) {
      // do Something
    }
    

2-2 포컀슀 관리

  • μ‚¬μš©μžκ°€ μ§€κΈˆ νŽ˜μ΄μ§€λ₯Ό 보고 μžˆλŠ”μ§€ μ•Œ 수 있음

  • document.activeElement, focus()

    1
    2
    3
    4
    
    var button = document.getElementById('myButton');
    button.focus();
    console.log(document.activeElement === button); // treu
    console.log(document.hasFocus()); // true
    

2-3 HTMLDocument의 λ³€ν™”

  • readyState : λ¬Έμ„œλ₯Ό λΆˆλŸ¬μ™”λŠ”μ§€ 확인
    • loading - λ¬Έμ„œλ₯Ό λΆˆλŸ¬μ˜€λŠ” 쀑
    • complete - λ¬Έμ„œλ₯Ό μ™„μ „νžˆ 뢈러옴

2-4 μ»€μŠ€ν…€ 데이터 속성

  • λ Œλ”λ§μ— ν•„μš”ν•œ μ •λ³΄λ‚˜ μ‹œλ©˜ν‹± 값이 μ•„λ‹Œ 데이터λ₯Ό 접두사 data- κ°€ 뢙은 λΉ„ν‘œμ€€ 속성에 제곡

  • dataset ν”„λ‘œνΌν‹°λ‘œ μ ‘κ·Ό κ°€λŠ₯

    1
    2
    3
    4
    5
    6
    
    <div id="myDiv" data-appId="111" data-myName="snack"></div>
      
    var div = document.getElementById("myDiv");
      
    var appId = div.dataset.appId;
    var myName = div.dataset.myName;
    
  • μš”μ†Œμ— 데이터λ₯Ό μ—°κ²°ν•΄μ•Ό ν•˜μ§€λ§Œ, μ‚¬μš©μžμ—κ²ŒλŠ” 보이고 싢지 μ•Šμ„ λ•Œ 유용

2-5 λ§ˆν¬μ—… μ‚½μž…

  • innerHTML

    • 읽기λͺ¨λ“œλ‘œ μ‚¬μš© μ‹œ μš”μ†Œμ™€ 주석, ν…μŠ€νŠΈ λ…Έλ“œ λ“±μ˜ μžμ‹ λ…Έλ“œλ₯Ό λͺ¨λ‘ λ‚˜νƒ€λ‚΄λŠ” HTML ν‘œν˜„μ„ λ°˜ν™˜ (직렬화 ν›„ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜)
    • μ“°κΈ° λͺ¨λ“œλ‘œ μ‚¬μš© μ‹œ 주어진 값을 λ°”νƒ•μœΌλ‘œ μžμ‹ λ…Έλ“œλ₯Ό ꡐ체
    • <script>둜 μ‚½μž…λœ 것은 μ‹€ν–‰λ˜μ§€ μ•ŠμŒ
  • outerHTML

    • ν˜ΈμΆœν•œ HTML μš”μ†Œλ₯Ό μžμ‹ λ…Έλ“œμ™€ ν•¨κ»˜ λ°˜ν™˜
1
2
3
4
5
6
<div>
  <span>hi!</span>
</div>

//innerHTML - div μ—μ„œ innerHTML -> <span>만 ν¬ν•¨ν•˜λŠ” 객체
//outerHTML - div μ—μ„œ outerHTML -> div κ°€ ν¬ν•¨λœ 객체
  • insertAdjacentHTML

    • beforebegin - λ°”λ‘œ μ•ž μ‚½μž…
    • afterbegine - 첫 번째 μžμ‹μœΌλ‘œ μ‚½μž…
    • beforeend - λ§ˆμ§€λ§‰ μžμ‹μœΌλ‘œ μ‚½μž…
    • afterend - λ°”λ‘œ 뒀에 μ‚½μž…
  • λ©”λͺ¨λ¦¬μ™€ μ„±λŠ₯ 문제

    • μš”μ†Œμ™€ 이벀트 ν•Έλ“€λŸ¬ μ‚¬μ΄μ˜ 연결이 λ©”λͺ¨λ¦¬μ— 남기 λ•Œλ¬Έμ—, μœ„μ˜ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  땐 μ œκ±°ν•  μš”μ†Œμ˜ 이벀트 ν•Έλ“€λŸ¬λ‚˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 객체 ν”„λ‘œνΌν‹°λ₯Ό λͺ¨λ‘ μ œκ±°ν•΄μ•Ό 함

2-6 scrollIntoView()

  • λΈŒλΌμš°μ € μ°½μ΄λ‚˜ μ»¨ν…Œμ΄λ„ˆ μš”μ†Œλ₯Ό μŠ€ν¬λ‘€ν•΄μ„œ ν•΄λ‹Ή μš”μ†Œκ°€ λ·°ν¬νŠΈμ— 보이게 함

    1
    2
    
    //forms[0] μš”μ†Œλ‘œ 이동
    document.forms[0].scrollIntoView();
    

3. μ „μš© ν™•μž₯

3-1 λ¬Έμ„œλͺ¨λ“œ

  • IEμ—μ„œ λ„μž…ν•œ κ°œλ…μœΌλ‘œ 각 λͺ¨λ“œλ§ˆλ‹€ CSS, μžλ°”μŠ€ν¬λ¦½νŠΈ κΈ°λŠ₯이 닀름
  • document.documentMode
  • νŠΉμ • λ¬Έμ„œ λͺ¨λ“œλ₯Ό κ°•μ œν•  수 있으며, νŽ˜μ΄μ§€κ°€ μ–΄λ–»κ²Œ λ™μž‘ν• μ§€ 힌트λ₯Ό 얻을 수 있음

3-2 children ν”„λ‘œνΌν‹°

  • μš”μ†Œμ˜ μžμ‹ μš”μ†Œλ§Œ ν¬ν•¨ν•˜λŠ” HTMLCollection
  • μš”μ†ŒμΈ λ…Έλ“œλ§Œ ν¬ν•¨ν•œλ‹€λŠ” 점을 μ œμ™Έν•˜λ©΄ childNodes 와 κ°™μŒ

3-3 contains()

  • 주어진 λ…Έλ“œκ°€ λ‹€λ₯Έ λ…Έλ“œμ˜ μžμ†μΈμ§€ 확인 κ°€λŠ₯

    1
    
    document.documentElement.contains(document.body); // true
    

3-4 innerText, outterText

  • ν…μŠ€νŠΈ λ…Έλ“œλ₯Ό λͺ¨λ‘ κ²°ν•©ν•œ 값을 λ°˜ν™˜
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<P>hello</P>
<ul>
  <li>go 1</li>
  <li>go 2</li>
</ul>
-----------------------------
/* result */
hello
go 1
go 2
  • νŒŒμ΄μ–΄ν­μŠ€ μ—μ„œλŠ” textContent
  • outterText 의 경우 μžμ‹ μ„ ν˜ΈμΆœν•œ μš”μ†Œ 전체λ₯Ό λ³€κ²½ν•˜κΈ°μ— μ‚¬μš©μ„ 지양

3-5 슀크둀

  • scrollIntoViewIfNeeded(alignCenter) - ν˜ΈμΆœν•œ μš”μ†Œκ°€ λ·°ν¬νŠΈμ—μ„œ 보이지 μ•Šμ„ 경우만 ν•΄λ‹Ή μš”μ†Œλ‘œ 이동
    • 크둬, 였페라 μ‚¬νŒŒλ¦¬λ§Œ κ΅¬ν˜„
  • scrollByLines(lineCount) - lineCount 의 숫자 만큼 슀크둀
    • νŒŒμ΄μ–΄ ν­μŠ€μ—μ„œλ§Œ κ΅¬ν˜„ (μ°Έκ³ )
  • scrollByPages(pageCount) - pageCount 의 숫자 만큼 νŽ˜μ΄μ§€ 슀크둀
    • νŒŒμ΄μ–΄ ν­μŠ€μ—μ„œλ§Œ κ΅¬ν˜„ (μ°Έκ³ )
  • λͺ¨λ“  λΈŒλΌμš°μ €μ—μ„œ μ§€μ›ν•˜λŠ” 것은 scrollIntoView() μ΄λ―€λ‘œ 보톡 이 λ©”μ†Œλ“œλ§Œ μ‚¬μš©
Share on

snack
WRITTEN BY
snack
Web Programmer


What's on this Page