본문 바로가기
[JavaScript]

[javascript] Dom이란? - 2 (Dom 트리)

by 쥰5017 2022. 9. 5.

 

DOM 트리

DOM의 기본 개념을 기반으로 문서의 계층 구조를 그림으로 나타낸 것을 DOM 트리라 한다.

 

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8">
    <title>JS with Codeit</title>
  </head>
  <body>
    <h1 id="title">DOM(Document Object Model)</h1>
    <h2 id="sub-title">문서 객체 모델</h2>
    <script src="index.js"></script>
  </body>
</html>

 

위의 코드 계층 구조를 그림으로 나타내면 아래와 같다.

 

이때 그림에 나타낸 박스 하나하나를 노드라 부르고

위아래 계층 구조에 부모 자식 관계, 좌우 계층 구조에 형제 관계가 맺어진다.

 

 

+ Node type)

각 노드의 성격에 따라 노드를 분류한 것을 노드 타입이라고 하는데 총 12가지가 있다.

주로 사용하는 것은 4가지이다.

  • 요소 노드 : html 태그에서 만들어지며 dom 트리를 구성하는 블록이 되는 노드
  • 텍스트 노드 : 오로지 텍스트로만 이루어진 노드 
  • 문서 노드 : dom의 진입점이 되는 document 노드
  • 주석 노드 : 화면에 보이지는 않지만, 정보를 기록하고 js를 사용해 이 정보를 dom으로부터 읽을 수 있는 노드

텍스트 노드는 위의 그림에서 회색 노드들을 말하며 이들은 요소 노드의 자식 노드가 되는 것만 가능하고 자신의 자식 노드를 가지는 것은 불가능하다. 트리의 가장 끝 부분이 되므로 잎 노드(leaf node)라고도 한다.

 

 

DOM 트리 탐색

DOM 계층 구조를 이용해 노드에 접근하는 방법

프로퍼티 유형 결과
element.children 자식 요소 노드 element의 자식 요소 모음(HTMLCollection)
element.firstElementChild 자식 요소 노드 element의 첫 번째 자식 요소 하나
element.lastElementChild 자식 요소 노드 element의 마지막 자식 요소 하나
element.parentElement 부모 요소 노드 element의 부모 요소 하나
element.previousElementSibling 형제 요소 노드 element의 이전(previous) 혹은 좌측(left)에 있는 요소 하나
element.nextElementSibling 형제 요소 노드 element의 다음(next) 혹은 우측(right)에 있는 요소 하나

이 프로퍼티들은 노드 중에서도 '요소 노드'인 경우에만 존재하는 프로퍼티이다. 텍스트 노드에 접근하고 싶을 땐 element를 빼고 사용하면 된다. element를 빼고 사용할 때 주의할 점은, 코드 상에서 가독성을 위해 개행을 한 경우에도 text노드가 생성이 되기 때문에 의도치 않은 노드를 선택하게 될 수 있다. 그래서 실무에서는 element를 빼고 사용하지 않는 편이라고 한다.

 

 

예시)

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>JS with Codeit</title>
</head>
<body>
  <div id="content">
    <h2 id="title-1">Cat-1</h1>
    <ul id="list-1">
      <li>Ragdoll</li>
      <li>British Shorthair</li>
      <li>Scottish Fold</li>
    </ul>
  </div>
  <script>
  	const myTag = document.querySelector('#list-1');

    console.log(myTag); //list-1 리스트 모두 출력
    
    //형제 요소 노드
    console.log(myTag.previousElementSibling); //h2 Cat-1
    //list-1은 ul 태그이고 ul과 h2가 형제이므로
    
    //부모 요소 노드
    console.log(myTag.parentElement); //div content
    
    //자식 요소 노드
    console.log(myTag.children[1]); //li British Shorthair
    console.log(myTag.firstElementChild); //li Ragdoll
  </script>
</body>
</html>

 

myTag.children[1].nextElementSibling (<li> Scottish Fold 출력)과 같이 프로퍼티를 이어서 사용할 수 있다.

 

 

 

자료 참고: 코드잇

댓글