昏黄烛火轻摇晃 2017-11-04 14:05 采纳率: 61.5%
浏览 3056

Javascript img.onload带来的问题,求解答

下面的imgLength++这么写是不是有点不合理? 在本地图片的加载不是几乎是在src设置完的瞬间就完成了,那么此时的imgLength++刚为1,tempImg.onload函数就执行了,loaded++就为1,那么此时就满足条件 执行回调了,而且下面的这段imgObj[ key ] = tempImg还没设置 就onload了 那么传过去的不就是空对象;求解答?
函数部分:
function loadImage( imgUrl, fn ) {

    //存储图像资源
    var imgObj = {};
    var tempImg;
    //记录已经加载完毕的图片数量
    var loaded = 0;
    //统计要加载的图像数量
    var imgLength = 0;
    //遍历所有url,动态创建img
    for ( var key in imgUrl) {

        imgLength++;
        //根据遍历到的url,加载图像
        tempImg = new Image();
        tempImg.onload = function(){
            loaded++;
            //当图片加载的数量大于等于要加载的数量就可以执行回调
            if ( loaded >= imgLength){  
                fn( imgObj );

            }
        };
        tempImg.src = imgUrl[ key ];
        //把当前加载的图像存储起来
        imgObj[ key ] = tempImg;
    }
}

调用部分:
loadImage({
bird: './img/bird.png',
land: './img/land.png',
}, function( imgObj ) {

            })
  • 写回答

1条回答

  • ZHOUMOL 2018-08-21 06:20
    关注

    事件的绑定是异步的,以下是在for循环执行完后执行的
    tempImg.onload = function(){
    loaded++;
    //当图片加载的数量大于等于要加载的数量就可以执行回调
    if ( loaded >= imgLength){

    fn( imgObj );

            }
        };   
    
    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置