본문 바로가기
Kosta DevOps 과정 280기/Java

문서 객체 모델

by 롯슈83 2024. 7. 10.

DOM (Document Object Model) - 문서객체 모델

  • 웹페이지가 로드되면 자바스크립트는 해당페이지의 모든 html 구성요소를 객체로 인식하고 관리한다. 
  • html 의 구성요소인 각각의 태그는 객체로 인식되며,  또 계층형의 구조를 갖는다.
    • html 자식은 head와 body 등의 객체로 인식
    • head자식은 title, titele 자식은 텍스트 글자를 가진 텍스트 노드이며 객체로 인식
  • 위와 같이 html 의 모든 구성요소를 객체로 파악하는 모델을 DOM 이라고 한다.
  • DOM 객체 모델을 이용해 동적인 html을 표현할 수 있다.
  • 사용자 요청에 의하여 새로운 노드 추가, 필요없는 노드를 제거, 수정

정적 html vs 동적 html 

  • 정적 html : 웹 페이지를 실행할 때 처음부터 HTML 태그로 적힌 문서 객체를 말한다.
  • 동적 html : 처음에는 없엇는데 실행 중에 사용자의 요청에 의하여 만들거나 수정하거나 제거하는 것을 뜻한다.

DOM 객체의 잘못된 사용

  • 예시
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //html이 모두 만들어지기도 전에 자바스크립트가 동작하기 때문에 오류가 발생한다.
        //TypeError: Cannot read properties of null (reading 'style')
        //널인 것으로 style  을 설정할 수 없음을 나타냄
        document.getElementById("title").style.background="red";
    </script>
</head>
<body>
    <h1 id="title">JavaScript</h1>
</body>
</html>
  • 해결책1
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1 id="title">JavaScript</h1>
    <script>
        document.getElementById("title").style.background="red";
    </script>
</body>
</html>
  • 해결책2 : 보통은 자바스크립트를 head에 둔다. 그 대신 html 이 모두 만들어지고 난 다음에 동작시키기 위하여 window.onload 라는 이벤트를 연결하여 그 안에 자바스크립트를 써준다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            document.getElementById("title").style.background="red";
        }
    </script>
</head>
<body>
    <h1 id="title">JavaScript</h1>
</body>
</html>

 

대상이 되는 노드 찾기

  • 위의 것들 모두 getElementById 를 제외한 getElementByClassName(), getElementsByName(), getElementsByTagName() 등은 배열로 반환된다.
    • getElementByClassName(), getElementsByName(), getElementsByTagName() 등은  문서 안에 하나밖에 없더라도 배열로 반환한다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            let members = document.getElementsByClassName("member");

            //배열 요소를 모두 배경색을 모두 분홍색으로 설정하기
            for(i = 0; i< members.length; i++){
                members[i].style.background="pink";
            }
        }
    </script>
</head>
<body>
    <h1 class="member">강동균</h1>
    <h1>홍길동</h1>
    <h1 class="member">박성빈</h1>
    <h1 class="member">유현진</h1>
    <h1>이순신</h1>
    <h1 class="member">최가은</h1>
    <h1>유관순</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            let h1 = document.getElementsByTagName("h1");

            //h1 요소를 모두 배경색을 모두 노랑색으로 설정하기
            for(i = 0; i< h1.length; i++){
                h1[i].style.background="yellow";
            }
        }
    </script>
</head>
<body>
    <h1>강동균</h1>
    <h3>서울시 종로구 관철1동</h3>
    <h1>박성빈</h1>
    <h3>서울시 종로구 관철2동</h3>
    <h1>유현진</h1>
    <h3>서울시 종로구 관철3동</h3>
</body>
</html>
  • 자바의 for each 와 다르게 js 의 for each 는 속성값(배열이면 인덱스)를 가져온다.

 

추가적인 선택자(css처럼 선택할 수 있는 선택자들)

  • querySelector() --> 1개 반환한다.
  • querySelectorAll() --> 여러개를 반환한다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            let css = document.querySelector("#css");
            css.style.background="red";
        }
    </script>
</head>
<body>
    <h1>HTML</h1>
    <h1 id="css">CSS</h1>
    <h1>JavaScript</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function(){
            let members = document.querySelectorAll(".member");

            //배열 요소를 모두 배경색을 모두 분홍색으로 설정하기
            for(i = 0; i< members.length; i++){
                members[i].style.background="pink";
            }
        }
    </script>
</head>
<body>
    <h1 class="member">강동균</h1>
    <h1>홍길동</h1>
    <h1 class="member">박성빈</h1>
    <h1 class="member">유현진</h1>
    <h1>이순신</h1>
    <h1 class="member">최가은</h1>
    <h1>유관순</h1>
</body>
</html>

 

'Kosta DevOps 과정 280기 > Java' 카테고리의 다른 글

변수의 자료형  (0) 2024.07.10
문서 객체 조작  (0) 2024.07.10
객체  (0) 2024.07.10
미디어 쿼리 설정  (0) 2024.07.09
반응형 웹  (0) 2024.07.08