JS

JS 39-1 DOM 탐색하기 1

와라리요 2023. 1. 6. 15:21

  DOM을 이용하면 요소와 요소의 콘텐츠에 무엇이든 할 수 있다. 하지만 무엇가를 하기 전엔, 당연히 조작하고자 하는 DOM 객체에 접근하는 것이 선행되어야 한다.

  DOM에 수행하는 모든 연산은 document 객체로 시작하면 된다.

 


documentElement와 body, head

  • <html> = document.documentElement
    • document를 제외하고 DOM 트리 꼭대기에 있는 문서 노드는 <html> 태그에 해당하는 document.documentElement입니다.

 

  • <body> = document.body
    • document.body는 <body> 요소에 해당하는 DOM 노드로, 자주 쓰이는 노드 중 하나입니다.

 

  • <head> = document.head
    • <head> 태그는 document.head로 접근할 수 있습니다.

 

※ DOM의 null은 '존재하지 않음' 또는 '해당하는 노드가 없음'을 의미함.

 

 


childNodes, firstChild, lastChild로 자식 노트 탐색

 

  • 자식 노드(child node, children) 는 바로 아래의 자식 요소를 나타낸다. 자식 노드는 부모 노드의 바로 아래에서 중첩 관계를 만듭니다. <head>와 <body>는 <html>요소의 자식 노드입니다.

 

  • 후손 노드(descendants) 는 중첩 관계에 있는 모든 요소를 의미합니다. 자식 노드, 자식 노드의 모든 자식 노드 등이 후손 노드가 됩니다.

 

  아래의 예시를 보면 <body>의 자식으로 <div>, <ul>, <script> 이며 후손으로 <li>가 있다.

  childNodes 컬렉션은 텍스트 노드를 포함한 모든 자식 노드를 담고 있습니다.

<html>
<body>
  <div>시작</div>

  <ul>
    <li>항목</li>
  </ul>

  <div>끝</div>

  <script>
    for (let i = 0; i < document.body.childNodes.length; i++) {
      alert( document.body.childNodes[i] ); // Text, DIV, Text, UL, ... , SCRIPT
    }
  </script>
</body>
</html>

 

  그리고 firstChildlastChild프로퍼티를 이용하면 첫 번째, 마지막 자식 노드에 빠르게 접근할 수 있어 자식 노드가 존재하는지 확인할 수 있다.

elem.childNodes[0] === elem.firstChild
elem.childNodes[elem.childNodes.length - 1] === elem.lastChild

 

DOM 컬렉션

  위에서 살펴본 childNodes는 마치 배열 같아 보인다. 하지만 childNodes는 배열이 아닌 반복 가능한(iterable, 이터러블) 유사 배열 객체인 컬렉션(collection) 이다.

 

  childNodes는 컬렉션이기 때문에 아래와 같은 특징을 가지고 있다.

  1. for..of 를 사용할 수 있다. (이터러블이기 때문에 Symbol.iterator 프로퍼티가 구현되어 있어서 for..of를 사용하는 것이 가능하죠.)
  2. 배열이 아니기 때문에 배열 메서드를 쓸 수 없다. (Array.from을 사용하면 ‘진짜’ 배열로 만들면 배열 메서드를 사용할 수 있다.)

  ※ DOM 걸렉션은 읽는 것만 가능하다. for..in문을 사용하면 불필요한 부분까지 반환하기 때문에 사용을 자제하는 것이 좋다.

'JS' 카테고리의 다른 글

JS 40-1 getElement, querySelector로 요소 검색하기 1  (0) 2023.01.10
JS 39-2 DOM 탐색하기 2  (0) 2023.01.09
JS 38-2 DOM 트리 2  (0) 2023.01.04
JS 38-1 DOM 트리 1  (0) 2023.01.03
JS 27 브라우저 환경과 다양한 명세서  (0) 2022.12.29