2012-09-26 37 views
1

我需要在canvas中包含多个图像。我想通过for-loop动态加载它们。HTML 5画布 - 动态地在画布中包含多个图像

我尝试了很多,但在最好的情况下只显示最后一张图片。我检查这tread,但我仍然只得到最后的形象。

对于解释,这里是我的最新代码(基本上是一个从其他职位):

for (var i = 0; i <= max; i++) 
{ 
    thisWidth = 250; 
    thisHeight = 0; 
    imgSrc = "photo_"+i+".jpg"; 
    letterImg = new Image(); 
    letterImg.onload = function() { 
     context.drawImage(letterImg,thisWidth*i,thisHeight); 
    } 
    letterImg.src = imgSrc; 
} 

任何想法?

+0

嗯,可以letterImg的onload()持有超过一个函数指针吗? – thatidiotguy

+0

dunno ...我该如何避免这种情况? – Ron

+0

@thatidiotguy你只能有一个'.onload',但是在这种情况下,它每次都被放在一个不同的元素上,所以没关系。如果你想在一个元素上使用多个元素,我想你可以使用'addEventListener('load',...)'。 – Alnitak

回答

5

问题是onload事件异步发生,然后循环变量已经在最后的值。 您可以使用闭包来解决这个问题:

for (var i = 0; i <= max; i++) 
{ 
    thisWidth = 250; 
    thisHeight = 0; 


    (function(j){ 
     var imgSrc = "photo_"+j+".jpg"; 
     var letterImg = new Image(); 
     letterImg.onload = function() { 
     context.drawImage(letterImg,thisWidth*j,thisHeight); 
     } 
     letterImg.src = imgSrc; 
    })(i); 

} 
+1

该死的我正准备回答。 :( – corazza

+0

我得到了一个关于'(i)'的语法错误。抱歉,之前从未看到过这种函数:'SyntaxError:missing; before statement' – Ron

+1

我犯了一个小错误,修正了现在我修正了 – WojtekT

1

这里是您解决问题的另一种方式......

letterImg只是到的图像的参考。所以,for循环会执行n次,并且每次都将letterImg更改为新图像。因此,你只能得到最新的图像。

下面的代码(当然maxImg号更改为正确的值。):

images = []; //An array where images are stored. 
thisWidth = 250; //This doesn't need to be inside the for-loop. 
thisHeight = 0; 
maxImg = 342; 

//Attach an onload event to an image, that will draw it at (x, y) coordinates. 
attach = function(img, x, y) 
{ 
    img.onload = function() 
    { 
     context.drawImage(img, x, y); 
    } 
} 

for (var i = 0; i <= maxImg; i++) 
{ 
    imgSrc = "photo_" + i + ".jpg"; 

    images[i] = new Image(); 
    images[i].src = imgSrc; 

    attach(images[i], thisWidth*i, thisHeight); 
} 
+1

我会检查一下:) – Ron