【问题标题】:Jquery lazyload with ajax带有ajax的jQuery延迟加载
【发布时间】:2012-12-09 20:56:44
【问题描述】:

我在我的电子商务网站上使用了lazyload()。 lazyload() 效果很好。我使用这段代码来做到这一点:

$(function(){
  $("img.lazy").lazyload({ 
  effect : "fadeIn"
          });
});

还有一些过滤器,如颜色、价格等,运行 ajax 并显示新结果。当新结果出现时,lazyload() 不起作用。我知道我必须将lazyload() 与live()、delegate() 或on() 一起使用。但我是 jquery 的新手,我做不到。任何人都可以帮助我吗?我的 jquery 版本是 1.7.2,我们可以使用 on()。

【问题讨论】:

  • 请您尝试其他答案并且不接受我对这个问题的回答吗?我的答案不再有效,人们一直在反对它。

标签: jquery ajax lazy-loading


【解决方案1】:

简而言之,最佳优化方式是在您的 ajax 的成功函数中调用延迟加载:

$.ajax({
    url: "your url here",
    type: "Post",
    success: function(response){
        // handle your success callback here
        $("img.lazy").lazyload({ 
              effect : "fadeIn"
        });
    }
});

但如果您想将您的调用集中到lazyload插件,您有2个选项:

第一:(不推荐,因为性能受到影响)

$(document).on('DOMNodeInserted', '#container', function() {
    $("img.lazy").lazyload({
        effect: 'fadeIn'
    });
});

但请注意这里的“#container”,它是容器的选择器,您将在其中显示新加载的内容,因此上面的代码将在此容器内侦听任何新添加的内容,以便在新图像上再次运行延迟加载,

第二:(推荐)

通过将自定义延迟加载添加到您的 JQuery 来调用它:

$.fn.myLazyLoad = function() {
    this.lazyload({ 
          effect : "fadeIn"
    });
};

然后,在所有 AJAX 请求中调用它:

$.ajax({
    url: "your url here",
    type: "Post",
    success: function(response){
        // handle your success callback here
        $("img.lazy").myLazyLoad();
    }
});

【讨论】:

  • @tebdilikiyafet 这是一个有效的答案,如果它符合您的需要,您可以接受它
  • 不,你要在每个 ajax 调用中重复这个吗?如果你有 20 个 jquery 插件而不是 1 个呢?如果是唯一的防弹方式,则可以单独放置并监听 DOM 更改(例如 MutationObserver)。
  • @emix,如果你想监听 DOM 节点的变化,那么你可以使用这里的答案中提到的第一种方法,这取决于DOMNodeInserted .. 但性能方面,它不会是最好,因为即使更改没有插入新图像,此侦听器也会运行任何 DOM 插入,这肯定会影响性能。
  • 就像使用去抖动功能一样简单。反正我是在和@Alex 说话。
  • 好吧,只是为了分享知识,很多像延迟加载库这样的库,会因为它们操作Dom对象的方式而产生reflows,并且reflows会阻塞浏览器的UI线程,从而降低渲染fps ,经常使用时会严重影响性能。所以使用 3rd 方库应该谨慎,不仅仅是为了代码方便。
【解决方案2】:

注意:在接受此答案时,此方法有效。延迟加载插件已更改,现在已损坏。我不能不接受答案,也不能删除它。

还有另一个问答建议将其作为负责插入附加 DOM 的 AJAX 请求的一部分进行处理:

Binding image lazy loading to new images inserted after ajax request

但是,我会这样做:

$(document).on('DOMNodeInserted', 'img.lazy', function() {
    $(this).lazyload({
        effect: 'fadeIn'
    });
});

演示:jsfiddle

【讨论】:

  • 对不起,我的朋友没用。我认为我们应该在 on() 中描述一个事件,因为我看到 on() 应该使用如下:$(document).on(EVENT, SELECTION, EVENT-HANDLER);
  • 我看到了,但它不是 on()。您对 ajaxstop 感觉如何? ajaxstop 或 on 哪个更好?
  • 我会使用on。我已经用DOMNodeInserted 插入事件的示例更新了我的答案。我认为这更简洁,因为它将它与通过 AJAX 加载数据的担忧区分开来。
  • @tebdilikiyafet 有用吗?如果是这样,请接受答案。谢谢!
  • 首先感谢您的关注。我直接尝试了代码,但没有成功。但我明白你的意思。我会稍微改变一下代码,我认为它会起作用。我现在接受了你的回答。我将尝试对代码进行一些更改并通知您。
【解决方案3】:

在窗口加载后加载的图像(例如 AJAX)的延迟加载不会在滚动事件之前显示任何图像。这是因为它在内部进行了硬编码以在窗口加载事件之后触发初始更新。以上所有的答案,目前都是错误的。

【讨论】:

  • 这是最初的问题吗?我不这么认为。为什么不把这个问题当作一个新问题来问呢?
  • 是的 Cymen,我的回答是相关的。问题是关于在 Ajax 中使用延迟加载的问题,我指出延迟加载不是为此设计的.....
  • 我认为发生的事情是 jQuery 延迟加载改变了实现。我在回答时知道我工作过的 jsfiddle。现在没有。这就是为什么再次提出问题以处理它为什么会损坏或向延迟加载人员提交错误以修复它更有意义的原因。
【解决方案4】:

除了 AbdelHady 的回答之外,您还可以在成功时延迟加载新图像作为回调或以这种方式使用 when():

   $.when(load_new_image()).done(function(i){

            if($('img.lazy').length){

                 $('img.lazy').lazyload({ 

                          effect:'fadeIn'

                 }).removeClass('lazy').addClass('lazyloaded');

            }

        });

        function load_new_image() {

            return $.ajax({
                url: "your url here",
                type: "Post",
                success: function(response){

                     //append new content
                    $('#container').append(response);

                }
            });
        }

没有好处

【讨论】:

    【解决方案5】:

    我有同样的问题,当使用带有延迟加载图像的航点无限滚动时。 (但不适用于 ajax 内容)。

    我用这个解决了这个问题:

    $("img.lazy").lazyload({
        effect : "fadeIn",
        event: "scrollstop",
        skip_invisible : true
    }).removeClass('lazy');
    
    $(document).bind('DOMNodeInserted', function(e) {
        $("img.lazy").lazyload({
            effect : "fadeIn",
            event: "scrollstop",
            skip_invisible : true
        }).removeClass('lazy');
    });
    

    我在DOMNodeInserted事件上绑定了延迟加载配置。

    【讨论】:

      【解决方案6】:

      对于我在加载页面时的场景,我将获得带有模板 ID 的模板列表。基于该模板 ID,我使用 jQuery Lazy 使用 ajax 加载 base64 编码的图像,并在我的页面上延迟加载图像。

      希望你能对我的方法有所了解

      $(document).ready(function() {
        let imageArray = [0, 1, 10, 100, 1000, 1001];
      
        let parsedImageArray = $.map(imageArray, function(value) {
          return "<div class='lazy' data-loader='ajaxLoader' data-src='/echo/html/' data-method='post' contentId='" + value + "'></div><br>";
        });
      
        $("#content").html(parsedImageArray);
      
        console.log("Here" + parsedImageArray)
      });
      
      
      $(document).bind('DOMNodeInserted', function(e) {
        $('.lazy').lazy({
          effect: "fadeIn",
          event: "scrollstop",
          skip_invisible: true,
          removeAttribute: false,
          ajaxLoader: function(element, response) {
            let thumbnailId = element.attr("contentId");
            console.log("Here" + thumbnaiId);
            $.get("https://picsum.photos/id/" + thumbnailId, function(srcValue, status) {
              //for me i have to pull the base64 encode image from my server 
              let defaultImageDom = generateThumbnailImage(tempSrc);
              element.html(defaultImageDom);
              element.removeClass('lazy');
            }).fail(function(jqXHR, textStatus, errorThrown) {
              let defaultImageDom = generateThumbnailImage("");
              element.html(defaultImageDom);
              element.append("<em>Error Getting Thumbnail Preview</em>");
              element.removeClass('lazy');
            });
          },
        });
      });
      
      function generateThumbnailImage(srcValue) {
        let defaultImageDom = new Image();
        defaultImageDom.height = 200;
        defaultImageDom.style.borderColor = "#d5d5d5";
        defaultImageDom.style.borderWidth = "1px";
        defaultImageDom.style.borderStyle = "solid";
      
        if (srcValue && srcValue.length > 0) {
          defaultImageDom.src = srcValue;
        } else {
          //set your fallback image link
          defaultImageDom.src = "data:image/gif;base64,R0lGODdhAQABAPAAAMPDwwAAACwAAAAAAQABAAACAkQBADs=";
        }
        return defaultImageDom;
      }
      .lazy {
        width: 700px;
        height: 467px;
        display: block;
        /* optional way, set loading as background */
        background-image: 'data:image/gif;base64,R0lGODdhAQABAPAAAMPDwwAAACwAAAAAAQABAAACAkQBADs=';
        background-repeat: no-repeat;
        background-position: 50% 50%;
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery.lazy/1.7.9/jquery.lazy.min.js"></script>
      <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery.lazy/1.7.9/jquery.lazy.plugins.min.js"></script>
      
      <div id="content">
      </div>

      【讨论】:

        【解决方案7】:

        我使用下面的代码,它工作:

        $(document).on('ajaxStop', function() {
           $("img.lazy").lazyload({
                effect: 'fadeIn'
            });
        });
        

        【讨论】:

          【解决方案8】:
             $(document).ajaxStop(function() {$('.loading').removeClass('in');
              $("img.lazy").lazyload({
                          effect: "fadeIn",
                         container: $("#scrollable"),
                         threshold: 100,
                      })
          
                });
          

          适用于 ajax 图像。但是,默认情况下不显示第一张图像。更新未触发。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-25
            • 1970-01-01
            • 1970-01-01
            • 2013-07-21
            • 1970-01-01
            相关资源
            最近更新 更多