DOM에서의 Node와 Element

Rosevillage·2023년 1월 8일
0

이번주에 배운 DOM의 내용중 개인적으로 궁금했던 Node와 Element의 차이를 알아본다.

DOM은 Node들의 상하위 계층을 기반으로 구성된다. Node는 여러가지 타입으로 구분되지만 간단하게만 나눈다면 4가지로 유형으로 구분할 수 있다.

  1. 문서 노드 (Document Node) : document(DOM에 접근하기 위한 진입점)
  2. 요소 노드 (Element Node) : 태그
  3. 어트리뷰트 노드 (Attribute Node) : 클래스, id
  4. 텍스트 노드 (Text Node) : 태그내의 텍스트

(각 노드들의 설명은 이해하기 쉽게 단적인 예를 든 것이지 정답이 아니다.)

내가 DOM API를 처음 접했을 때 헷갈렸던 부분이 많은 속성과 메서드들 중 비슷한 역할을 하는 것 같은 속성, 메서드들이 있다는 것이었다. 이들은 주로 Node와 Element로 구분된다.

결론만 간단하게 말하자면 DOM에서 Element는 Node의 하위 개념이다. 즉 요소 노드(Element Node)를 뜻한다.

Node와 Element의 관계

mdn에서는 node를 다음과 같이 정의한다.

  • Node는 여러 가지 DOM 타입들이 상속하는 인터페이스이며 그 다양한 타입들을 비슷하게 처리할 수 있게 한다. 예를들어, 똑같은 메소드를 상속하거나 똑같은 방식으로 테스트를 할수있다

그리고 Element를 다음과 같이 정의한다.

  • Element는 Document 안의 모든 객체가 상속하는 제일 범용적인 기반 클래스로 공통 메서드와 속성만 가지고 있으며, 특정 요소를 더 상세하게 표현하는 클래스가 Element를 상속합니다.
    HTMLElement 인터페이스는 HTML 요소의 기반 인터페이스이고 SVGElement (en-US) 인터페이스는 모든 SVG 요소의 기초입니다.

Element는 부모 인터페이스인 Node의 속성과 메서드를 상속한다. 즉 Element의 속성과 메서드를 사용할 수 있는 객체는 Node의 속성과 메서드를 사용할 수 있다.

비슷하면서 다른 속성

Node.textContent / Element.innerHTML / HTMLElement.innerText

세 가지의 속성이 어떤 차이점을 가지는지 알아본다.

  1. textContent는 노드와 그 자손의 택스트 콘텐츠를 표현한다.
  2. innerText는 요소와 그 자손의 렌더링 된 텍스트 콘텐츠를 나타낸다.
  3. innerHTML은 요소 내에 포함 된 HTML 또는 XML 마크업을 가져오거나 설정한다.
  • textContent vs innerText

    • textContent는 지정된 노드의 유형에 따라 값이 달라지지만 기본적으로 노드의 모든 자식을 주어진 문자열로 이루어진 하나의 텍스트 노드로 대치한다.
    • innerText는 요소와 그 자손의 렌더링 된 텍스트 콘텐츠를 나타낸다.

    textContent는 요소를 포함한 노드의 모든 요소의 콘텐츠를 가져오고, innetText는 렌더링 된 화면에 프린트된 요소만 가져온다.
    또한 innerText는 숨겨진 요소의 텍스트는 반환하지 않지만 textContent는 숨김 요소도 가져온다.

    <div class="text"><style>.text { color: blue; }</style>각 속성이 이 글을 어떻게 표시할까?<br>이곳의 차이가 두드러지게 보이죠<span style="display: none;">짜잔</span></div>
  • textContent vs innerHTML

    • innerHTML는 html요소들을 반환한다. innerHTML으로도 텍스트를 가져오거나 쓸 수 있긴 하지만 textContent는 텍스트를 html로 분석할 필요가 없다는 점에서 성능이 더 좋다.
    • 또한 innerHTML에는 Cross-site scripting (XSS)에 대한 잠재적 보안문제가 있다. 반면 textContent는 그러한 문제가 없다.
    • 하지만 innerHTML은 html로 분석한다는 점에서 텍스트를 요소로 파싱 하능하다는 점이 textContent과의 차이다.

참고 사이트
MDN-Node-Web API

MDN-Element-Web API

MDN-Node.textContent

MDN-HTMLElement.innerText

MDN-Element.innerHTML

0개의 댓글