본문 바로가기
JavaScript

DOM

by 융디's 2024. 4. 22.
728x90
DOM

DOM

@2024.04.04

문서 객체 모델 DOM(Document Object Moder)

💡
XML이나 HTML 문서에 접근하기 위한 일종의 인터페이스
  • 문서 내의 모든 요소를 정의하고, 각각의 요소에 접근하는 방법을 제공
  • W3C의 표준 객체 모델이며, 아래 계층 구조로 표현
    html
    └── head
    │    └── title
    │         └── "문서 제목"
    └── body
         └── header
         │    └── h1
         │         └── "웹 페이지 제목"
         └── main
         │    └── article
         │    │    └── h2
         │    │    │    └── "글 제목"
         │    │    └── p
         │    │         └── "글 내용"
         │    └── aside
         │         └── h3
         │              └── "부가 정보"
         └── footer
              └── p
                   └── "푸터 내용"
  • 사용자의 인터렉션(상호작용)에 따라 동적으로 UI를 업데이트하려면

HTML에 JavaScript를 연동해야 가능하다.

JavaScript에서의 DOM

💡
태그에 대한 정보를 지니고 있는 JavaScript 객체

요소 선택

  • document.getElementById('id') : ID에 해당하는 요소 반환
  • document.querySelector('selector') : CSS 선택자에 해당되는 첫 번째 문서 요소 반환
  • document.querySelectorAll('selector') : CSS 선택자에 해당하는 모든 문서의 요소를 반환
    <body>
        <div id="myDiv">Hello, World!</div>
        <div class="container">
            <p>Hello, World!</p>
        </div>
        <div class="container">
            <p>Goodbye, World!</p>
        </div>
        <ul>
            <li>Apple</li>
            <li>Banana</li>
            <li>Orange</li>
        </ul>
    
        <script>
            // ID가 'myDiv'인 요소를 가져옵니다.
            var elementById = document.getElementById('myDiv');
            console.log("getElementById:", elementById.textContent); //Hello, World!
    
            // 클래스가 'container'인 첫 번째 div 요소의 첫 번째 p 요소를 가져옵니다.
            var querySelector = document.querySelector('.container p');
            console.log("querySelector:", querySelector.textContent); //Hello, World!
    
            // 문서 내의 모든 li 요소를 가져옵니다.
            var querySelectorAll = document.querySelectorAll('li');
            console.log("querySelectorAll:"); 
            for (var i = 0; i < querySelectorAll.length; i++) {
              // 각 요소의 텍스트 콘텐츠를 출력합니다.
              console.log(querySelectorAll[i].textContent);
            }
        </script>
    </body>

요소 가져오기

  • element.innerHTML : 요소의 HTML 내용을 읽거나 변경
  • element.innerText : 요소의 텍스트 내용을 읽거나 변경
  • element.textContent : 해당 요소와 그 하위 요소의 모든 텍스트 내용을 읽거나 변경
  • element.getAttribute('attribute') : HTML 요소의 특정 속성 값을 가져온다.
  • element.setAttribute('attribute', 'value') : HTML 요소의 특정 속성을 주어진 값으로 설정
    <body>
        <!-- element.innerHTML -->
        <div id="example1">This is <strong>bold</strong> text.</div>
        <button onclick="changeInnerHTML()">Change innerHTML</button>
        <br><br>
    
        <!-- element.innerText -->
        <div id="example2">This is <strong>bold</strong> text.</div>
        <button onclick="changeInnerText()">Change innerText</button>
        <br><br>
    
        <!-- element.textContent -->
        <div id="example3">This is <strong>bold</strong> text.</div>
        <button onclick="changeTextContent()">Change textContent</button>
        <br><br>
    
        <!-- element.getAttribute() and element.setAttribute() -->
        <p id="example4" class="oldClass">This paragraph has a class attribute.</p>
        <button onclick="changeAttribute()">Change class attribute</button>
    
        <script>
            // element.innerHTML 예시
            // Change innerHTML 버튼을 클릭하면 example1 요소의 내용이 변경
            function changeInnerHTML() {
                var element = document.getElementById('example1');
                element.innerHTML = "This is <em>italic</em> text.";
            }
    
            // element.innerText 예시
            // Change innerText 버튼을 클릭하면 example2 요소의 내용
            function changeInnerText() {
                var element = document.getElementById('example2');
                element.innerText = "This is new text.";
            }
    
            // element.textContent 예시
            // Change textContent 버튼 클릭하면 example3 요소의 내용이 변경
            function changeTextContent() {
                var element = document.getElementById('example3');
                element.textContent = "This is new text without considering <strong> tags.";
            }
    
            // element.getAttribute()와 element.setAttribute() 예시
            // Change class attribute 버튼을 클릭하면 example4 요소의 클래스 속성이 변경
            function changeAttribute() {
                var element = document.getElementById('example4');
                var currentClass = element.getAttribute('class');
                if (currentClass === 'oldClass') {
                    element.setAttribute('class', 'newClass');
                } else {
                    element.setAttribute('class', 'oldClass');
                }
            }
        </script>
    </body>

요소 조작

  • element.style.property = 'value' : HTML 요소의 스타일을 변경
  • element.classList.add('class')

    element.classList.remove('class') ⇒ HTML 요소에 클래스를 추가, 제거 또는 토글

    element.classList.toggle('class')
    • 토글 : 어떤 상태나 설정을 번갈아가며 변경하는 것
      • 불 켜기/끄기 버튼이 있을 때 한번 누르면 켜지고, 한 번 더 누르면 꺼지는 것
  • document.createElement('tag') : 새로운 HTML 요소를 생성
  • element.appendChild(child) : 요소의 자식으로 다른 요소를 추가
  • element.remove() : 요소를 삭제
    <body>
        <!-- element.style.property = 'value' -->
        <p id="myPara">This is a paragraph.</p>
        <button onclick="changeStyle()">Change Style</button>
        <br><br>
    
        <!-- element.classList.add('class'), element.classList.remove('class'), element.classList.toggle('class') -->
        <p id="myDiv" class="highlight">This is a div.</p>
        <button onclick="toggleClass()">Toggle Highlight Class</button>
        <br><br>
    
        <!-- document.createElement('tag'), element.appendChild(child) -->
        <div id="container"></div>
        <button onclick="createNewElement()">Create New Element</button>
        <br><br>
    
        <!-- element.remove() -->
        <div id="removeMe">
            <p>This will be removed.</p>
        </div>
        <button onclick="removeElement()">Remove Element</button>
    
        <script>
            // element.style.property = 'value' 예시
            // Change Style 버튼을 클릭하면 myPara 요소의 스타일이 변경
            function changeStyle() {
                var myPara = document.getElementById('myPara');
                myPara.style.color = 'blue';
                myPara.style.fontSize = '20px';
            }
    
            // element.classList.add('class') 예시
            // element.classList.remove('class') 예시
            // element.classList.toggle('class') 예시
            // Toggle Highlight Class 버튼을 클릭하면 myDiv 요소의 클래스가 추가, 삭제, 토글
            function toggleClass() {
                var myDiv = document.getElementById('myDiv');
                myDiv.classList.add('high');
                myDiv.classList.remove('high');
                myDiv.classList.toggle('highlight');
            }
    
            // document.createElement('tag'), element.appendChild(child) 예시
            // Create New Element 버튼을 클릭하면 새로운 <div> 요소가 생성되고 컨테이너에 추가
            function createNewElement() {
                var container = document.getElementById('container');
                var newDiv = document.createElement('div');
                newDiv.textContent = 'Newly Created Element';
                container.appendChild(newDiv);
            }
    
            // element.remove() 예시
            // Remove Element 버튼을 클릭하면 removeMe 요소가 삭제
            function removeElement() {
                var removeMe = document.getElementById('removeMe');
                removeMe.remove();
            }
        </script>
    </body>

이벤트 처리

  • element.addEventListener('event', function) : HTML 요소에 이벤트 리스너를 추가
  • event.preventDefault() : 이벤트의 기본 동작을 중지.
  • event.stopPropagation() : 이벤트의 상위 요소로의 전파를 중지
    <body>
        <!-- element.addEventListener('event', function) -->
        <button id="myButton">Click Me</button>
        <p id="message"></p>
    
        <!-- event.preventDefault() -->
        <a href="https://www.example.com" id="myLink">Go to Example.com</a>
    
        <!-- event.stopPropagation() -->
        <div id="outer">
            <div id="inner">Inner Div</div>
        </div>
    
        <script>
            // element.addEventListener('event', function) 예시
            // Click Me 버튼을 클릭하면 메시지가 표시
            var button = document.getElementById('myButton');
            var message = document.getElementById('message');
    
            button.addEventListener('click', function() {
                message.textContent = 'Button Clicked!';
            });
    
            // event.preventDefault() 예시
            // Go to Example.com 링크를 클릭하면 경고창이 표시되지만 
            // 기본 동작(페이지 이동)이 발생하지 않습니다.
            var link = document.getElementById('myLink');
    
            link.addEventListener('click', function(event) {
                event.preventDefault();
                alert('Link Clicked, but default action prevented!');
            });
    
            // event.stopPropagation() 예시
            // 내부 <div>를 클릭하면 내부 및 외부 <div>에 대한 각각의 클릭 이벤트가 발생하지만
            // 내부 <div> 클릭 시 이벤트 전파가 중지되어 
            // 외부 <div>의 이벤트가 발생하지 않습니다.
            var outerDiv = document.getElementById('outer');
            var innerDiv = document.getElementById('inner');
    
            outerDiv.addEventListener('click', function() {
                alert('Outer Div Clicked!');
            });
    
            innerDiv.addEventListener('click', function(event) {
                event.stopPropagation();
                alert('Inner Div Clicked, but event propagation stopped!');
            });
        </script>
    </body>

728x90

'JavaScript' 카테고리의 다른 글

이벤트 전파  (0) 2024.04.22
이벤트  (0) 2024.04.22
Promise.all과 Promise.race  (0) 2024.04.21
async/await  (0) 2024.04.21
Promise  (1) 2024.04.21