В чем разница между событиями загрузки документа и DOMContentLoaded?nodejs-86

Эти два события представляют разные этапы загрузки веб-страницы и часто вызывают путаницу у разработчиков. Рассмотрим их ключевые отличия и практическое применение.

Событие DOMContentLoaded

document.addEventListener('DOMContentLoaded', () => {
  console.log('DOM полностью загружен и обработан');
});

Характеристики:

  • Срабатывает, когда браузер полностью загрузил HTML и построил DOM-дерево
  • Не ждет загрузки внешних ресурсов:
    • Изображения, стили и iframes могут еще грузиться
    • Асинхронные (async) и отложенные (defer) скрипты могут еще выполняться
  • Оптимальная точка для:
    • Доступа и манипуляции с DOM-элементами
    • Инициализации интерфейсов
    • Навешивания обработчиков событий

Событие load

window.addEventListener('load', () => {
  console.log('Все ресурсы страницы загружены');
});

Характеристики:

  • Срабатывает, когда загружены все зависимые ресурсы:
    • Изображения, стили, скрипты, iframes
    • Внешние скрипты и стили
  • Используется для:
    • Работы с размерами элементов (которые могут зависеть от изображений)
    • Инициализации функционала, требующего полной загрузки страницы
    • Аналитики полного времени загрузки

Визуализация последовательности

  1. DOMContentLoaded (DOM готов)
  2. Загрузка оставшихся ресурсов
  3. load (все загружено)
  4. beforeunload (перед закрытием)
  5. unload (страница выгружается)

Практические отличия

Функция node:test Jest Mocha
Нативный модуль
Параллельные тесты
Mocking system⚠️
Code coverage
Snapshot testing

Особые случаи

  1. Скрипты с async:

    • Не блокируют DOMContentLoaded
    • Могут выполниться до или после него
  2. Скрипты с defer:

    • Выполняются перед DOMContentLoaded
    • В порядке их объявления в документе
  3. Динамически добавленные скрипты:

    • Не влияют ни на одно из событий

Современная альтернатива

document.readyState с событиями:

document.onreadystatechange = () => {
  if (document.readyState === 'interactive') {
    // Аналог DOMContentLoaded
  }
  if (document.readyState === 'complete') {
    // Аналог load
  }
};

Оптимизация производительности

  1. Используйте DOMContentLoaded для:

    • Быстрой интерактивности
    • Показа "скелета" интерфейса
  2. Используйте load для:

    • Анимаций, зависящих от размеров
    • Тяжелых операций, не критичных для первого взаимодействия

Резюмируем:

DOMContentLoaded — это событие готовности DOM-структуры, тогда как load указывает на полную загрузку всех ресурсов. Выбор между ними зависит от конкретных требований к инициализации вашего JavaScript-кода и необходимой скорости отклика интерфейса.