0

我在这里找到了一个非常好的代码来将图像预加载到应用程序中。效果很好。

// PRELOAD IMAGES
var  images = {};
function loadImages(sources, callback) {

  var loadedImages = 0;
  var numImages = 0;
  // get num of sources
  for(var src in sources) {
    numImages++;
  }
  for(var src in sources) {
    images[src] = new Image();
    images[src].onload = function() {
      if(++loadedImages >= numImages) {
        callback(images);
      }
    };
    images[src].src = sources[src];
  }
}


var sources;
sources = {

  img1: "....../img1.png",
  img2: "....../img2.png",

};

当 loadImages() 调用它工作得很好。

loadImages(sources, function(images) {
    ctxLogo.drawImage(images.img1, 0, 0, 10, 10);

  });

但是,当我尝试从 for 循环内的 if 语句调用 loadImages() 时,无论出于何种原因,该函数都不会被调用。我正在从数组中提取图像名称。其他一切都按预期工作,即迭代、条件等。代码如下:

 loadImages(sources, function (images) {
 for (var j = 0; j < data.length; j++) {

  if (data[j].FlImg === 'img2') {

    alert (j) // just to be sure it gets here, it does.



      alert(j +'-this line is not')

      ctxGameBoard.drawImage(images.img2, 0, 0, 100, 100);
}
});

我在本地运行它。任何建议都非常感谢。

解决了。 我的问题是对象变量没有在 if 块中声明。一旦我将代码更改为在 loadImages 函数中运行循环和条件。一切都按预期工作。感谢您指出。

4

3 回答 3

0

解决了。我的问题是对象变量没有在 if 块中声明。一旦我将代码更改为在 loadImages 函数中运行循环和条件。一切都按预期工作。感谢您指出。

于 2015-04-30T14:31:01.417 回答
0

首先,您可以使用此代码来获取来源数量:

var numImages = sources.length;

其次,您的对象变量“图像”未定义;

第三,你的 numImages 已经比加载的Images 更好,所以 if 语句只会在 thta 是最后一个时被调用。

于 2015-04-30T03:28:48.350 回答
0

在第二个循环images中,您像对象一样访问:for/in

images[src] = new Image();

但是您还没有声明变量。您可能会在 DevTools 中找到ReferenceError 。

于 2015-04-30T02:15:20.023 回答