JavaScript - Settting property on Object in Image load function, property not set once outside funct
Posted
by Sunday Ironfoot
on Stack Overflow
See other posts from Stack Overflow
or by Sunday Ironfoot
Published on 2010-05-09T15:26:26Z
Indexed on
2010/05/09
16:18 UTC
Read the original article
Hit count: 756
Sometimes JavaScript doesn't make sense to me, consider the following code that generates a photo mosaic based on x/y tiles. I'm trying to set a .Done property to true once each Mosaic image has been downloaded, but it's always false for some reason, what am I doing wrong?
var tileData = [];
function generate()
{
var image = new Image();
image.onload = function()
{
// Build up the 'tileData' array with tile objects from this Image
for (var i = 0; i < tileData.length; i++)
{
var tile = tileData[i];
var tileImage = new Image();
tileImage.onload = function()
{
// Do something with this tile Image
tile.Done = true;
};
tileImage.src = tile.ImageUrl;
}
};
image.src = 'Penguins.jpg';
tryDisplayMosaic();
}
function tryDisplayMosaic()
{
setTimeout(function()
{
for (var i = 0; i < tileData.length; i++)
{
var tile = tileData[i];
if (!tile.Done)
{
tryDisplayMosaic();
return;
}
}
// If we get here then all the tiles have been downloaded
alert('All images downloaded');
}, 2000);
}
Now for some reason the .Done
property on the tile
object is always false, even though it is explicitly being set to true inside tileImage.onload = function()
. And I can ensure you that this function DOES get called because I've placed an alert()
call inside it. Right now it's just stuck inside an infinite loop calling tryDisplayMosaic()
constantly.
Also if I place a loop just before tryDisplayMosaic()
is called, and in that loop I set .Done = true
, then .Done
property is true and alert('All images downloaded');
will get called.
© Stack Overflow or respective owner