본문 바로가기
Frontend/JavaScript

[JavaScript] 문서 객체 모델 이해하기 (document편-1)

by 희디 2023. 7. 29.

웹 브라우저는 생성한 문서 객체 모델을 통해 HTML 문서의 구성 요소를 객체로 인식할 수 있다. 

자바스크립트는 웹 브라우저의 문서 객체 모델을 조작해 웹 브라우저에 표시되는 HTML 문서 구조를 변경하거나 새로운 구성 요소를 추가하는 등의 작업을 할 수 있다. 

 

1) 문서 객체 모델이 생성되는 방식 

 

1. 문서 객체 모델은 웹 브라우저가 HTML 문서를 해석

2. 해석한 HTML 문서 구조를 객체로 변환하는 방식으로 생성

3. 생성한 문서 객체 모델을 웹 브라우저에 표시 

=> 웹 브라우저에 표시되는 HTML 문서는 내부적으로 문서 객체 모델을 해석해서 보이게 된다. 

 

문서 객체 모델은 tree 구조를 가지며, DOM 트리라고 불린다. 

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Document Object Model</title>
</head>
<body>
	<h1>header</h1>
    <a href="#">link</a>
</body>
</html>
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Document Object Model</title></head><body><h1>header</h1><a href="#">link</a></body></html>

위의 코드를 DOM 트리로 변환하면 아래와 같다. (enter를 치면 공백도 노드가 되므로 DOM을 이해하기 어려워 줄 바꿈이 되지 않음!) 

 

노드 (node) : document 객체 하위에 HTML 태그요소, 속성, 텍스트 주석등이 트리형태로 구성되는 각각의 것.

루트 노드(root node) : DOM 트리의 가장 꼭대기에 있는 노드 (html이 루트 노드가 됨. 객체는 포함X) 

각 노드는 부모,자식,형제 관계가 형성된다. 

 

노드 타입. 

 

CSS 노드는 없다. 

 

 

노드 선택하기 

 

노드 탐색 속성 (주로 요소 노드로 탐색함) 

document.firstChilld;
document.firtstElementChild;

// 노드 탐색 속성 연속으로 사용
document.childNodes[1].firstElementChild.firstElementChild.nextElementSibling;

(여긴 조금 이해가 잘 안되었다. 해도,,,)

 

 

메서드로 노드 선택하기 

1. 속성값과 태그명 사용하기 (get 메소드) 

<body>
    <h1 id="title">title</h1>
    <p class="text">text-1</p>
    <p class="text">text-2</p>
    <script>
      // id 속성값이 title인 요소 노드 1개 선택하기
      const el = document.getElementById("title");
      console.log(el); 
      
      // class 속성값이 text인 요소 노드 모두 선택하기
      const classEl = document.getElementsByClassName("text");
      console.log(classEl);
      
      // p 태그에 해당하는 요소 노드 모두 선택하기
      const tagEls = document.getElementsByTagName("p");
      console.log(tagEls);
    </script>
  </body>

HTMLCollection 객체나 NodeList 객체 등에 담겨 반환되며 배열과 비슷하게 보인다고 해서 유사배열이며, 그래서 아래와 같이 배열의 인덱스로 요소에 하나씩 접근할 수 있다. 

<body>
    <h1 id="title">title</h1>
    <p class="text">text-1</p>
    <p class="text">text-2</p>
    <script>
      const text = document.getElementsByClassName("text");
      console.log(text[0]);
      console.log(text[1]);
      const tag = document.getElementsByTagName("p");
      console.log(tag[0]);
      console.log(tag[1]);
    </script>
  </body>

 

 

CSS 선택자 

메서드 형식 설명
querySelector(<CSS 선택자>) 매개변수로 넘어오는 CSS 선택자에 해당하는 노드를 1개만 선택한다. 
querySelectorAll(<CSS 선택자>) 매개변수로 넘어오는 CSS 선택자에 해당하는 노드를 모두 선택한다. 

CSS 선택자에는 태그 선택자, 클래스 선택자, 아이디 선택자. 가능

그리고 .box1 > p 처럼도 표현 가능

<body>
    <div class="box-1">
      <p class="text">text-1</p>
      <p class="text">text-2</p>
    </div>
    <div class="box-2">
      <p class="text">text-3</p>
      <p class="text">text-4</p>
    </div>
    <div>
        <p id = "box">text-id</p>
    </div>

    <script>
        const text = document.querySelector(".box-1");
        const textID = document.querySelector("#box");
        console.log(text);
        console.log(textID);
    </script>
  </body>

querySelector로 class 선택자는 .클래스명, id 선택자는 #아이디명으로 지정할 수 있다. 

 

<body>
    <div class="box-1">
      <p class="text">text-1</p>
      <p class="text">text-2</p>
    </div>
    <div class="box-2">
      <p class="text">text-3</p>
      <p class="text">text-4</p>
    </div>
    <div>
        <p id = "box">text-id</p>
    </div>

    <script>
        const text = document.querySelector(".box-1");
        const textCd = document.querySelectorAll(".box-1 .text");
        const textID = document.querySelector("#box");
        console.log(text);
        console.log(textCd);
        console.log(textID);
    </script>
  </body>

 

querySelectorAll은 NodeList객체에 담아 반환한다.