使用canvas时,Firefox会抛出错误0x80004005

时间:2011-12-28 20:25:37

标签: javascript jquery firefox canvas

当我在Firefox上使用canvas时,有时会出现类似的错误:

  

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

当我在for循环中使用超过5个canvas元素时,会发生这种情况。创建它们的功能是:

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上失败,

感谢您的帮助。

1 个答案:

答案 0 :(得分:6)

这些错误消息让那些没有经验的人感到困惑,但是有很多信息都包含在其中。重要的部分是:

  

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

忽略十六进制数:这告诉您访问者nsIDOMRenderingContext2D.lineWidth返回了一般失败代码(NS_ERROR_FAILURE)而不是行宽。 nsIDOMRenderingContext2D是C ++类的内部名称,它实现了从canvas元素上getContext("2d")获取的对象。

  

location:“JS frame :: media / js / canvas / Rectangle.js :: :: line 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定义的,我不会在这里引用它,因为它很庞大并且有很多方法可以失败。但是,在我看来,你的一个canvas元素要么没有正确定义,要么没有机会初始化自己(即你需要允许事件循环运行)。

编辑:具体建议:更改您引用的功能如下:

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);
}

您还需要更改所有来电者。我不保证这会起作用,但这是我能想到的最合理的事情。