【问题标题】:Firefox throws error 0x80004005 when working with canvasFirefox 在使用画布时抛出错误 0x80004005
【发布时间】:2011-12-28 20:25:37
【问题描述】:

当我在 Firefox 上使用画布时,有时会出现类似这样的错误:

错误:未捕获的异常:[Exception...“组件返回失败 代码:0x80004005(NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.lineWidth]" nsresult: "0x80004005 (NS_ERROR_FAILURE)”位置:“JS框架:: media/js/canvas/Rectangle.js :: :: line 34" data: no]

当我在 for 循环中使用超过 5 个画布元素时会发生这种情况。创建它们的函数是这样的:

function addCanvas(id) {
var canvas = document.getElementById(id);

if (canvas == null) {
    $('#content').append(
        '<canvas id="' + id + '" width="' + workAreaWidth +'" height="' 
            + workAreaHeight + '"></canvas>'
    );

    canvas = document.getElementById(id).getContext('2d');
} else {
    canvas = canvas.getContext('2d');
    canvas.setTransform(1, 0, 0, 1, 0, 0);
    canvas.clearRect(0, 0, workAreaWidth, workAreaHeight);
}   

return canvas;
}

for 循环在另一个函数中。

发生的情况是并非所有画布元素都已更新。我猜是异常的原因。

我无法发布它完全失败的地方的代码,因为它在许多地方随机失败,总是出现相同的错误。

Firefox 版本是 9.0,但也发生在 8.0.1。我没有在以前的版本中测试它。我的操作系统是 Mac Snow Leopard。我想这会有所帮助。它不会在 Chrome 或 Safari 上失败,

感谢您的帮助。

【问题讨论】:

  • 什么是'for bucle'? (你的意思是“for循环”吗?)
  • 是的,对不起...我不是英语。我会编辑帖子以更正它。

标签: javascript jquery firefox canvas


【解决方案1】:

这些错误消息会让外行感到困惑,但其中包含很多信息。重要的部分是:

组件返回失败代码:0x80004005 (NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.lineWidth]

忽略十六进制数:这告诉您访问器nsIDOMRenderingContext2D.lineWidth 返回了一个通用故障代码 (NS_ERROR_FAILURE) 而不是线宽。 nsIDOMRenderingContext2D 是 C++ 类的内部名称,该类实现了您从画布元素上的 getContext("2d") 返回的对象。

位置:“JS 框架 :: media/js/canvas/Rectangle.js :: :: 第 34 行”

从 JavaScript 到 C++ 方法的调用失败位于 media/js/canvas/Rectangle.js 的第 34 行。那是你的代码。但是,不是,您引用的代码,但也许我们可以通过查看失败的访问器的代码来找出问题所在:http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/nsCanvasRenderingContext2D.cpp#3180

nsresult
nsCanvasRenderingContext2D::GetLineWidth(float *width)
{
    if (!EnsureSurface())
        return NS_ERROR_FAILURE;

    gfxFloat d = mThebes->CurrentLineWidth();
    *width = static_cast<float>(d);
    return NS_OK;
}

好的,唯一可能失败的方法是EnsureSurface 失败。 那个http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/nsCanvasRenderingContext2D.cpp#1154 中定义,我不会在这里引用它,因为它很大并且有很多可能失败的方式。但是,在我看来,您的某个画布元素要么未正确定义,要么没有机会进行自我初始化(即您需要允许事件循环运行)。

编辑:具体建议:将您引用的函数更改为:

function addCanvas(id, continuation) {
    if (document.getElementById(id) === null) {
        $('#content').append(
            '<canvas id="' + id + '" width="' + workAreaWidth +'" height="' 
            + workAreaHeight + '"></canvas>'
        );
    }

    setTimeout(function() {
        var canvas = document.getElementById(id).getContext('2d');
        canvas.setTransform(1, 0, 0, 1, 0, 0);
        canvas.clearRect(0, 0, workAreaWidth, workAreaHeight);
        continuation(canvas);
    }, 0);
}

您还需要更改所有来电者以匹配。我不保证这会奏效,但这是我能想到的最合理的事情。

【讨论】:

  • 我没想到会有这么大的答案大声笑我会查看文件,看看我是否可以看到其中的任何内容并弄清楚它是如何失败的。如果我发现任何东西或者没有,我会告诉你一些事情,谢谢现在;)顺便说一句,我在问题中告诉它不仅在 lineWidth 函数中失败,这就是我没有发布的原因代码。有时它会在任何地方失败,主要是在 getContext 行中。
  • 好的,看了整个函数,我不能确定它来自哪里。奇怪的是,只要有几个元素就可以了。超过十个,不是一个特定的数字,它不是。但只是有时。也许这只是一个浏览器的错误,但是代码太多了。
  • 我添加了一些东西来尝试。我不能保证这是问题所在,但它有很大的工作机会。
  • 也不工作。我也觉得是因为没有足够的时间去发现新元素之类的东西,但似乎不是这样。我还尝试重用已经存在的画布元素,但没有成功。我想我会停止担心并使用 chrome 大声笑
  • EnsureSurface 在启用硬件加速的 Windows 上失败的最可能原因是您的画布大于 GPU 上的纹理大小。如果您使用的是 Windows,您的画布尺寸是多少?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多