2008-12-17 114 views
50

時的iframe的內容使用負載事件已加載我可以檢測的內容。不幸的是,對我而言,這有兩個問題:檢測失敗加載的iframe

  • 如果加載頁面時出現錯誤(404/500等),則永不會觸發加載事件。
  • 如果某些圖片或其他依賴未能加載,加載事件被激發如常。

有什麼方法可以可靠地確定上述任何一種錯誤是否發生?

我寫基於Mozilla/XULRunner的一個半網半桌面應用程序,這樣的解決方案,只能在Mozilla的工作是值得歡迎的。

回答

14

如果你有過的iframe頁面控件(與網頁上相同的域名),一種策略可能如下:

  • 在父文件,初始化變量var iFrameLoaded = false;
  • 當加載iframe文檔,在父代中將此變量設置爲true,例如從iframe文檔調用父代函數(setIFrameLoaded();)。
  • 使用timer對象檢查iFrameLoaded標誌(將計時器設置爲您的首選超時限制) - 如果標誌仍然爲false,則可以判斷iframe未定期加載。

我希望這有助於。

+5

1)爲什麼還要添加JavaScript來的iframe頁面?我可以像使用setTimeout一樣輕鬆地使用load事件。 2)這不能可靠地檢測出負載是否失效或者爲什麼,只是它是否在時間限制內成功。 3)不檢測加載頁面依賴性失敗的情況。 – 2008-12-17 20:17:06

+0

不同的資源會在不同的時間範圍內加載。這種不可預測性會殺死你的方法Daniel Cassidy,因爲你必須允許合理的超時。與此同時,短暫的加載錯誤只會掛在屏幕上,直到計時器假定資源加載失敗並處理錯誤。 – seebiscuit 2015-10-23 14:46:50

8

最近我有這個問題,不得不求助於建立在父頁一個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"); 
      } 
     } 
    } 
} 

}

1

我認爲pageshow事件是錯誤頁被解僱。或者,如果您是通過chrome進行此操作,那麼請檢查進度監聽器的請求,以查看它是否是HTTP通道,以便在這種情況下可以檢索狀態代碼。

至於頁面依存關係,我想你只能通過增加捕獲onerror事件偵聽器,這樣做從鉻,即使如此,它纔會發現的元素,而不是CSS背景或其他圖像中的誤差。

0

有最上面的(身體),在頁面中的iframe的加載元素的ID。

你的iframe的加載處理程序,檢查,看看是否的getElementById()返回一個非空值。 如果是,iframe已成功加載。否則它失敗了。

在這種情況下,把frame.src = 「有關:空白」。這樣做之前一定要取下裝卸車。

0

不回答你的問題完全是,但我尋找一個答案把我帶到這裏,讓我張貼,以防其他人有類似的查詢我。

它並不完全使用負載事件,但它可以檢測網站是否可以訪問和調用(如果是,那麼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(); 
});