2012-03-22 67 views
54

有沒有一種方法可以確定圖像路徑是否導致實際圖像,也就是說,檢測圖像何時無法在Javascript中加載。當圖像無法以Javascript加載時檢測

對於Web應用程序,我解析XML文件並從圖像路徑列表動態創建HTML圖像。某些圖像路徑可能不再存在於服務器上,因此我想通過檢測哪些圖像無法加載並刪除該HTML img元素來優雅地失敗。

注意JQuery解決方案將無法使用(老闆不想使用JQuery,是的,我知道不讓我開始)。我知道在JQuery中檢測圖片何時加載的方法,但不知道它是否失敗。

我的代碼來創建img元素,但我如何檢測img路徑導致加載失敗的圖像?

var imgObj = new Image(); // document.createElement("img"); 
imgObj.src = src; 
+0

這可以幫助你:http://stackoverflow.com/questions/1977871/check-if-an-image-is-loaded-no-errors -in-javascript(它是jQuery,但它仍然可能導致你在正確的路徑) – 2012-03-22 03:02:48

+0

嘗試其中一個https://www.google.com/search?rlz=1C1CHJL_esMX444MX444&sourceid=chrome&ie=UTF-8&q=Detect+when+一個+圖像+失敗+到+負載+在+的Javascript#HL = EN&RLZ = 1C1CHJL_esMX444MX444&sclient = PSY-AB&q =站點%3Ahttp%3A%2F%2Fstackoverflow.com + +當檢測+的+圖像+失敗+至+負載+在+的Javascript和OQ =網站: HTTP%3A%2F%2Fstackoverflow.com + + +的圖像+失敗+到+負載在+ +的Javascript&水溶液= F&AQI =&AQL =&gs_l = serp.12當檢測+ ...4485l10141l0l11322l11l9l0l0l0l0l165l703l8j1l9l0.frgbld。與PBX = 1&BAV = on.2,or.r_gc.r_pw.r_qf,cf.osb&計劃生育= 19d0ebe5924d5495&BIW = 1024&波黑= 653 – ajax333221 2012-03-22 03:08:18

+1

滑稽@ ajax333221過這個問題,首先在你的鏈接的結果:) – 2013-11-07 22:35:27

回答

63

你可以試試下面的代碼。雖然我不能保證瀏覽器的兼容性,所以你必須測試它。

function testImage(URL) { 
    var tester=new Image(); 
    tester.onload=imageFound; 
    tester.onerror=imageNotFound; 
    tester.src=URL; 
} 

function imageFound() { 
    alert('That image is found and loaded'); 
} 

function imageNotFound() { 
    alert('That image was not found.'); 
} 

testImage("http://foo.com/bar.jpg"); 

而我對jQuery耐心老闆的同情!

+1

任何想法如果有方法可以判斷它是否遇到重定向? – quickshiftin 2014-11-18 06:12:38

+2

根據您從中獲取圖像的服務器,這不適用於webKit(Epiphany,Safari,...)。例如,有時imgur不會發送存在的圖像,也不會發送404狀態,並且在這種情況下不會觸發錯誤事件。 – 2015-06-04 13:02:31

3

這是我寫了另一個答案的功能:Javascript Image Url Verify。我不知道它是否正是您所需要的,但它使用了您將使用的各種技術,其中包括onloadonerroronabort的處理程序和一般超時。

由於圖像加載是異步的,因此您可以使用圖像調用此函數,稍後再調用結果的回調函數。

-14

就像如下:

var img = new Image(); 
img.src = imgUrl; 

if (!img.complete) { 

//has picture 
} 
else //not{ 

} 
+3

不是。這可能會提示您是否在某些瀏覽器中緩存圖像 - 但是如果沒有加載回調,您甚至不會等待一段時間,讓瀏覽器有機會爲該圖像啓動HTTP請求。 – ChaseMoskal 2013-10-28 19:56:11

+0

這只是爲了說點什麼! – Hitmands 2016-03-16 08:29:29

+2

圖像加載是異步的。 – 2016-09-19 13:26:33

19

答案是好的,但它引入了一個問題。只要您直接指定onloadonerror,它可能會替換先前分配的回調。這就是爲什麼有一個很好的方法,「將指定的偵聽器註冊到它在MDN上說的」上調用的EventTarget「上。您可以在同一個事件中根據需要註冊許多聽衆。

讓我稍微改寫一下答案。

function testImage(url) { 
    var tester = new Image(); 
    tester.addEventListener('load', imageFound); 
    tester.addEventListener('error', imageNotFound); 
    tester.src = url; 
} 

function imageFound() { 
    alert('That image is found and loaded'); 
} 

function imageNotFound() { 
    alert('That image was not found.'); 
} 

testImage("http://foo.com/bar.jpg"); 

因爲外部資源加載過程是異步的,它會更好使用與承諾,如下面的JavaScript現代化。

function testImage(url) { 

    // Define the promise 
    const imgPromise = new Promise(function imgPromise(resolve, reject) { 

     // Create the image 
     const imgElement = new Image(); 

     // When image is loaded, resolve the promise 
     imgElement.addEventListener('load', function imgOnLoad() { 
      resolve(this); 
     }); 

     // When there's an error during load, reject the promise 
     imgElement.addEventListener('error', function imgOnError() { 
      reject(); 
     }) 

     // Assign URL 
     imgElement.src = url; 

    }); 

    return imgPromise; 
} 

testImage("http://foo.com/bar.jpg").then(

    function fulfilled(img) { 
     console.log('That image is found and loaded', img); 
    }, 

    function rejected() { 
     console.log('That image was not found'); 
    } 

); 
+0

也許我錯過了一些東西,但如果「測試人員」剛剛創建,那麼賦值(tester.onload = ..)如何替換回調?即使代碼中某些不明顯的部分爲每個創建的圖像添加了一個事件,但我們並不清楚要保留這些事件是爲了檢測圖像是否存在。 – jvilhena 2017-04-15 18:24:53

+0

你是絕對正確的。在這個特殊情況下,它可能不是問題,因爲它很可能不會被替換。但是,通常,添加事件偵聽器比直接分配方法更好。 – 2017-04-16 20:07:49

+0

沒有箭頭函數和異步/等待的現代JavaScript? :) – 2017-06-19 09:22:49

2
/** 
* Tests image load. 
* @param {String} url 
* @returns {Promise} 
*/ 
function testImageUrl(url) { 
    return new Promise(function(resolve, reject) { 
    var image = new Image(); 
    image.addEventListener('load', resolve); 
    image.addEventListener('error', reject); 
    image.src = url; 
    }); 
} 

return testImageUrl(imageUrl).then(function imageLoaded(e) { 
    return imageUrl; 
}) 
.catch(function imageFailed(e) { 
    return defaultImageUrl; 
}); 
0

此:

<img onerror="this.src='/images/image.png'" src="..."> 
+1

雖然這是一個可用作圖像故障轉移技術的有用屬性,但更詳細的響應將有助於讀者理解它。 – sorak 2018-02-15 21:59:34