3
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;
}

我怎样才能告诉这个javascript只有在l并且l2是真的时才启动一个函数?我应该设置一个不断检查这两个变量的循环吗?有没有更有效的方法?我不希望我的脚本在没有图像的情况下开始,但.onload我可以等待只加载一个图像而不是所有图像。谢谢你的帮助!

4

6 回答 6

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);
}

而不是弄乱许多不同的图像变量,只需将图像名称存储在普通数组中,然后循环遍历并计算加载了多少张图片。

于 2012-04-11T10:49:45.757 回答
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
}

它基本上是观察者模式的一种更简单的形式。有诸如Radio.js 之类的 jQuery 插件可以为您封装这个。

于 2012-04-11T10:43:29.810 回答
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
});
于 2012-04-11T10:51:08.633 回答
1

如果您想从给定的 URL 列表中按顺序加载图像,那么我发现这很有用:

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();
                }
            };
        }
    }
于 2013-08-22T19:04:01.273 回答
0

如果这些是整个脚本中唯一设置ll2设置的 2 次,那么您可以在设置值后进行检查。

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
}
于 2012-04-11T10:43:15.223 回答
0

您不必经常检查,只需在每次完成时检查另一个,这样,当第二个完成时,您的函数将触发,您只需“检查”一次。变量 l = 假;变量 l2 = 假;

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();
}
于 2012-04-11T10:44:23.457 回答