Javascript - 等待图像加载

时间:2012-04-11 10:39:23

标签: javascript image

var l = false;
var l2 = false;

var imm = new Image();
imm.src = "b.png";

imm.onload = function(){
l = true;
}

var imm2 = new Image();
imm2.src = "c.png";

imm2.onload = function(){
l2 = true;
}

如果ll2为真,我怎么能告诉这个javascript启动一个函数?我应该设置一个循环来不断检查这两个变量吗?有没有更有效的方法?我不希望我的脚本在没有图像的情况下启动,但使用.onload我可以等待只加载一个图像而不是所有图像。谢谢你的帮助!

6 个答案:

答案 0 :(得分:11)

我认为更优雅的方式:

var loadedImagesCount = 0;
var imageNames = ["b.png", "c.png"];
var imagesArray = [];
for (var i = 0; i < imageNames.length; i++) {
    var image = new Image();
    image.src = imageNames[i];
    image.onload = function(){
        loadedImagesCount++;
        if (loadedImagesCount >= imageNames.length) {
            //loaded all pictures
        }
    }
    imagesArray.push(image);
}

不要乱搞大量不同的图像变量,只需将图像名称存储在普通数组中,然后循环显示,并计算加载的图片数量。

答案 1 :(得分:5)

无需循环。你可以让他们调用一个函数来检查l和l2是否为真并执行你想要做的事情:

var onLoaded = function() {
    if (l && l2) {
        // do your stuff
    }
}

imm.onload = function(){
    l = true;
    onLoaded(); // call to onLoaded
}

imm2.onload = function(){
    l2 = true;
    onLoaded(); // call to onLoaded
}

它基本上是Observer Pattern的一种简单形式。有一些jQuery插件,比如Radio.js,可以为你封装。

答案 2 :(得分:5)

这是一个通用的(适用于任何数量的图像

function preload( images, callback){
   var imageElements = [],
       counter = images.length,
       lfunc = function(){if (--counter === 0 && callback) callback(imageElements);};

   // first create the images and apply the onload method
   for (var i = 0, len = images.length; i < len; i++){
      var img = new Image();
      imageElements.push( img );
      img.onload = lfunc;
      img.src = images[i];
   }
}

function codeOncePreloadCompletes(preloadedImages){
  // Do whatever you want here
  // images are preloaded
  // you have access to the preloaded image if you need them
  // with the preloadedImages argument
}

// USAGE

preload( ['b.png', 'c.png'], codeOncePreloadCompletes);

// OR

preload( ['b.png', 'c.png'], function(preloadImages){
   // write directly here what to do after preload
});

答案 3 :(得分:1)

如果您想从给定的网址列表中按顺序加载图片,那么我觉得这很有用:

preloadImages_helper("firstURL", "secondURL");

    function preloadImages_helper(){
        var args =  Array.prototype.slice.call(arguments);
        if(!(args === undefined) && args.length > 0){
            var img = new Image();
            img.src = arguments[0];
            img.onload = function(){
                preloadedImages.push(img);
                console.log("pushing image");
                //Don't forget to call user code!
                if(!(args === undefined) && args.length > 1){
                    args.shift();
                    preloadImages_helper.apply(this, args);
                }
                else{
                    console.log("finished loading images");
                    userCode();
                }
            };
        }
    }

答案 4 :(得分:0)

如果在整个脚本中只有2次设置了ll2,那么您可以在设置值后进行检查。

var l = false;
var l2 = false;

var imm = new Image();
imm.src = "b.png";

imm.onload = function(){
  l = true;
  if (l && l2) {
    myFunc();
  }
}

var imm2 = new Image();
imm2.src = "c.png";

imm2.onload = function(){
  l2 = true;
  if (l && l2) {
    myFunc();
  }
}

function myFunc(){
  //do stuff
}

答案 5 :(得分:0)

你不必经常检查,每次完成时都要检查另一个,这样,当第二个完成时你的功能会被激活,你只需要“检查”一次。     var l = false;     var l2 = false;

var imm = new Image();
imm.src = "b.png";

imm.onload = function(){
l = true;

if (l2)
   call yourFunction();

}

var imm2 = new Image();
imm2.src = "c.png";

imm2.onload = function(){
l2 = true;

if (l)
   call yourFunction();
}