HTML 문서 생명주기

DOMContentLoaded: DOM 준비 완료

DOMConetnLoaded 이벤트는 HTML 문서가 파싱되어 DOM 트리가 완성된 시점에 발생합니다. 외부 자원(이미지, 스타일시트 등)은 아직 로드되지 않았으므로, DOM 조작이나 초기화 작업에 주로 사용됩니다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>DOMContentLoaded 활용</title>
  <style>
    #message { color: #1976d2; font-weight: bold; }
  </style>
</head>
<body>
  <div id="message">로딩 중...</div>
  <img src="https://picsum.photos/200" alt="큰 이미지">
  <script>
    document.addEventListener('DOMContentLoaded', () => {
      const message = document.getElementById('message');
      message.textContent = 'DOM 준비 완료!';
      console.log('이미지 로드 여부:', document.querySelector('img').complete); // false 가능성
    });
  </script>
</body>
</html>
  • DOMContentLoaded: DOM 완성 후 즉시 메시지 변경
  • 이미지 로드 전이므로 크기나 상태 정보는 불완전

load: 모든 자원 로드 완료

load 이벤트는 HTML 문서를 포함하여 이미지, 스타일시트 등 외부 자원까지 모두 불러온 후에 발생합니다. 화면에 표시되는 요소의 최종 상태를 반영해야 할 때 적합합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>load 이벤트 활용</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
</head>
<body>
  <section class="section">
    <h1 class="title">로드 완료</h1>
    <img id="banner" src="https://picsum.photos/400" alt="배너">
  </section>
  <script>
    window.addEventListener('load', () => {
      const banner = document.getElementById('banner');
      console.log(`배너 크기: ${banner.offsetWidth}x${banner.offsetHeight}`);
      document.querySelector('.title').textContent = '모든 자원 로드 완료!';
    });
  </script>
</body>
</html>

페이지 내의 이미지와 모든 자원이 완전히 로드된 후, 이미지의 실제 크기를 사용자에게 알리는 간단한 작업을 수행합니다.

beforeunload와 unload: 페이지 이탈 관리

  • beforeunload: 사용자가 페이지를 떠나기 직전 발생, 저장되지 않은 변경사항이나 경고 메시지를 표시할 때 유용합니다.
  • unload: 페이지가 완전히 종료될 때 발생, 간단한 정리 작업이나 통계 데이터를 서버로 전송할 때 사용됩니다.
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>beforeunload와 unload</title>
</head>
<body>
  <h1>작업 저장 확인</h1>
  <textarea id="note" placeholder="여기에 메모를 입력하세요"></textarea>
  <script>
    const note = document.getElementById('note');

    window.addEventListener('beforeunload', (e) => {
      if (note.value.trim()) {
        e.preventDefault();
        e.returnValue = ''; // 모던 브라우저에서 기본 메시지 표시
      }
    });

    window.addEventListener('unload', () => {
      const data = { page: location.pathname, exitTime: Date.now() };
      // 비동기 로그 전송, 페이지 종료에 영향 최소화
      navigator.sendBeacon('/log-exit', JSON.stringify(data));
    });
  </script>
</body>
</html>

document.readyState와 readystatechange: 로딩 상태 추적

document.readyState 프로퍼티는 문서 로드 상태를 가집니다.

  • loading: 문서 로딩 중
  • interactive: DOM 완성, 외부 자원 로딩 중
  • complete: 모든 자원 로드 종료
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>readyState 추적</title>
  <style>
    #progress { font-size: 18px; color: #388e3c; }
  </style>
</head>
<body>
  <div id="progress">상태: 로딩 중...</div>
  <img src="https://picsum.photos/500" alt="큰 이미지">
  <script>
    const progress = document.getElementById('progress');

    function updateProgress(state) {
      const states = {
        'loading': '상태: 로딩 중...',
        'interactive': '상태: DOM 준비 완료',
        'complete': '상태: 모든 자원 로드 완료'
      };
      progress.textContent = states[state] || `상태: ${state}`;
    }

    updateProgress(document.readyState);

    document.addEventListener('readystatechange', () => {
      updateProgress(document.readyState);
      if (document.readyState === 'complete') {
        console.log('페이지 완전히 준비됨');
      }
    });
  </script>
</body>
</html>

문서의 readyState가 변경될 때마다 현재 상태를 화면에 출력합니다. 이를 통해 "loading" → "interactive" → "complete" 순으로 상태가 변경되는 것을 확인할 수 있습니다.