@Barring

Как дождаться выполнения append?

Есть следующая задача.
Имеется массив картинок, 3 вертикальных блока и необходимо осуществить равномерное присоединение этих картинок к блоку дабы соблюдалась ~ одинаковая высота.
Я прохожусь foreach по массиву, при каждой итерации сравниваю высоты 3х блоков и выбираю наименьшую, туда и присоединяю картинку.
Проблема возникает в следующем. Иногда append не успевает присоединить (как мне кажется) картинку в DOM и до завершения "аппенда" уже идёт следующая итерация foreach и соответственно блок с минимальной высотой высчитывается некорректно.

Примеры работы :

При маленьком кол-ве загружаемых картинок
5d0f4f2ea4260520044483.png
При больше нагрузке
5d0f4ef998025136209308.png


Есть какие-то варианты реализации по типу append.onload или что-то в таком духе?
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
BRAGA96
@BRAGA96
append синхронный, а вот загрузка картинки нет, к счястью у node элемента img есть события load/error

Пример es5 jquery, если пишите на es6+, то логика та же но вместо $.Deferred -> Promise
var urls = [
    'https://picsum.photos/id/345/2000/2000',
    'https://picsum.photos/id/347/2000/2000',
    'https://picsum.photos/id/349/2000/2000',
    'https://picsum.photos/id/320/2000/2000',
    'https://picsum.photos/id/351/2000/2000',
    'https://picsum.photos/id/372/2000/2000'
];

var $wrapper = $('.wrapper');

urls.forEach(function (url) {
    createImage(url).then(function (image) {
        var $image = $(image);
        $wrapper.append($image);
        console.log({
            width: $image.width(),
            height: $image.height()
        });
    }).fail(function (image) {
        console.error('Ошибка загрузки картинки');
    });
});

function createImage(url) {
    var $deferred = $.Deferred();
    $('<img/>', {
        src: url
    }).one({
        load: function () {
            $deferred.resolve(this);
        },
        error: function () {
            $deferred.reject(this);
        }
    });
    return $deferred;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы