2013-05-21 79 views
0

爲什麼如此難以檢查img是否已加載JavaScript?使用其他語言,通過循環可以輕鬆解決這個問題,並且可以在圖像加載時解決。爲什麼JavaScript很難檢查圖片是否被加載?

這是一個函數,它在傳遞文件路徑後返回一個加載的img。除了onload似乎沒有其他工作來檢查圖像是否已加載。我無法使用img.complete或任何其他方法,每次都檢查循環,直到加載完成,因爲它無法正常工作(瀏覽器將掛起)。

global_image_loaded = 0 
function LOADIMAGE(imagesrc) { 
    global_image_loaded = 0 
    var img = new Image(); 
    img.src = imagesrc + "?" + new Date().getTime(); 

    img.onload = function() { 
     global_image_loaded = 1; 
    } 

    if (global_image_loaded = 1){ 
     return img; 
    } else { 
     return 0; 
    } 
} 

此功能工作正常,直到我嘗試繪製圖像用下面的函數以帆布:

function IMAGE(elementid, img, x, y, w, h) { 
     var mode = 0; 

     if (w === undefined) { 
      mode = 1; 
     } 

     if (h === undefined) { 
      mode = 1; 
     } 

     var canvas = document.getElementById(elementid); 
     if (! canvas || ! canvas.getContext) { return false; } 
     var ctx = canvas.getContext('2d'); 

     if (mode === 1) { 
      ctx.drawImage(img, x, y); 
     } 

     if (mode === 0) { 
      ctx.drawImage(img, x, y, w, h); 
     } 
    } 

此功能太多,但只有放在一個循環裏面,跑了好幾次。圖像將顯示在畫布上,但執行一次後不會加載圖像。這怎麼可能,還沒有img已經加載?

我認爲這是如何在JavaScript中完成的,遺憾的是img無法返回,需要隨時顯示。似乎沒有辦法任意顯示圖像。

function PLACEIMAGE(elementid, imagesrc, x, y, w, h) { 
    var mode = 0; 

    if (w === undefined) { 
     mode = 1; 
    } 

    if (h === undefined) { 
     mode = 1; 
    } 

    var canvas = document.getElementById(elementid); 
    if (! canvas || ! canvas.getContext) { return false; } 
    var ctx = canvas.getContext('2d'); 

    var img = new Image(); 
    img.src = imagesrc + "?" + new Date().getTime(); 
    img.onload = function() { 

     if (mode === 1) { 
      ctx.drawImage(img, x, y); 
     } 

     if (mode === 0) { 
      ctx.drawImage(img, x, y, w, h); 
     } 
    }; 
} 
+2

男孩這個問題聽起來很煩躁。你的第一個函數有缺陷,因爲if(global_image_loaded = 1){'將始終設置變量並通過條件。 JavaScript是單線程的,但允許異步代碼執行。你的第一個功能是反模式。如果您希望在加載圖像後運行一些代碼,您應該將回調函數傳遞給您的'LOADIMAGE'函數,並在圖像爲'.complete'時調用它,或者將其分配給'img.onload'屬性。非常簡短。 – 2013-05-21 02:39:18

+2

爲什麼這個標籤* crockford * ?! – bfavaretto

+0

我一開始使用onload和回調函數,但是我想在這裏完成的是加載一個圖像並通過調用單個函數LOADIMAGE返回img。 – user2403759

回答

相關問題