본문 바로가기
Study/JavaScript

문서 객체 모델 DOM

by 나아가는 2023. 8. 29.
반응형

DOM (Document Object Model) 이란?

 XML, HTML 문서의 각 항목을 계층으로 표현하여 생성, 변형, 삭제할 수 있도록 돕는 인터페이스이다. 

웹 페이지 내의 모든 콘텐츠를 객체로 나타내 준다.
document 객체를 이용해 페이지 내 무엇이든 접근 가능하다.
 

 

DOM 트리

HTML/XML 문서는 브라우저 안에서 DOM트리로 표현된다.
 
아래 document.body 는 <body> 태그를 객체로 나타낸 것이다.

// 배경을 붉은색으로 변경하기
document.body.style.background = "red";

// 1초 후 원상태로 복구하기
setTimeout(() => document.body.style.background = "", 1000);

DOM 다루기

개발자 도구를 사용하면 DOM을 검사하고, 바로 수정해 볼 수 있다.

1. 페이지를 열고, 개발자 도구(F12)를 연 다음 Elements 패널로 이동

2. 콘솔을 이용해 DOM 다루기
* element 탭에서 마지막에 선택한 요소를 $0, 그 이전에 선택한 요소는 $1 으로 접근할 수 있다. 


 

DOM 노드

  • DOM 노드는 노드간 이동, 수정 등을 가능하게 해주는 프로퍼티와 메서드를 지원한다.
  • 이외에 HTML의 주석을 포함한 모든 것은 DOM을 구성한다.

주로 사용되는 네가지 노드

  • 요소 노드(element node) : HTML 태그가 요소 노드가 된다. 트리 구조를 형성한다.
  • 텍스트 노드(text node) : 문자는 텍스트 노드가 된다
  • 문서 노드(document node) : DOM의 진입점
  • 주석노드 (comment)
<!DOCTYPE HTML>
<html>
<body>
  사슴에 관한 진실.
  <ol>
    <li>사슴은 똑똑합니다.</li>
    <!-- comment -->
    <li>그리고 잔꾀를 잘 부리죠!</li>
  </ol>
</body>
</html>

요소 간 이동

탐색 프로퍼티를 사용하면 이웃 노드로 바로 이동할 수 있다.

탐색 프로퍼티는 크게 두 개의 집합으로 나뉜다.

 

1. 모든 노드 접근

parentNode, childNodes, firstChild, lastChild, previousSibling, nextSibling

 

2. 요소 노드(태그) 접근

parentElement, children, firstElementChild, lastElementChild, previousElementSibling, nextElementSibling

 

 
 

+ 테이블 탐색하기

<table id="table">
  <tr>
    <td>일</td><td>이</td>
  </tr>
  <tr>
    <td>삼</td><td>사</td>
  </tr>
</table>

<script>
  // '이'가 적힌 td를 가져옴(첫 번째 줄, 두 번째 칸)
  let td = table.rows[0].cells[1];
  td.style.backgroundColor = "red"; // 강조
</script>

* table.rows[0].cells[1] 로 접근 가능
 

요소 검색하기

요소들이 가까이에 붙어있지 않을 경우 위의 탐색 프로퍼티를 사용해서 원하는 요소에 접근하기 어려울 수 있다.
이럴 때 메서드를 이용해서 특정 요소를 검색할 수 있다.
 

querySeletorAll

주로 사용하는 것이 elem.querySelectorAll(css) 인데,
elem의 자식 요소중에서 css 선택자에 해당하는 요소 모두를 반환한다.
CSS 선택자를 활용할 수 있기 때문에 아주 유용하다.
(* 가상 클래스(pseudo-class)도 사용 가능)
 

querySelector

elem.querySelector(css)는 주어진 css 선택자에 해당하는 첫 번째 요소를 반환한다
(* elem.querySelectorAll(css)[0] 와 동일한 동작)
 

getElementBy*

Id, Name, TagName 등 검색 기준에 따라 메서드를 선택해서 사용 가능하다.
메서드명이 getElementBy 뒤에 검색 기준이 붙는다.
 
(ex) getElementById, getElementsByName, getElementsByTagName, getElementsByClassName ...
(+ getElementsByTagName 와 같이 요소 여러 개를 담은 컬랙션을 반환하는 메서드는 Elements로 "s"가 포함된다.)
 

querySelectorAll와 getElementsBy* 차이점

'getElementsBy'로 시작하는 메서드는 문서에 변경이 있을 때마다 컬렉션이 '자동 갱신’되어 최신 상태를 유지한다.
반면, querySelectorAll 정적인 컬렉션을 반환한다. 컬렉션이 한 번 확정되면 변경되지 않는다.

<div>첫 번째 div</div>

<script>
  let divs = document.getElementsByTagName('div');
  alert(divs.length); // 1
</script>

<div>두 번째 div</div>

<script>
  alert(divs.length); // 2
</script>

문서에 새로운 div 가 추가되어도 querySeletorAll 은 이를 반영하지 못한다.

<div>첫 번째 div</div>

<script>
  let divs = document.querySelectorAll('div');
  alert(divs.length); // 1
</script>

<div>두 번째 div</div>

<script>
  alert(divs.length); // 1
</script>

 

노드 검색 주요 메서드

메서드 검색 기준 호출 대상이 요소가 될 수 있는지에 대한 여부 컬렉션 갱신 여부
querySelector CSS 선택자 -
querySelectorAll CSS 선택자 -
getElementById id - -
getElementsByName name -
getElementsByTagName 태그나 '*'
getElementsByClassName class

 


 
출처

반응형