時的iframe的內容使用負載事件已加載我可以檢測的內容。不幸的是,對我而言,這有兩個問題:檢測失敗加載的iframe
- 如果加載頁面時出現錯誤(404/500等),則永不會觸發加載事件。
- 如果某些圖片或其他依賴未能加載,加載事件被激發如常。
有什麼方法可以可靠地確定上述任何一種錯誤是否發生?
我寫基於Mozilla/XULRunner的一個半網半桌面應用程序,這樣的解決方案,只能在Mozilla的工作是值得歡迎的。
時的iframe的內容使用負載事件已加載我可以檢測的內容。不幸的是,對我而言,這有兩個問題:檢測失敗加載的iframe
有什麼方法可以可靠地確定上述任何一種錯誤是否發生?
我寫基於Mozilla/XULRunner的一個半網半桌面應用程序,這樣的解決方案,只能在Mozilla的工作是值得歡迎的。
如果你有過的iframe頁面控件(與網頁上相同的域名),一種策略可能如下:
var iFrameLoaded = false;
true
,例如從iframe文檔調用父代函數(setIFrameLoaded();
)。timer
對象檢查iFrameLoaded
標誌(將計時器設置爲您的首選超時限制) - 如果標誌仍然爲false,則可以判斷iframe未定期加載。我希望這有助於。
最近我有這個問題,不得不求助於建立在父頁一個Javascript輪詢動作(包含IFRAME標籤)。這個JavaScript函數檢查IFRAME的內容,以找出只存在於GOOD響應中的顯式元素。這當然假定你不必處理違反「同源的政策」。
不是檢查可能來自許多不同的網絡資源..我只是檢查了一個恆定的正元素(S),我知道應該是一個很好的響應可以生成所有可能出現的錯誤。
經過預定時間和/或失敗嘗試檢測預期元素後,JavaScript修改IFRAME的SRC屬性(從我的Servlet請求)用戶友好錯誤頁面,而不是顯示典型的HTTP錯誤消息。 JavaScript也可以很容易地修改SRC屬性來完成一個完全不同的請求。
function checkForContents(){
var contents=document.getElementById('myiframe').contentWindow.document
if(contents){
alert('found contents of myiframe:' + contents);
if(contents.documentElement){
if(contents.documentElement.innerHTML){
alert("Found contents: " +contents.documentElement.innerHTML);
if(contents.documentElement.innerHTML.indexOf("FIND_ME") > -1){
openMediumWindow("woot.html", "mypopup");
}
}
}
}
}
我認爲pageshow事件是錯誤頁被解僱。或者,如果您是通過chrome進行此操作,那麼請檢查進度監聽器的請求,以查看它是否是HTTP通道,以便在這種情況下可以檢索狀態代碼。
至於頁面依存關係,我想你只能通過增加捕獲onerror事件偵聽器,這樣做從鉻,即使如此,它纔會發現的元素,而不是CSS背景或其他圖像中的誤差。
有最上面的(身體),在頁面中的iframe的加載元素的ID。
你的iframe的加載處理程序,檢查,看看是否的getElementById()返回一個非空值。 如果是,iframe已成功加載。否則它失敗了。
在這種情況下,把frame.src = 「有關:空白」。這樣做之前一定要取下裝卸車。
不回答你的問題完全是,但我尋找一個答案把我帶到這裏,讓我張貼,以防其他人有類似的查詢我。
它並不完全使用負載事件,但它可以檢測網站是否可以訪問和調用(如果是,那麼iFrame的,從理論上講,應該加載)。
起初,我還以爲做一個AJAX調用其他人一樣,不同的是它沒有爲我工作一開始,因爲我已經使用jQuery的。它完美,如果你做一個XMLHttpRequest:
var url = http://url_to_test.com/
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status != 200) {
console.log("iframe failed to load");
}
};
xhttp.open("GET", url, true);
xhttp.send();
編輯:
所以這種方法效果好,但它有很多的假陰性(拿起了很多的東西,會在iframe顯示)由於交叉來源malarky。我身邊有這樣的方法是做一個服務器上的捲曲/ Web請求,然後檢查響應頭的),如果網站存在,和b)如果頭已成立x-frame-options
。
這不是一個問題,如果你運行自己的網絡服務器,因爲你可以使自己的API調用它。
我在node.js中實現:
app.get('/iframetest',function(req,res){ //Call using /iframetest?url=url - needs to be stripped of http:// or https://
var url = req.query.url;
var request = require('https').request({host: url}, function(response){ //This does an https request - require('http') if you want to do a http request
var headers = response.headers;
if (typeof headers["x-frame-options"] != 'undefined') {
res.send(false); //Headers don't allow iframe
} else {
res.send(true); //Headers don't disallow iframe
}
});
request.on('error',function(e){
res.send(false); //website unavailable
});
request.end();
});
1)爲什麼還要添加JavaScript來的iframe頁面?我可以像使用setTimeout一樣輕鬆地使用load事件。 2)這不能可靠地檢測出負載是否失效或者爲什麼,只是它是否在時間限制內成功。 3)不檢測加載頁面依賴性失敗的情況。 – 2008-12-17 20:17:06
不同的資源會在不同的時間範圍內加載。這種不可預測性會殺死你的方法Daniel Cassidy,因爲你必須允許合理的超時。與此同時,短暫的加載錯誤只會掛在屏幕上,直到計時器假定資源加載失敗並處理錯誤。 – seebiscuit 2015-10-23 14:46:50