2015-04-30 40 views
0

我在这里找到了一个很好的代码来将图像预加载到应用程序中。这很好。Javascript语句,函数不叫

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

    }); 

但是,当我试图从if语句调用loadImages()在for循环中,不管是什么原因函数没有被调用。 我拉数组中的图像名称。 其他一切工作的intented即迭代,条件等代码如下:

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函数中运行循环和条件。一切按预期工作。感谢您指出。

+0

是loadImages函数之外的第二个代码块吗?你的图像参数如何设置?它看起来像你传递null,因此你的loadImages函数会出错,因为图像是空的或未定义的。 – mwilson

+0

什么“if语句内循环”?请显示您的完整代码。 – Bergi

+0

是的,确保顶层函数中的回调被调用。 –

回答

0

您在访问images喜欢的对象,在你的第二个for/in循环:

images[src] = new Image(); 

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

+0

图像被宣布。我没有复制那部分。更新的代码正在显示。 – goryef

0

首先,你可以使用此代码来获取的来源,而不是数:

var numImages = sources.length; 

其次,你的对象变量“图像”是不确定的;

第三,你的numImages已经比getImageImages的getter,所以if语句只会在最后一次被调用。

+0

我定义了'图像'。部分代码未被复制。它被纠正了。仍然不起作用 – goryef

0

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