微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jQuery:加载事件无法始终如一地工作

如何解决jQuery:加载事件无法始终如一地工作

我正在尝试使用以下脚本(lazy-load.js)来lazy-load个图像:

function lazyLoadImage(imgContainers) {
    var img = $('<img src="">');
    imgContainers.each(function (i,elm) {
        img.attr('src',$(elm).data("large"));
        img.on('load',function () {
            $(this).addClass('loaded');
        });
        img.addClass('picture');
        $(elm).append(img.clone(true));
    });
}

$(window).on('load',function () {
    var imgContainers = $(document).find(".img-container:not(:has(.loaded))"); // images not loaded yet
    lazyLoadImage(imgContainers);
});

问题是,如果我使用<script></script>标签加载脚本,一切都会顺利进行,但是当使用jquery $.getscript()动态加载脚本时,脚本无法始终如一地工作(即,有时onload事件不会触发)。 动态加载脚本:

$.getScript( "path/to/lazy-load.js" )
  .done(function( script,textStatus ) {
    console.log( "script loaded' );
  })
  .fail(function( jqxhr,settings,exception ) {
    console.log( "script not loaded' );
});

那么,为什么脚本不能始终如一地工作?

解决方法

window.load在窗口加载完成时触发。通过ajax加载更多内容时,不会再次触发,因为无法告知浏览器何时完成其他内容的加载。因此,对于通过ajax执行的所有操作,您必须再次执行所有功能。

就您而言,我想您希望这些事情发生:

   var imgContainers = $(document).find(".img-container:not(:has(.loaded))"); // images not loaded yet
    lazyLoadImage(imgContainers);

因此,我想说的是将其放入函数中,并在完成脚本加载后调用它:


function lazyloadimages() {
    var imgContainers = $(document).find(".img-container:not(:has(.loaded))"); // images not loaded yet
    lazyLoadImage(imgContainers);
}

$(window).on('load',function () {
    lazyloadimages(); // notice this change,put the stuff in an extra function so you can reuse it! 
});


$.getScript( "path/to/lazy-load.js" )
  .done(function( script,textStatus ) {
    console.log( "script loaded' );
    lazyloadimages();
  })
  .fail(function( jqxhr,settings,exception ) {
    console.log( "script not loaded' );
    // oh no something went wrong,no need to lazyload something here! 
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。