Ваша проблема - закрытие Javascript. Если вы не знаете об этом, посмотрите . Если вы добавите alert(i+','+j+','+img.src)
к своей функции загрузки и запустите программу, вы увидите, что функция загрузки использует конечные значения переменной цикла - т.е. 9,9.
Чтобы передать значения, которые вы на самом деле хотите передать, вам нужно создать новую область видимости, используя самопризывающуюся анонимную функцию. Итак, ваш код должен выглядеть так:
for (var i=1;i<9;i++){
for (var j=1;j<9;j++){
var img=new Image();
(function(i,j,img){
img.onload=function(){
ctx.drawImage(img,sqs*(i-1),sqs*(j-1),32,32);
};
img.src="http://placekitten.com/"+(30+i)+"/"+(30+j);
})(i,j,img) ;
}
}
Нажмите здесь для живого примера .
Кстати, причина того, что ваш код работал, когда у вас был оператор alert(img.src)
, заключалась в том, что вы останавливали цикл на каждой итерации, что приводило к тому, что ваша функция onload (которая не выполняется до загрузки изображения) ) использовал правильные i
и j
. Без оператора alert
цикл устанавливает (i,j)
в (9,9)
ко времени загрузки любого из изображений.