Обработка ошибок загрузки

Masonry — это библиотека для динамического позиционирования элементов сетки, которая часто используется для галерей изображений, карточек товаров или блогов с разным размером контента. Одной из ключевых задач при работе с Masonry является корректная обработка ошибок загрузки изображений и других медиа-ресурсов, чтобы сетка не ломалась и элементы не перекрывались.

Проблема загрузки изображений

Masonry вычисляет размеры и расположение элементов на основе их реальных размеров. Если изображение или медиа-контент ещё не загружены, библиотека может неправильно рассчитать положение соседних элементов, что приведёт к пустым зонам или наложению карточек. Ошибки загрузки изображений усугубляют проблему: браузер может вернуть 404, ресурс может быть недоступен, либо время загрузки слишком велико.

Использование событий load и error

Для контроля загрузки изображений необходимо отслеживать события load и error.

const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
  itemSelector: '.grid-item',
  columnWidth: '.grid-sizer',
  percentPosition: true
});

const images = grid.querySelectorAll('img');

images.forEach(img => {
  img.addEventListener('load', () => {
    msnry.layout(); // пересчитываем сетку после успешной загрузки
  });
  
  img.addEventListener('error', () => {
    img.src = 'placeholder.jpg'; // подставляем резервное изображение
    msnry.layout(); // пересчитываем сетку после замены
  });
});
  • load — срабатывает при успешной загрузке изображения.
  • error — срабатывает, если загрузка не удалась.

Использование этих событий гарантирует, что Masonry всегда имеет актуальные размеры элементов перед перерасчетом сетки.

Интеграция с imagesLoaded

Для крупных галерей удобно использовать библиотеку imagesLoaded, которая работает в связке с Masonry и автоматически отслеживает загрузку всех изображений внутри контейнера.

imagesLoaded(grid, { background: true }, () => {
  msnry.layout();
});
  • Первый аргумент — контейнер с элементами сетки.
  • Опция { background: true } позволяет отслеживать фоновые изображения CSS.
  • Callback вызывается после загрузки всех элементов, включая фоновые.

Использование imagesLoaded позволяет избежать многократных пересчетов Masonry при последовательной загрузке отдельных изображений.

Замена или скрытие неудачных элементов

Если изображение не загрузилось, есть несколько стратегий:

  1. Подстановка резервного изображения — минимально нарушает сетку и сохраняет визуальную структуру.
  2. Удаление элемента из Masonry — используется для несущественного контента, чтобы сетка не ломалась.
img.addEventListener('error', () => {
  const parent = img.closest('.grid-item');
  parent.remove();
  msnry.layout();
});

Удаление элемента корректно перерассчитывает сетку и предотвращает появление пустых мест.

Асинхронная загрузка и Masonry

При динамическом добавлении элементов через AJAX важно обрабатывать ошибки сразу после вставки в DOM:

fetch('/api/images')
  .then(res => res.json())
  .then(data => {
    data.forEach(url => {
      const item = document.createElement('div');
      item.className = 'grid-item';
      const img = document.createElement('img');
      img.src = url;
      
      img.addEventListener('load', () => msnry.appended(item));
      img.addEventListener('error', () => {
        img.src = 'placeholder.jpg';
        msnry.appended(item);
      });

      item.appendChild(img);
      grid.appendChild(item);
    });
  });
  • msnry.appended(item) — сообщает Masonry о новом элементе, после чего пересчитывается сетка.
  • Обработка ошибок на лету гарантирует, что элементы с недоступными изображениями не нарушат визуальную гармонию.

Логирование и мониторинг ошибок

Для крупных проектов полезно логировать ошибки загрузки в консоль или отправлять на сервер, чтобы отслеживать недоступные ресурсы:

img.addEventListener('error', (e) => {
  console.warn('Ошибка загрузки изображения:', e.target.src);
});

Такой подход позволяет быстро выявлять проблемы с ресурсами и корректировать контент.

Итоговая стратегия

Эффективная обработка ошибок загрузки в Masonry включает:

  • Отслеживание событий load и error на всех изображениях.
  • Использование imagesLoaded для упрощения работы с галереями.
  • Подстановку резервных изображений или удаление неудачных элементов.
  • Асинхронную обработку динамически добавляемых элементов.
  • Логирование ошибок для мониторинга стабильности контента.

Соблюдение этих принципов обеспечивает корректное отображение сетки Masonry даже при проблемах с загрузкой медиа-ресурсов.