【问题标题】:how to check a array of imgs is fully loaded如何检查一组imgs是否已满载
【发布时间】:2011-10-30 06:52:33
【问题描述】:

我在这里得到了代码 像这样的数组 var pics = ['1.jpg','2.jpg','3,jpg'];

遍历数组

var j = 0; 
var(var i in pics){ 
$(document.createElement(img)).attr('src',pics[i]).load(function(){
    alert(pics[i]+'is loaded');
    j++;
})}

if(j == pics.length){
alert('fully loaded');}

但我得到的只是 3,jpg 一直在加载, 如何解决这个问题?我哪里错了?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

这是因为.load 事件异步触发。 JavaScript 在继续执行脚本之前不会等待所有图像加载完毕,因此您需要在每次加载图像时执行测试。我也让你的代码更具可读性。

var len = pics.length;
var loadCounter = 0;
for(var i = 0; i < len; i++) {
    $(document.createElement(img)).attr('src', pics[i]).load(function() {
        alert(pics[i] + 'is loaded');
        loadCounter++;
        if(loadCounter === len) {
            alert("all are loaded");   
        }
    });
}

旁注:使用for...in 遍历数组会产生令人讨厌的结果。特别是它会包含Array的所有属性,所以总之不要这样做 :) See for yourself.

另外,当图像被缓存时,加载事件可能不会在某些浏览器中触发。为避免此问题,您可以在每个设置了 complete 属性的图像上手动触发 .load 事件。

var len = pics.length;
var loadCounter = 0;
for(var i = 0; i < len; i++) {
    $(document.createElement(img)).attr('src', pics[i]).one("load", function() {
        alert(pics[i] + 'is loaded');
        loadCounter++;
        if(loadCounter === len) {
            alert("all are loaded");   
        }
    }).each(function() {
        if(this.complete) $(this).trigger("load");
    });
}

【讨论】:

  • 感谢您的评论,但我在控制台中运行您的代码,但我每次都收到最后一张图片警报(已加载 3.jpg),也许您可​​以尝试您的代码
  • @vikingmute - 你试过第二个例子吗?
【解决方案2】:

您需要限定i 变量的范围以保留循环中的当前值。

var j = 0; 

for( var i = 0; i < pics.length; i++ ){ 
    addHandler( i );
}

function addHandler( this_i ) {

    $(document.createElement( 'img' )).attr('src',pics[i]).load(function(){
        alert(pics[this_i]+'is loaded');
        j++;

        if(j == pics.length){
            alert('fully loaded');
        }
    });

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2010-10-24
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多