【问题标题】:Drawing multiple HTML canvases only draws the last one?绘制多个 HTML 画布只绘制最后一个?
【发布时间】:2012-12-06 04:18:42
【问题描述】:

在我正在编写的应用程序中有一个页面,我从我的数据库中加载多个 base64 编码的图像并将它们放在 JavaScript 数组中。这是通过 EJS 模板在服务器上发生的,因此当用户收到 HTML 页面时,会出现 base64 编码的图像(我检查了这个)。

下一步是在客户端使用 JavaScript 循环遍历画布,然后用相应的图像数据填充每个画布。但是,我得到了一些奇怪的行为。每次只填充最后一个画布。

for (var i = 1; i < 13; i++) {
    var ctx = document.getElementById('canvas-' + i).getContext('2d'),
        image = new Image();

    image.onload = function() {
        ctx.drawImage(image, 0, 0);
    }
    image.src = images[(i - 1)];
}

images 数组定义在这段代码的正上方(在同一范围内)。如果我像这样执行代码,则只会填充最后一个画布(id 为“canvas-12”)。如果我将 for 循环结束条件降低到例如 i

我有什么遗漏吗?

【问题讨论】:

    标签: javascript html loops canvas for-loop


    【解决方案1】:

    似乎是一个关闭问题;每次循环时,都会更改 onload 函数中包含的对象 ctx。您需要确保在循环期间没有使用闭包更新对象:

    for (var i = 1; i < 13; i++) {
        var ctx = document.getElementById('canvas-' + i).getContext('2d'),
            image = new Image();
        (function(ctx, image) {
            image.onload = function() {
                ctx.drawImage(image, 0, 0);
            }
            image.src = images[(i - 1)];
        })(ctx, image);
    }
    

    注意:我没有对此进行测试。

    【讨论】:

    • @SimonSarris 对于这个问题,可能有一个合适的 exact duplicate 。这是一个常见的问题。
    • 谢谢,成功了!我会在 5 分钟限制后接受你的回答 :)
    猜你喜欢
    • 2020-11-10
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2012-01-14
    • 2011-01-09
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多