2013-04-25 37 views
4

我發現有關IE 9和繪製圖像到stackoverflow上討論的HTML5 cnavases類似的時間問題,但沒有一個完全符合我的。HTML5 Image.onload在Internet Explorer 9中競爭條件

我遇到了一個問題,定期調用圖像的onload函數,但仍未準備好繪製到畫布。 (畫布保持空白)。在onload中,圖像的「完整」屬性始終爲true,「width」和「height」屬性始終包含預期值。沒有例外被拋出。如果我在將圖像繪製到畫布之前放置了一小段延遲,我永遠不會得到空白的畫。我還可以將另一個嘗試將圖像繪製到像鼠標點擊這樣的事件,並且這總是成功的。我沒有在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"; 
+0

我應該補充一點,更令人沮喪的是,如果我打開IE 9調試器(使用F12),這個時間問題就不會發生。 – user2320956 2013-04-25 18:54:48

回答

0

我沒有看到你將畫布追加到身體的位置 - 這是故意的嗎?

無論如何,嘗試把createElementonload

這是否讓事情保持良好?

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"; 
+0

謝謝你的迴應。在我的示例中,我沒有將畫布附加到文檔正文,這是正確的。一旦圖像被標記爲已加載,我將其重複複製到setInterval循環中的實際文檔畫布。 (這是遊戲的背景)。按照您的建議在onload中創建元素使問題不再頻繁,但並未完全阻止。不過,我相信這是因爲這延遲了被調用的onload和正在執行的drawImage之間的時間。我也可以通過在繪製之前立即放置一個空的for循環來實現相同的改進。 – user2320956 2013-04-25 20:29:25

+0

**您完全不需要任何延遲循環**此時,onload中的所有代碼都正在同步執行。任何其他線索?順便說一句,任何複製這個新的畫布需要在onload完成後完成(例如,在onload內部調用copyToCanvas()以確保準備就緒。 – markE 2013-04-25 20:54:56