[JavaScript] 자바스크립트 페이지 로드 시 이벤트 사용하기

2022. 6. 23. 04:32Program/JavaScript

110_자바스크립트 페이지 로드 시 이벤트 사용하기

[적용]

  • DOM 요소 엑세스 타이밍에 맞춰 작업을 처리하고 싶을 때
  • 이미지 로딩이 완료된 후 작업을 처리하고 싶을 때

[문법]

이벤트 발생 타이밍
DOMContentLoaded HTML 문서 로딩 완료 시점 
load 모든 리소스 로딩 완료 시점 

[내용]

자바스크립트에서 DOM 요소의 조작 가능 시점은 HTML 문서의 로딩 완료 시점으로

이 시점에서 DOMContentLoaded 이벤트가 발생한다.

 

페이지 내 .box 요소의 개수를 세는 샘플을 확인해 보자.

다른 샘플과 달리 script 태그에 defer 속성을 부여하지 않는다.

 

HTML                                                                                                                                                              index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css" />
    <script src="main.js"></script>
</head>
<body>
    <main class="main">
        <div class="box">박스</div>
        <div class="box">박스</div>
        <div class="box">박스</div>
    </main>
</body>
</html>

 

JavaScript                                                                                                                                                          main.js

// DOM 엑세스 타이밍에 처리 실행
wondow.addEventListener('DOMContentLoaded', () => {
    // .box 요소 개수 가져오기
    const boxNum = document.querySelectorAll('.box').length;
    // 로그 출력
    console.log(`.box 요소의 개수는 ${boxNum}입니다.`);
});

document.querySelectorAll()은 셀렉터와 일치하는 모든 요소를 가져오며, 

.length는 요소의 개수를 추출한다.

로그에서 .box 요소의 개수가 출력된다.


window.addEventListener('DOMContentloaded', () => {}) 를 사용하지 않는 경우를 확인해 보자.

HTML의 head 태그 안에 script 태그가 존재하는 경우 .box 요소의 로딩보다 자바스크립트가 먼저 실행되어 버리므로

document.querySelectorAll('.box')를 사용해도 .cox를 가져올 수 없게 된다.

그러므로 로그의 결과는 0이 출력된다.

// document.querySelectorAll('.box')는 undefined가 된다.
const boxNum = document.querySelectorAll('.box').length;
// '0'이 출력
console.log(`.box 요소의 개수는 ${boxNum}입니다.`);

 

load 이벤트는 페이지 내 모든 리소스(사진, 사운드, 동영상 등)의 로딩이 완료된 후 발생한다.

그러므로 DOMContentLoaded보다 시점이 느리다.

페이지가 표시되는 시점에 요소를 조작하고 싶다면 일반적으로 DOMContentLoaded를 사용한다.


[Appendix]

script 태그 defer 속성과 DOMContentLoaded

script 태그에 defer 속성을 설정하면 HTML 로딩 후 스크립트가 실행된다.

이는 DOMContentLoaded보다는 발생 시점이 앞선다. 

따라서 defer 속성을 설정하면 DOMContentLoaded의 이벤트 설정은 필요가 없다.

 

HTML                                                                                                                                                              index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css" />
    <script src="main.js"></script>
</head>
<body>
    <main class="main">
        <div class="box">박스</div>
        <div class="box">박스</div>
        <div class="box">박스</div>
    </main>
</body>
</html>

 

JavaScript                                                                                                                                                          main.js

const boxNum = document.querySelectorAll('.box').length;  // '3'이 출력
console.log(`.box 요소의 개수는 ${boxNum}입니다.`);

 


 

 

 

 

 

참조 :
실무에 바로 적용하는 자바스크립트 코드레시피 278
아케다 야스노부, 카노 타케시 지음 / 이춘혁 옮김