브라우저가 웹페이지를 읽을 때 과정은 아래와 같다.
- HTML파일을 읽는다.
- 이미지,폰트,CSS파일과 같은 리소스를 읽는다.
- JS를 다운받는다.
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<script>
// after resources (css, font, images ... 모두 다운로드 된 후 호출)
window.addEventListener('load', () => {
console.log('load!');
});
// only document (HTML이 로드되면 즉시 호출)
window.addEventListener('DOMContentLoaded', () => {
console.log('DOMcontentLoaded');
});
</script>
</body>
</html>
위처럼<body>
의 가장 마지막에 스크립트를 넣는 경우, 브라우저가 DOM요소를 모두 읽어 나가는 중 스크립트를 만나면 window
에 eventListner
를 등록하고 리소스가 로딩되면 등록한 콜백함수가 출력된다.
위와 같은 HTML 문서의 생명주기엔 DOMContentLoaded
, load
와 같은 이벤트가 관여하는데 이벤트 발생 순서에 따라 그 역할을 달리한다.
콘솔을 찍어보면 load보다 DOMContentLoaded 이벤트가 먼저 발생되는 것을 알 수 있다.