【问题标题】:How to know when all images inside a specific "div" are loaded?如何知道何时加载特定“div”中的所有图像?
【发布时间】:2011-06-27 02:30:08
【问题描述】:

我的部分 HTML 页面如下div:

<div id="images_wrapper">
  <img ... />
  <img ... />
  <img ... />
  ...
</div>

最初,这个div 是隐藏的,我只在所有图片都加载后才显示:

$(window).load(show_images_wrapper);

但是,如果我没记错的话,show_images_wrapper 只会在所有页面都加载完毕后才会被调用。我希望show_images_wrapperimages_wrapper 中的所有图像都已加载后立即被调用,不要等到所有页面都加载完毕。

我试过了:

$("#images_wrapper").load(show_images_wrapper);

但是没有用。

我应该怎么做?

【问题讨论】:

  • 我会检查并查看隐藏时浏览器实际加载的图像。我怀疑图像在实际渲染之前不会下载到您正在使用的浏览器中,但我可能是错的。您可以使用网络选项卡中的 firebug、chrome 开发人员工具或 IE 开发人员工具来确定这一点。

标签: javascript jquery html javascript-events


【解决方案1】:

使用length[docs] 属性设置图像数量的计数器,该计数器在图像加载时递减。

var imgs = $("#images_wrapper > img").not(function() { return this.complete; });
var count = imgs.length;

if (count) {
    imgs.load(function() {
        count--;
        if (!count) {
            $("#images_wrapper").show();
            alert('all done');
        }
    });
} else {
    $("#images_wrapper").show();
}

not()[docs] 方法正在从匹配集中删除其.complete 属性为true 的图像。这意味着图像已经下载,并且可能被浏览器缓存。

当然,load()[docs] 方法会在每个图像完成加载时触发。

示例: http://jsfiddle.net/uhmAR/1/


编辑: 更改它以便容器将显示 所有 图像是否恰好被缓存。


编辑:

上面的另一种变体是将.load()绑定到所有图像,并使用filter()[docs]方法获取.complete,然后手动调用.load()

这消除了对if/else 语句的需要。

var imgs = $("#images_wrapper > img")
var count = imgs.length;

imgs.load(function() {
    count--;
    if (!count) {
        $("#images_wrapper").show();
        alert('all done');
    }
}).filter(function() { return this.complete; }).load();

示例: http://jsfiddle.net/uhmAR/3/

【讨论】:

  • @Jared:嘿,我能拿到的时候就拿走! ;o)
  • @patrick 我以前看过complete 属性,你有什么推荐的读物吗?
  • @alex:老实说,我从来没有找到太多关于它的文档。我曾经在 MDC 找到过一些东西,但现在我找不到了。据我所知,它有完整的浏览器支持(包括 IE6)。
【解决方案2】:

我写了一个jQuery plugin 可以做到这一点。

$('#images_wrapper').waitForImages(function() {
   // Done.
});

或者,

var images = $('#images_wrapper img'),
    imagesLength = images.length;

images.load(function() { 

    if ( ! --imagesLength) {
        // Done.
    }

});

【讨论】:

  • @Misha 你说他的方法具体是什么意思?如果您想自己检查,可以在链接上找到该代码。
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2012-12-03
  • 2011-08-12
  • 2010-11-18
  • 2012-05-21
  • 2014-12-16
相关资源
最近更新 更多