배워서 남 주자

children vs. childNodes

미래에서 온 개발자 2022. 11. 10. 22:55

childrenchildNodes는 자바스크립트에서 특정 요소의 자식 요소/노드에 대해서 접근할 수 있게 해주는 프로퍼티다. 이 둘의 차이는 무엇일까?

그러려면 일단 요소와 노드의 차이부터 알아야겠다. 결론부터 얘기하자면 node는 element(요소)의 상위 개념이다. DOM 트리구조의 모든 것이 다 node이고, 그 중 element는 html 문서에서 <body>, <div>, <input>, <ul>, <li> 등과 같은 태그를 사용해서 작성된 노드이다.

늘 그렇듯 말로 푸는 설명이 더 어렵기 때문에 바로 예제를 살펴보자.

 

<html>
  <body>
    <div id="nav">
      <!-- 테스트 주석 -->
      <div class="logo"></div>
      <div class="menu-wrapper">
        <div class="menu">menu</div>
        <div class="menu">menu</div>
        <div class="menu">menu</div>
        <div class="profile-photo">photo</div>
      </div>
    </div>
    <div id="news-contents">
      <div class="news-content-wrapper">
        <div class="news-picture">news-picture</div>
        <div class="news-title">news-title</div>
        <div class="news-description">news-description</div>
      </div>
    </div>
    <div id="footer">footer</div>
  </body>
</html>

 


이 중에서 id가 nav<div> 태그를 가져와 해당 요소의 childrenchildNodes를 살펴보자.
콘솔에 찍어보기 전에 HTML 마크업을 먼저 살펴보면 $nav 아래에는 div.logo와 div.menu-wrapper가 있다.

 

 

한 눈에 보이는 가장 큰 차이는 children은 HTML Collection이고, childNodes는 NodeList라는 점이다. 그리고 그 안에 담긴 요소의 개수가 다르다. children에 담긴 div.logo와 div.menu-wrapper가 우리가 html 문서를 봤을 때 바로 알아차릴 수 있는 요소이다.

그럼 대체 childNodes 안에는 뭐가 담겨 있는 건지 열어서 살펴보자.

 

 

div.logo와 div.menu-wrapper 사이에 text와 comment가 보인다.

 

childNodes에 담긴 0번째 요소 text

 

텍스트부터 열어보니 단순히 "\n " 문자열이 담겨 있다. 개행문자인 것이다.

 

childNodes에 담긴 1번째 요소 comment

 

위의 html 마크업으로 다시 돌아가보면 일부러 주석 한 줄을 테스트 삼아 넣어놨는데, 바로 그 주석이다.
여기에서 한 가지 주목해야 할 property가 있는데 바로 nodeType이다. 텍스트의 nodeType 값은 3이고, 주석의 nodeType 값은 8이다. 그렇다면 우리에게 필요한 element node의 nodeType 값은 얼마일까?

 

childNodes에 담긴 3번째 요소 div.logo

 

div.logo는 위의 텍스트나 주석과 달리 너무 많은 프로퍼티를 가지고 있어서 한 화면에 전부 다 담기가 어렵다. 그래도 nodeType 값만 살펴보면 1인 것을 확인할 수 있다. 그리고 nextElementSibling은 div.menu-wrapper이지만, nextSibling은 text인 것도 같이 확인할 수 있다.
그렇다. element는 nodeType 값 1을 가지고 있는, node 중에서 특별한 node인 것이다.

오늘의 주제인 childrenchildNodes의 차이는 사실 그 이름에 이미 답이 담겨 있다. childNodes는 해당 부모 요소의 모든 childNodes가 담긴 NodeList이며, children은 전체 Node 중에서 element node만 HTML Collection에 따로 담아주는 프로퍼티다.


💡 결론
우리가 DOM을 통해 CRUD 하고 싶은 것은 주로 element인 경우가 99.9%일 것이기에 자식 요소에 접근하기 위해서는 children을 사용하면 되겠다.