[그린컴퓨터] 클라이언트/Javascript

DOM API { DOM API 기본, defer 속성, addEventListener, forEach, textContent }

Ben의 프로그램 2023. 6. 30. 12:16
728x90

  • DOM 이란 브라우저가 HTML 문서를 읽는 과정에서 생성되는 객체이다. 
  • DOM 은 HTML 의 모든 요소를 트리 구조로 가지고 있다. 

  • JS 는 DOM에 접근하여 HTML 요소를 변경할 수 있는 API 를 제공합니다. 
  • 위의 예시보다 훨씬 많은 것들이 있는데, 차차 사용하면서 알아보는 것이 좋습니다. 

console.dir(document);
// dir 메소드는 객체의 속성을 출력한다.
// log 메소드는 객체의 정보를 출력하는 것과 대비된다.
 
 
 
console.log(document);
// log 로 출력된 화면을 보면 태그들이 있는 것을 알 수 있다. 
 

console.dir(document.childNodes);
// 현재 노드의 자식 노드 리스트를 반환한다. 
// 노드란 자료구조에서 많이 사용하는 용어이다. 
// 노드는 앞의 요소와 뒤의 요소를 선으로 연결하는 구조 때문에 노드라는 이름이
// 붙었다. HTML이 body 의 부모 노드인 것이 대표적인 예시다. 
 

console.dir(document.childNodes[1].childNodes);
// document 의 자식 노드 중에 1번(2번째) 노드는 html 이다.
// 즉 html 의 자식 node 를 보여주는 코드이다.
 

 

DOM 사용 예시 (defer, script 태그와 body 태그 위치와 오류의 관계)

<!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 src="../Javascript/DOM2"></script>
    <style>
        .active {
            border: 1px solid blue;
        }
    </style>
</head>
<body>
    <div class="box">BOX1</div>
    <div class="box">BOX2</div>
    <div class="box">BOX3</div>
    <div class="box">BOX4</div>
</body>
</html>

const boxE1 = document.querySelector('.box');
// css 선택자로 요소 선택하였다.
console.log(boxE1);  
// null 이 출력되는데, html 요소가 존재하는데도 찾지 못하는 것을 볼 수 있음.
// html 문서에 script 태그에 defer 속성을 추가해야 한다.
// script 태그를 body 보다 앞에 작성하면 웹 브라우저가 html body 를 읽기도
// 전에 script 가 실행되므로 이런 오류가 발생했던 것이다.
// 따라서 body 뒤에 script 태그를 작성하거나 defer 속성을 추가해야 한다.

  • defer 속성을 넣거나 script 태그의 위치를 body 태그 뒤로 옮기지 않으면 위와 같이 오류가 발생하게 된다. 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script defer src="../Javascript/DOM2"></script>
    <style>
        .active {
            border: 1px solid blue;
        }
    </style>
</head>
 
  • head 태그 안에 script 태그가 있으려면 위와 같이 defer 속성을 넣어주어야 한다. 
<body>
    <div class="box">BOX1</div>
    <div class="box">BOX2</div>
    <div class="box">BOX3</div>
    <div class="box">BOX4</div>
    <script src="../Javascript/DOM2.js"></script>
</body>
  •  혹은 body 영역이 다 끝나고 script 태그를 넣어주면 오류가 발생하지 않는다. 

 

addEventListener 활용하기


const boxE1 = document.querySelector('.box');
// css 선택자로 요소 선택하였다.
console.log(boxE1);  

boxE1.addEventListener('click', function() {
    console.log('Click 되었습니다.');
})
 
  • addEventListener 는 인자로 2개를 받는다. 이벤트와 수행할 함수를 넣어주어야 한다. 함수 인자는 주로 '익명 함수'로 넣어주게 됩니다. 
  • 처음 웹 브라우저를 실행하면 위와 같은 화면을 보게 됩니다. 그리고 box1 을 클릭하는 순간 화면이 다음과 같이 출력됩니다. 
  •  click 되었습니다. 라는 문구가 console 창에 정상적으로 출력된 것을 알 수 있습니다. 

 

addEventListener 활용하기 2 { toggle, contains }


const boxE1 = document.querySelector('.box');
// css 선택자로 요소 선택하였다.
console.log(boxE1);  
// null 이 출력되는데, html 요소가 존재하는데도 찾지 못하는 것을 볼 수 있음.
// html 문서에 script 태그에 defer 속성을 추가해야 한다.
// script 태그를 body 보다 앞에 작성하면 웹 브라우저가 html body 를 읽기도
// 전에 script 가 실행되므로 이런 오류가 발생했던 것이다.
// 따라서 body 뒤에 script 태그를 작성하거나 defer 속성을 추가해야 한다.

boxE1.addEventListener('click', function() {
    boxE1.classList.toggle('active');
    // class 속성에 active 값이 없으면 추가, 있으면 삭제하는 코드다.

    let hasActive = boxE1.classList.contains('active');
    console.log(hasActive);
    // 요소에 active 속성이 있는지 확인하는 코드이다.
})
 
  • Box1 을 클릭할 때마다 box1 의 active 클래스가 추가되고 삭제되고 있는 것을 알 수 있고, active 클래스로 설정될 때마다 해당하는 css 가 적용되는 것을 볼 수 있습니다. 


 

querySelectorAll 활용하기  { forEach }


const boxEls = document.querySelectorAll('.box');
// document.querySelectorAll 이기 때문에 box 클래스를 가진
// 모든 html 요소가 반환된다.
console.log(boxEls);
// 여러개가 반환 되어있는 것을 볼 수 있습니다.

boxEls.forEach(function (boxEl, index) {
    console.log(boxEl, index);
})
// forEach 메소드를 사용하면 요소를 순회할 수 있다.
// 인자로 함수를 사용합니다.
// 위 코드를 보면 boxEls 의 요소들 중 첫 번째 요소를 boxEl 에 담고
// 첫 번째 요소의 index 번호를 index 에 담습니다.
// 그러면 함수 안에서 우리가 각 요소마다 해주고 싶은 것을 하게 됩니다.
// console.log(boxEl, index) 의 결과가 콘솔창에 보이게 됩니다.
 
 

 

querySelector 활용하기  { textContent }



const boxE1 = document.querySelector('.box');
boxE1.textContent = 'Hi~';
 
  • breakPoint 를 걸어 주고 난 이후에 모습을 보면 아직 box1 이 바뀌지 않은 상태임을 알 수 있다. 
  •  코드를 모두 실행되고 나면 BOX1 이 Hi~ 로 수정된 것을 볼 수 있다.