Как узнать, когда загрузка завершится?

После получения данных с запроса лоадер удаляется, но картинкам требуется дополнительное время для загрузки, особенно если у пользователя медленное соединение (например, 3G). Есть ли способы дождаться как завершения запроса, так и полной загрузки изображений, прежде чем скрывать лоадер? <br/> <a href="https://jsbin.com/jetexuqepu/1/edit" rel="nofollow">https://jsbin.com/jetexuqepu/1/edit</a>
  • 18 января 2025 г. 12:13
Ответы на вопрос 1
Для того чтобы дожидаться полной загрузки изображений, вы можете использовать событие `load` для каждого изображения после того, как завершится основной запрос данных. После завершения всех загрузок изображений, вы можете скрыть лоадер.

Вот пример подхода, который вы можете использовать:

1. Запустите запрос данных и отображайте лоадер.
2. После получения данных, создайте изображения и добавьте обработчик события `load` для каждого изображения.
3. Используйте счетчик, чтобы отслеживать, сколько изображений уже загрузилось. Когда все изображения будут загружены, скрывайте лоадер.

Вот пример кода на JavaScript:

```javascript
function loadImages(imageUrls) {
    const loader = document.getElementById('loader');
    loader.style.display = 'block'; // Показываем лоадер

    let loadedImagesCount = 0;
    const totalImages = imageUrls.length;

    // Функция для проверки завершения загрузки всех изображений
    function checkAllImagesLoaded() {
        if (loadedImagesCount === totalImages) {
            loader.style.display = 'none'; // Скрываем лоадер
        }
    }

    imageUrls.forEach(url => {
        const img = new Image();
        img.src = url;

        // Увеличиваем счетчик после загрузки каждого изображения
        img.onload = () => {
            loadedImagesCount++;
            checkAllImagesLoaded();
        };

        // Обработка ошибки загрузки, чтобы не зависать в случае ошибки
        img.onerror = () => {
            loadedImagesCount++;
            checkAllImagesLoaded();
        };

        // Добавляем изображение на страницу, если необходимо
        document.body.appendChild(img);
    });
}

// Пример использования
const imageUrls = [
    'image1.jpg',
    'image2.jpg',
    'image3.jpg'
];

fetch('api/data/endpoint') // Замените на ваш API
    .then(response => response.json())
    .then(data => {
        // Обработка данных
        // Предположим, data содержит нужные ссылки на изображения
        loadImages(data.imageUrls);
    })
    .catch(error => {
        console.error('Ошибка:', error);
        // Можно также скрыть лоадер в случае ошибки
        loader.style.display = 'none';
    });
```

Этот код сначала показывает лоадер. После загрузки всех изображений и их обработки он скрывает лоадер. В случае ошибки загрузки изображения счетчик также увеличивается, чтобы избежать зависания.
Похожие вопросы