【问题标题】:HTML5 Image.onload race condition in Internet Explorer 9Internet Explorer 9 中的 HTML5 Image.onload 竞争条件
【发布时间】:2013-04-19 18:37:34
【问题描述】:

我发现了关于 IE 9 和在 stackoverflow 上讨论的将图像绘制到 HTML5 cnavases 的类似时间问题,但没有一个与我的完全匹配。

我遇到了一个问题,即定期调用图像的 onload 函数,但它仍未准备好被绘制到画布上。 (画布保持空白)。在 onload 中,图像的“完整”属性始终为真,“宽度”和“高度”属性始终包含预期值。不抛出异常。如果我在将图像绘制到画布之前稍微延迟 onload,我永远不会得到空白绘制。我还可以将绘制图像的另一次尝试与鼠标单击等事件联系起来,这总是成功的。我没有在 Chrome 或 Firefox 中观察到这一点。我很欣赏任何见解。谢谢!

var canvas = document.createElement('canvas');
canvas.width = 640;
canvas.height = 480;

var context = canvas.getContext("2d");

var image = new Image();

image.onload = function()
{   
    // this.complete always true here
    // A delay here seems to guarantee the draw will succeed
    context.drawImage(this, 0, 0);  // Half the time canvas remains blank after draw
    // If the canvas is still blank, a later call to context.drawImage with this image will succeed

}

image.src = "some.png";

【问题讨论】:

  • 我应该补充一点,更令人沮丧的是,如果我打开 IE 9 调试器(使用 F12),则永远不会出现此计时问题。

标签: javascript internet-explorer-9 html5-canvas


【解决方案1】:

我没有看到您将画布附加到正文的哪个位置——这是故意的吗?

无论如何,尝试将createElement 放在onload

这会让事情始终如一吗?

    var canvas;
    var context;

    var image = new Image();

    image.onload = function()
    { 
        canvas = document.createElement('canvas');
        canvas.width = 640;
        canvas.height = 480;
        document.body.appendChild(canvas);
        context = canvas.getContext("2d");

        context.drawImage(this, 0, 0);  // Half the time canvas remains blank after draw
    }
    image.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/city-q-c-640-480-6.jpg";

【讨论】:

  • 感谢您的回复。在我的示例中,我没有将画布附加到文档的正文中,这是正确的。一旦图像被标记为已加载,我会在 setInterval 循环中将其重复复制到实际的文档画布上。 (这是游戏的背景)。按照您的建议在 onload 中创建元素使问题不那么频繁,但并没有完全阻止它。但是,我相信这是因为这延迟了调用 onload 和执行 drawImage 之间的时间。我也可以通过在绘图前立即放置一个空的 for 循环来实现同样的改进。
  • 您根本不需要任何延迟循环。 此时,onload 中的所有代码都在同步执行。还有其他线索吗?顺便说一句,这个新画布的任何复制都需要在 onload 完成后完成(例如,在 onload 中调用 copyToCanvas() 以确保准备就绪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2016-03-07
  • 2011-07-17
  • 2013-02-27
  • 2021-04-16
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多