Ленивая загрузка изображений только после открытия Bootstrap Modal

#javascript #jquery #lazy-loading #bootstrap-modal

#javascript #jquery #отложенная загрузка #bootstrap-modal

Вопрос:

Я нашел здесь два похожих ответа, но оба оказались неудачными для моей ситуации (учитывая мою ограниченную способность переводить их в мою ситуацию). У меня есть страница с большим количеством довольно больших изображений, и метод начальной загрузки по умолчанию — загружать все модальные изображения при загрузке страницы. Видимый html отображается довольно быстро (для этого у меня есть счетчик), но дополнительное время загрузки скрытых модалов делает страницу непрактичной. Я хочу, чтобы страница загружала только видимый (немодальный) контент, чтобы завершить загрузку страницы (и очистить счетчик), а затем загружать содержимое каждого модала только при запуске этого модала. Я перепробовал все решения lazyload, которые смог найти, но изображения не будут отображаться в модальном режиме (отображаются заполнители ‘data-src’, но не изображения ‘src’, которые должны их заменить). Я хочу только лениво загружать (или загружать в ‘show.bs.modal’) большие изображения модального, те, что находятся в классе ‘modal-body’. Надеюсь, это достаточно ясно.

Пример кода:

 /* Javascript placed in the head */

<script>

function lazyLoad(){
    var $images = $('.lazy_load');

    $images.each(function(){
        var $img = $(this),
            src = $img.attr('data-src');

        $img
            .on('load',imgLoaded($img[0]))
            .attr('src',src);
        });
    };

    $('.modal-body').on("show.bs.modal", function () {
    lazyLoad();
};          

</script>

/* HTML in the modal section */


<div class="portfolio-modal modal fade" id="portfolioModal1" tabindex="-1" role="dialog" aria-hidden="true">
        <div class="modal-content">
            <div class="galleryheader">
                <img src="headerimage_1.png" height="77" width="1024">
            </div>
            <div class="close-modal" data-dismiss="modal">
                <div class="lr">
                    <div class="rl">
                    </div>
                </div>
            </div>
            <div class="container">
                <div class="row">
                    <div>
                        <div class="modal-body lazy_load">
                            <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src="images/largeimage_1A.jpg" height="585" width="800"class="img-centered" alt=""/>
                        </div>
                        <div class="modal-body lazy_load">
                            <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src="images/largeimage_1A.jpg" height="585" width="800"class="img-centered" alt=""/>
                        </div>
                        <div class="modal-body lazy_load">
                            <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src="images/largeimage_1A.jpg" height="585" width="800"class="img-centered" alt=""/>
                        </div>
                    </div>
                </div>
            </div>

                <div class="close-lower" data-dismiss="modal">
                <IMG SRC="images/close.jpg" WIDTH="85" HEIGHT="32"></a>
                </div>
            </div>
        </div>
</div>
  

Ответ №1:

Во-первых, поместите lazy_load класс в img элемент, а не в родительский div . Во-вторых, jQuery, который вам нужен, выглядит примерно так:

 $('.portfolio-modal').on("show.bs.modal", function () {
    $('.lazy_load').each(function(){
        var img = $(this);
        img.attr('src', img.data('src'));
    });
});          
  

Примечания:

  1. Используйте portfolio-modal класс для идентификации модала.
  2. Используйте метод jQuery data() , чтобы заставить изображение загружаться лениво.

Комментарии:

1. Я заменил js точно так, как вы его опубликовали, и переместил класс ‘.lazy_load’ в конец строки <img> (=»800″class=»lazy_load» alt=»»/> ). Страница загружается очень быстро, загружаются изображения-заполнители, но изображения src по-прежнему не заменяют их. Мне интересно, есть ли что-то в bootstrap.js это каким-то образом противоречит этому, или если функция ‘show.bs.modal’ здесь не подходит (хотя по логике вещей это должно быть …)

2. @evanonearth Для меня это работает нормально, вот пример: bootply.com/7kS6Ube98u

3. Отлично! Теперь это работает. Спасибо! У меня был тег script для jquery над javascript в заголовке, я думаю, что это была проблема. Javascript должен быть на первом месте.