본문 바로가기
JavaScript

JavaScript] DOM Node properties

by Fastlane 2022. 11. 4.
728x90
반응형

출처 : https://javascript.info/basic-dom-node-properties

DOM node classes

다른 DOM nodes는 다른 properties를 갖고 있다. 예를들어 <a> tag에 해당하는 element node는 link와 연관된 properties를 갖는다. 하지만, 공통 properties와 함수도 있다. DOM nodes의 모든 class는 하나의 hierarchy에서 나왔기 때문이다. 

 

hierarchy의 근본은 EventTarget이며 Node에 의해 상속된다. 

  • EventTarget - root 'abstract' class, 근본 추상 클래스, 따라서 모든 DOM nodes는 'events'를 지원한다. 
  • Node - 또한 추상 클래스, core tree 기능(parentNode, nextSibling, childNodes...)을 제공한다. 
  • Document 
  • CharacterData - 추상 클래스 
    • Text
    • Comment
  • Element - element-level navigation(nextElementSibling, children), searching 함수(getElementsByTagName, querySelector)를 제공한다. 
  • HTMLElement - 모든 HTML elements의 basic class이다. 

예를들어 <input> element의 DOM object를 살펴보자. 

상속 순서에 따라 properties를 확인할 수 있다. 

  • HTMLInputElement
  • HTMLElement
  • Element
  • Node
  • EventTarget
  • Object

DOM node class name을 확인하기 위해 Object의 constructor property를 호출한다. 

alert( document.body.constructor.name ); // HTMLBodyElement

또는 단지 toString할 수 있다. 

alert( document.body ); // [object HTMLBodyElement]

상속여부를 확인하기 위해 instanceof를 사용할 수도 있다. 

alert( document.body instanceof HTMLBodyElement ); // true
alert( document.body instanceof HTMLElement ); // true
alert( document.body instanceof Element ); // true
alert( document.body instanceof Node ); // true
alert( document.body instanceof EventTarget ); // true

DOM nodes는 일반적인 JavaScript objects이며, 상속을 위해 prototype기반 class를 사용한다. 

console.dir(elem)을 실행하면, console에서 HTMLElement.prototype, Element.prototype등을 볼 수 있다. 

 

console.dir(elem) vs console.log(elem)

대부분의 browsers에서 console.log, console.dir을 지원한다. 

  • console.log(elem) : element DOM tree를 보여준다. 
  • console.dir(elem) : DOM object로 element를 보여준다. properties를 확인하기 좋다. 
<!DOCTYPE html>
<html lang="en">
  <head>
  </head>
  <body>
    <script>
	console.log(document.body);
	console.dir(document.body);
   </script>
  </body>
</html>

The “nodeType” property

DOM node type을 확인할 수 있지만, 요즘엔 instanceof를 사용한다. 

Tag: nodeName and tagName

alert( document.body.nodeName ); // BODY
alert( document.body.tagName ); // BODY

tagName과 nodeName의 차이점은?

tagName은 Element nodes에만 존재하고, nodeName은 어느 Node에나 정의되어 있다. 

<body><!-- comment -->

  <script>
    // for comment
    alert( document.body.firstChild.tagName ); // undefined (not an element)
    alert( document.body.firstChild.nodeName ); // #comment

    // for document
    alert( document.tagName ); // undefined (not an element)
    alert( document.nodeName ); // #document
  </script>
</body>

element에 대해서는 tagName과 nodeName의 차이점은 없다. 

innerHTML: the contents

innerHTML property는 element 내부의 HTML을 string으로 반환하며, 수정도 가능하다. 

innerHTML이 document내부로 <script> tag를 추가하는 경우, HTML의 일부분이 되지만, script가 실행되지는 않는다. 

Beware: “innerHTML+=” does a full overwrite

elem.innerHTML+="more html"을 사용하여 element를 HTML에 append할 수 있다. 

하지만, 해당 코드는 조심해야 사용해야 한다. 왜냐하면 실행되는 방법이 addition이 아닌 full overwrite이기 때문이다. 

따라서, 기술적으로 아래 두 라인은 동일하다. 

elem.innerHTML += "...";
// is a shorter way to write:
elem.innerHTML = elem.innerHTML + "..."
chatDiv.innerHTML += "<div>Hello<img src='smile.gif'/> !</div>";
chatDiv.innerHTML += "How goes?"; //HTML content를 재생성하고, smile.gif를 reload한다. 
//만약에 chatDiv가 많은 양의 text와 images를 갖고 있다면 reload는 시각적으로 보여질 수 있다.

outerHTML: full HTML of the element

outerHTML은 element의 full HTML이다. innerHTML에 element자신을 더한 것이다. 

innerHTML과 다르게, outerHTML은 DOM element를 수정하지 않는다. 대신에 DOM에서 교체될 수 있다. 

<div>Hello, world!</div>

<script>
  let div = document.querySelector('div');

  // div가 document에서 제거된다. 
  //<p>...</p>가 그 자리에 insert된다. 
  div.outerHTML = '<p>A new element</p>'; // (*)

  // div는 예전값을 그대로 가지고 있다. new HTML은 어느 변수에도 저장되지 않았다. 
  alert(div.outerHTML); // <div>Hello, world!</div> (**)
</script>

nodeValue/data: text node content

innerHTML property는 element node에서만 유효하며, text nodes와 같은 다른 node types에서는 nodeValue, data properties를 사용할 수 있다. 

<body>
  Hello
  <!-- Comment -->
  <script>
    let text = document.body.firstChild;
    alert(text.data); // Hello

    let comment = text.nextSibling;
    alert(comment.data); // Comment
  </script>
</body>

textContent: pure text

<div id="news">
  <h1>Headline!</h1>
  <p>Martians attack people!</p>
</div>

<script>
  // Headline! Martians attack people!
  alert(news.textContent);
</script>

text만 return되며, 모든 tag는 제외된다. 

안전한 방법으로 text를 쓰기 위해서는 textContent가 유용하다. 

  • innerHTML : HTML으로 추가된다. 
  • textContent : text로 추가된다. 
<div id="elem1"></div>
<div id="elem2"></div>

<script>
  let name = prompt("What's your name?", "<b>Winnie-the-Pooh!</b>");

  document.getElementById('elem1').innerHTML = name; //tags가 되므로 bold name을 볼 수 있다. 
  document.getElementById('elem2').textContent = name; //<b>Winnie-the-Pooh!</b> 텍스트를 볼 수 있다. 
</script>

The “hidden” property

<div>Both divs below are hidden</div>

<div hidden>With the attribute "hidden"</div>

<div id="elem">JavaScript assigned the property "hidden"</div>

<script>
  document.getElementById('elem').hidden = true;
</script>

hidden은 style="display:none"과 동일하게 동작한다. 

More properties

DOM elements는 class에 따라 추가적인 properties를 갖고 있다. 

  • value - HTMLInputElement
  • href - HTMLAnchorElement
  • id - HTMLElement
<input type="text" id="elem" value="value">

<script>
  alert(document.getElementById('elem').type); // "text"
  alert(document.getElementById('elem').id); // "elem"
  alert(document.getElementById('elem').value); // value
</script>

브라우저 개발도구에서 Elements tab에서 DOM Properties전체 확인이 가능하다. 

Summary

각 DOM node는 특정 class에 소속되어 있다. DOM node의 주요 properties는 아래와 같다. 

  • nodeType : text 또는 element node인지 볼 수 있다. numeric value를 가지고 있다. 1은 element, 3은 text이며 Read-only이다. 
  • nodeName/tagName : elements에는 tagName을 사용하여 non-elements에는 nodeName을 사용한다. 
  • innerHTML 
  • outerHTM;
  • nodeValue/data
  • textContent
  • hidden

대부분의 HTML attributes는 해당하는 DOM property가 있다. 하지만 항상 같은 것은 아니다. 

728x90
반응형

'JavaScript' 카테고리의 다른 글

JavaScript] document 수정  (0) 2022.11.11
JavaScript] HTML attributes and DOM properties  (0) 2022.11.08
JavaScript] Searching: getElement*, querySelector*  (0) 2022.11.04
JavaScript] DOM Navigation  (0) 2022.11.03
JavaScript] DOM tree  (0) 2022.11.03

댓글