Javascript HTML5画布上带有drawImage的奇怪bug

Javascript HTML5画布上带有drawImage的奇怪bug,javascript,html,canvas,Javascript,Html,Canvas,JSFIDLE(注意:它不显示任何内容,它只是我以更简洁的格式显示代码的一种方式) 我对HTML5画布还不熟悉,所以决定玩玩,看看我能用它做些什么。到目前为止,我已经能够在画布上绘制本地托管的图像,甚至可以进行一些基本的平铺: window.onload = function(){ var GameClosure = function() { var canv = document.getElementById("canv"); var canvCon

JSFIDLE(注意:它不显示任何内容,它只是我以更简洁的格式显示代码的一种方式)

我对HTML5画布还不熟悉,所以决定玩玩,看看我能用它做些什么。到目前为止,我已经能够在画布上绘制本地托管的图像,甚至可以进行一些基本的平铺:

window.onload = function(){

    var GameClosure = function() {

        var canv = document.getElementById("canv");
        var canvContext = canv.getContext("2d");

        var sprite = new Image();
        sprite.src = "sprite.png"

        var tile = new Image();
        tile.src = "tile.png"

        function loadSprite(){
            sprite.onload = function(){
                canvContext.drawImage(sprite, 50, 50);
                };
        }

        function loadTiles(){
            tile.onload = function(){
                for(var i = 0; i < 800; i += 16){
                    for(var r = 0; r < 608; r += 16){
                        canvContext.drawImage(tile, i, r);
                    }
                }
            };
        }

        return{
            loadTiles: loadTiles,
            loadSprite: loadSprite
            };

    }();

    GameClosure.loadTiles();
    GameClosure.loadSprite();

}
window.onload=function(){
var GameClosure=function(){
var canv=document.getElementById(“canv”);
var canvContext=canv.getContext(“2d”);
var sprite=新图像();
sprite.src=“sprite.png”
var tile=新图像();
tile.src=“tile.png”
函数loadSprite(){
sprite.onload=函数(){
canvContext.drawImage(sprite,50,50);
};
}
函数loadTiles(){
tile.onload=函数(){
对于(变量i=0;i<800;i+=16){
对于(var r=0;r<608;r+=16){
canvContext.drawImage(tile,i,r);
}
}
};
}
返回{
loadTiles:loadTiles,
loadSprite:loadSprite
};
}();
GameClosure.loadTiles();
GameClosure.loadSprite();
}
我有一个奇怪的问题。当我加载时,大多数情况下,只有瓷砖会加载。到目前为止,我已经尝试了一些方法,我已经切换了
GameClosure.loadTiles()和GameClosure.loadSprite()调用以查看加载顺序是否有任何差异。没有。我甚至尝试创建第二个上下文,并将瓷砖分配给一个,将精灵分配给另一个,但这没有什么区别。注释掉平铺调用将正确生成精灵

更奇怪的是。我正在快速刷新页面,我注意到偶尔(在没有模式的情况下,有时可能会连续发生3次,另一次是20次)会加载瓷砖,精灵会像我预期的那样加载到顶部


这个问题能解决吗?我唯一的猜测是,我的代码在某种程度上是异步运行的,创建平铺的for循环在sprite加载后完成,但查看我的代码,我看不出这可能发生在哪里。

将关注点分开。等待加载所有资源(和文档),然后启动游戏。始终确保在分配src之前挂接事件处理程序,以避免“随机”(事实上与缓存相关)行为

将关注点分开。等待加载所有资源(和文档),然后启动游戏。始终确保在分配src之前挂接事件处理程序,以避免“随机”(事实上与缓存相关)行为

将关注点分开。等待加载所有资源(和文档),然后启动游戏。始终确保在分配src之前挂接事件处理程序,以避免“随机”(事实上与缓存相关)行为

将关注点分开。等待加载所有资源(和文档),然后启动游戏。始终确保在分配src之前挂接事件处理程序,以避免“随机”(事实上与缓存相关)行为

设置
onload
处理程序时,javascript将在后台加载资源时继续。资源加载后,将执行处理程序。你没有办法知道什么时候会发生,以什么顺序发生

当您有多个资源并且希望在加载最后一个资源时调用draw函数时,可以使用全局预加载程序对象。每个onload处理程序都应该调用预加载程序上的一个函数来通知它资源已加载。该函数应该检查是否所有资源都已报告,并在这种情况下执行draw函数


另外,当您设置了onload处理程序并且资源已经加载时。当您设置
.src
并且资源位于浏览器缓存中时,它将立即被加载。因此,您始终需要先设置
.onload
,然后设置
.src
当您设置
onload
处理程序时,您的javascript将在后台加载资源时继续。资源加载后,将执行处理程序。你没有办法知道什么时候会发生,以什么顺序发生

当您有多个资源并且希望在加载最后一个资源时调用draw函数时,可以使用全局预加载程序对象。每个onload处理程序都应该调用预加载程序上的一个函数来通知它资源已加载。该函数应该检查是否所有资源都已报告,并在这种情况下执行draw函数


另外,当您设置了onload处理程序并且资源已经加载时。当您设置
.src
并且资源位于浏览器缓存中时,它将立即被加载。因此,您始终需要先设置
.onload
,然后设置
.src
当您设置
onload
处理程序时,您的javascript将在后台加载资源时继续。资源加载后,将执行处理程序。你没有办法知道什么时候会发生,以什么顺序发生

当您有多个资源并且希望在加载最后一个资源时调用draw函数时,可以使用全局预加载程序对象。每个onload处理程序都应该调用预加载程序上的一个函数来通知它资源已加载。该函数应该检查是否所有资源都已报告,并在这种情况下执行draw函数


另外,当您设置了onload处理程序并且资源已经加载时。当您设置
.src
并且资源位于浏览器缓存中时,它将立即被加载。因此,在设置
onload
处理程序时,始终需要先设置
.onload
然后设置
.src