2011-12-28 31 views
2

有時候我有些象這樣的錯誤之一,當我與畫布上的Firefox工作:火狐帆布工作時拋出錯誤0x80004005

Error: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.lineWidth]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: media/js/canvas/Rectangle.js :: :: line 34" data: no]

它發生時,我正在與超過5種畫布元素的工作,上一個for循環。創建它們的函數是這樣的:

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

感謝您的幫助。

+0

什麼是'for bucle'? (你的意思是'循環'?) – zwol 2011-12-28 20:55:26

+0

是的,抱歉...我不是英語。生病編輯帖子糾正它。 – elxordi 2011-12-28 21:08:41

回答

6

這些錯誤信息讓初學者感到困惑,但有很多信息都包含在它們中。最重要的部分是:

Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.lineWidth]

忽略的十六進制數:這是告訴你,存取nsIDOMRenderingContext2D.lineWidth返回一般故障代碼(NS_ERROR_FAILURE)而不是一條線寬度。 nsIDOMRenderingContext2D是C++類的內部名稱,它實現了您在畫布元素上從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,我不會在這裏引用它,因爲它很龐大,並且有很多方法可能會失敗。然而,在我看來,像你的一個畫布元素要麼沒有正確定義,要麼沒有機會初始化自己(即你需要允許事件循環運行)。

編輯:具體的建議:改變你引用的是這樣的功能:

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

您還需要更改所有呼叫者匹配。我不能保證這會起作用,但這是我能想到的最可信的事情。

+0

我沒想到會有這麼大的答案,我會看看這個文件,看看我能否看到任何東西,並弄清楚它是如何失敗的。我會告訴你,如果我發現任何東西,或者如果我不,現在,謝謝你) 順便說一句,我告訴的問題,它不僅在lineWidth函數失敗,這就是爲什麼我沒有' t發佈了代碼。有時它會失敗,主要是在getContext行中。 – elxordi 2011-12-28 21:22:57

+0

好吧,看起來整個功能,我不能確定它來自哪裏。奇怪的是,有幾個元素,它工作正常。超過十個,而不是特定的數字,事實並非如此。但有時候。也許這只是一個瀏覽器錯誤,但代碼太多了。 – elxordi 2011-12-28 22:27:21

+0

我添加了一些東西來嘗試。我不能保證這是問題,但它有一個很好的工作機會。 – zwol 2011-12-29 08:28:05