在加载图像之前,我的 img.onload 似乎正在触发。我正在尝试在画布上绘制图像。
这是我的代码:
var tileAtlas = [ ];
function loadAtlasJSON() {
for (var i = 0; i < JSONpaths.length; i++) {
loadJSON(
{
fileName: JSONpaths[ i ],
success: function( atlas ) {
console.log(atlas.id);
addToTileAtlas( atlas );
}
}
);
}
};
function addToTileAtlas( atlas ) {
atlas.loaded = false;
var img = new Image();
img.onload = function() {
// Logs way too soon from the previous console.log
console.log(atlas.id);
atlas.loaded = true;
console.log(atlas.loaded);
};
// Always returns false, so onload has not fired yet
console.log(atlas.loaded);
img.src = atlas.src;
// Store the image object as an "object" property
atlas.object = img;
tileAtlas[ atlas.id ] = atlas;
}
在这段代码之后,我使用不断检查每个图集的 .loaded 直到全部为真。当它们都为真时,我在画布上绘制图像,但没有显示任何内容。
但是如果我在绘制图像之前设置了一个超时时间(比如 1000 毫秒),那么图像就会被绘制得很好。这让我相信 .onload 是在图像实际加载之前触发的。
此外,我认为日志的时间戳彼此太接近,无法解释每张图像的加载时间,即 20-90 kb。
[16:12:06.209] "ground"
[16:12:06.210] false
[16:12:06.211] "ground-collision"
[16:12:06.211] false
[16:12:06.213] "objects-collision"
[16:12:06.213] false
[16:12:06.223] "ground"
[16:12:06.223] true
[16:12:06.224] "ground-collision"
[16:12:06.224] true
[16:12:06.225] "objects-collision"
[16:12:06.225] true
我知道分配给 onload 的函数不会立即调用,因为console.log(atlas.loaded);
在 img.onload 分配下仍然返回 false。
我已经在多个我知道不保存图像缓存的浏览器中检查了这一点。在我的主浏览器 Firefox 中,我将network.http.use-cache
and设置browser.cache.offline.enable
为 false。
我正在使用 MAMP 在 localhost apache 服务器上测试此代码,但我不知道这是否相关。
由于我知道使用超时来延迟图像的显示,这也意味着 JSON 加载和 img.src 路径是正确的。
由于 img.onload 触发得太快,我只能想到几个原因:
- 浏览器缓存了图像,因此将其视为已加载。但这并不能解释为什么即使刷新也不会显示图像。
- 我的 .onload 语法/用法不正确。
谢谢你的帮助!