JavaScript

[JavaScript] DOM (문서 객체)

SangRok Jung 2022. 4. 25. 20:22
반응형

Event문서 객체 (DOM/ Document Object Model)

웹 브라우저는 HTML 페이지에 있는 Element 들을 트리 형식으로 메모리에 로딩한다.

이때 각 노드를 "document object"라 한다.

웹 브라우저는 이러한 문서 객체를 접근할 수 있도록 API(데이터 + 기능)를 제공하는데 이를 "문서 객체 모델(DOM)"이라고 한다.

JS는 DOM을 호출/제어하기 위한 가장 보편적 언어이다.

트리구조가 파일 시스템에서 사용될 때 'NODE'를 '파일'이라고 부른다.

트리구조가 웹브라우저에서 정보를 표현하는데 사용할 때 'NODE'를 'document Object'라고 부른다.

 

* Element = Tag + content

* API = Application Programming Interface, ex) React, Vue, js, n

 

 

 

 

 

 

Object Modle

= DOM + BOM + JS

DOM : HTML 문서 객체의 집합

BOM : 브라우저 자체를 제어하는 객체 집합

JS : 자바스크립트를 위한 객체 집합

 

Object Model

 

 

 

DOM을 제어하기 위한 일반적인 방법

  1. 제어 대상(객체)를 찾는다.
  2. 명령을 내린다.
  3. 브라우저가 처리한다.

 

예시)

  1. 이미지 객체를 찾는다.
  2. 이미지의 사이즈를 변경한다.
  3. 브라우저가 처리한다.

 

 

 

 

기본적인 문서 객체 제어

DOMContentLoadedEvent

초기 HTML 문서를 완전히 불러오고 분석했을 때 발생하는 이벤트.

JS 엔진은 <script>를 순차적으로 (위 → 아래) 수행.

즉 JS엔진은 html 문서가 다 로딩되기 전에도 수행될 수 있음.

객체 제어를 위해서는 문서가 다 로딩되고 나서 제어를 시작해야함. (DOM구조가 다 만들어지고 나서 제어를 수행.)

DOMContentLoaded는 문서가 완전히 로딩되고 난 후 이벤트 발생.

이벤트는 초기 HTML 문서를 완전히 불러오고 분석했을 때 발생합니다.

스타일 시트, 이미지, 하위 프레임의 로딩은 기다리지 않습니다.

* Event : 어떠한 조건이 만족되었을 때 발생되는 신호. Messgae가 꼭 발생하지는 않는다.

* Message : Event의 값

 

DOMContentLoadedEvent 처리

addEventListener()

DOM의 로딩이 끝나면 DOMContentLoaded라는 이벤트가 발생하는 것을 인지했으니

DOMContentedLoaded 이벤트가 발생되면 callbockDOMLoaded를 실행하라.

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        const callbackDOMLoaded = function(){
            document.body.innerHTML += "<h1>hello world</h1>"
        }
        window.addEventListener('DOMContentLoaded', callbackDOMLoaded)
    </script>
</head>

 

 

 

문서 객체의 선택 방법

상위 Document Object의 선택

  • document.head
  • document.body
  • document.title

특정 Document Object의 선택

  • document.querySelector(selector); //단일 선택
  • document.querySelectorAll(selector); //복수 선택

*여기서 selector는 CSS selector와 같다.

(tag, class, id, child, 후손, 속성, 수열)

https://cruella-de-vil.tistory.com/8?category=1015870 

 

 

 

querySelector()

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        const callbackDOMLoaded = function(){
            const header = document.querySelector('h1');
            header.style.color = 'red';
        }
        window.addEventListener('DOMContentLoaded', callbackDOMLoaded)
    </script>
</head>

 

querySelectorAll()

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        const callbackDOMLoaded = function(){
            const header = document.querySelectorAll('h1');
            header.forEach((element) => {
                element.textContent = 'Head';
                element.style.color = 'white';
                element.style.background = 'red';
                element.style.padding = '2px';
            })
        }

        window.addEventListener('DOMContentLoaded', callbackDOMLoaded)
    </script>
</head>
<body>
    <h1></h1>
    <h1></h1>
    <h1></h1>
</body>

 

 

 

 

DOM 구조에서 document element를 단일 선택하는것이 querySelector()이고
복수로 선택하는것이 querySelectAll() 입니다.
선택은 CSS의 selector 규격과 동일합니다.

 

 

 

 

 

속성의 조작

객체.setAttribute() : 속성 설정

객체. getAttribute() : 속성 구현

<body>
    <h1 style="color:red">Hello world</h1>
    
    <script>
        const head1 = document.querySelector('h1')
        let style = head1.getAttribute('style');
        console.log(style);

    </script>
</body>

 

문자 조작

객체.textContent : 입력된 문자열을 해석 없이 그대로 입력객체.innerHTML : 입력된 문자열을 해석하여 HTML 형식으로 출력 Content를 수정하거나 삽입할 경우는 textContent, html 코드를 입력할 때는 innerHTML을 사용한다.

 

 

스타일 조작

css에서 스타일 사용시 '-'를 사용할 수 있으나 자바스크립트에서는 사용할 수 없다.

CSS JS Style
background-color backgroungColor
text-align textAlign

h1.style['background-color'] 형태로 계산된 문자열을 사용할 수 있다.

 

 

 

문서 객체의 생성 및 추가

문서객체의 생성 : document.createElement()

문서 객체의 추가 : 객체.appendChild()

 

 

문서 객체의 제거

부모객체.removeChild(자식객체)

 

setTimeout() 참고 => https://developer.mozilla.org/ko/docs/Web/API/setTimeout

removeChild()

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        const OnContentLoaded = function(event)
        {
            const d1tag = document.querySelector('#d1');
            const h1tag = document.createElement('h1');

            h1tag.textContent = 'hello world';
            d1tag.appendChild(h1tag);

            setTimeout(()=>{ d1tag.removeChild(h1tag); }, 3000);
        }

        

        addEventListener('DOMContentLoaded', OnContentLoaded);      
    </script>
</head>

<body>
    <div id="d1"></div>
</body>

 

 

반응형