2013-10-28 156 views
0

我有這樣的iframe:如何捕捉iframe加載錯誤?

<iframe id="website-overlay" src="link" onload="OverlayMostraCustomContenuto()"></iframe> 

不過這個功能被加載即使在裝載錯誤,如:

Load denied by X-Frame-Options: http://www.youtube.com/watch?v=Q4cQsoz4mFA&feature=share does not permit cross-origin framing. 

有沒有辦法知道,如果iframe是裝正確與否?我想是的,如果螢火蟲可以抓住它。

回答

-1

你可以聽error事件,但由於同源策略你根本無法做到這一點。
但是可以嘗試一種解決方法 - 將偵聽器綁定到iframe的load事件,並添加一個setTimeout函數,該函數將視爲iframe在指定時間後未加載。我知道,沒有多少優雅的解決方案,但只有我能想到。
示例代碼看起來是這樣的:

var iframe = document.getElementById('iframe'); 
var iframeLoadTimeAllowed = 30000; // 30 seconds (or whatever you want) 

var timeout = setTimeout(function() { 
    alert("Iframe's loading exceeded " + (iframeLoadTimeAllowed/1000) + " seconds!"); 
}, iframeLoadTimeAllowed); 

iframe.addEventListener('load', function() { 
    clearTimeout(timeout); 
}) 

當涉及到Firebug的控制檯,父文件和iframe的文檔共享相同的console對象。這就是爲什麼可以輸出iframe引發的錯誤。

+4

我不理解你的解決方法。在任何情況下都會調用onload,那麼如何知道它是實際負載還是失敗負載?你能給我一個例子嗎? – markzzz

+0

您添加'setTimeout'函數,然後將'load'事件監聽器添加到將清除超時的iframe。如果超時不會被清除,這意味着iframe無法在指定的時間加載=='錯誤'。 – matewka

+0

對不起,我不明白。 setTimeout當我嘗試加載iframe,它會將一個負載處理程序添加到iframe?爲什麼它應該起作用?你能寫兩行代碼嗎? – markzzz

4

我的「解決方案」沒有檢測到所有的iframe錯誤,但它確實「檢測到」您在無法控制的網站上提問的問題。

我在調用load()事件的iframe中有onload =「load()」。唯一的問題是即使加載失敗,也會調用此加載事件。我試過使用onerror =「error()」事件,但它永遠不會被調用。

這是一個有點哈克我知道,但我一直沒能更好地找到任何這樣的辦法解決這個我做到以下幾點:

當請求的iframe,我設置了iframeRequestTime以毫秒爲單位的地方在頁面上。當load()事件被調用時,我得到loadTime。然後我發現loadTime和requestTime之間的區別。如果請求被阻止,響應會很快,所以差異會很小。我已經設置好了,如果差異小於1000毫秒,我將刪除iframe並在新窗口中打開URL。我認爲,除非網站真的很小,否則除非你有非常快速的網絡連接,否則大多數網站在1000毫秒內不會完全加載。

function LoadIFrame(url) { 
    // Create & display iframe 
    var iframe = '<iframe src="' + url + '" onload="load()"></iframe>'; 
    $('#iframeHolder').append(iframe); 

    // Time 
    var time = new Date().getTime(); 
    $('#iframeHolder').attr('data-time', time); 
} 

function load() { 
    var requestTime = $('#iframeHolder').attr('data-time'); 
    var loadTime = new Date().getTime(); 
    var difference = loadTime - requestTime; 
    if (difference < 1000) { 
     var url = $('#iframeHolder iframe').attr('src'); 
     window.open(url, '_blank'); 
     $('#iframeHolder').empty() 
    } 
} 

通常我不會發布這樣一個hacky修復,但這個問題已經有一段時間了,現在沒有答案。很顯然,這個解決方案並不是一個完美的解決方案,但它很適合我網站的需求。任何建議|將受到歡迎。