在ajax回调后隐藏加载gif

Pab*_*blo 10 javascript ajax jquery

我有一个简单的问题,但我找不到一个干净的答案.我需要在ajax调用后加载大量图像,并且我想使用动画gif作为预加载器.我正在使用以下代码:

function loadProducts(url) {
    $("#loading").show();
    $('#inner').fadeOut(1).load(url + ' .product-list', function() {
        $('#inner').fadeIn(1000, function() {
            $("#loading").hide();
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

加载HTML时,#loading正在隐藏.load(url + ' .product-list'.问题是沉重的图像仍然在屏幕上呈现,我想继续显示动画.gif,直到图像的渲染完成.有没有办法知道屏幕上的图像何时被渲染?提前致谢.

ade*_*neo 7

您可以使用promises检查所有图像何时加载,然后删除加载gif.

这会创建一个在图像加载时解决的承诺,所有承诺都保存在一个数组中,并且当所有承诺都被解析时,即所有图像都被加载时,回调就会触发.

function loadProducts(url) {
    $("#loading").show();

    $('#inner').fadeOut(1).load(url + ' .product-list', function() {

        var promises = [];

        $('#inner').find('img').each(function(_, image) {
            var img = new Image(), 
                def = new $.Deferred();

            img.onload = function() {
                def.resolve();
            }

            promises.push( def.promise() );

            img.src = image.src;
            if (img.complete) img.onload();
        });

        $.when.apply(undefined, promises).done(function() {

            $('#inner').fadeIn(1000, function() {
                $("#loading").hide();
            });

        });
    });
}
Run Code Online (Sandbox Code Playgroud)