检测加载iframe内容的失败

我可以使用load事件来检测iframe的内容何时加载。 不幸的是,为了我的目的,这有两个问题:

  • 如果加载页面时出现错误(404/500等),加载事件永远不会被触发。
  • 如果某些图像或其他依赖项加载失败,则像往常一样激发加载事件。

有什么方法可以可靠地确定上述错误是否发生?

我正在编写基于Mozilla / XULRunner的半networking半桌面应用程序,因此只能在Mozilla中运行的解决scheme是受欢迎的。

如果您可以控制iframe页面(并且页面位于相同的域名),则策略可以如下所示:

  • 在父文档中,初始化一个variablesvar iFrameLoaded = false;
  • 当加载iframe文档时,将父variables设置为true从iframe文档调用父函数(setIFrameLoaded();例如(setIFrameLoaded(); )。
  • 使用timer对象检查iFrameLoaded标志(将定时器设置为您的首选超时限制) – 如果标志仍然为false,则可以告知iframe未定期加载。

我希望这有帮助。

我最近有这个问题,不得不诉诸在父页面(包含IFRAME标签)设置一个Javascript轮询行动。 这个JavaScript函数检查IFRAME的内容,显示只存在于GOOD响应中的显式元素。 这当然假设你不必处理违反“同源的政策”。

而不是检查从许多不同的networking资源可能产生的所有可能的错误..我只是检查一个不断积极的元素(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的页面中,为最顶部的(body)元素设置一个id。

在iframe的Load处理程序上,检查getElementById()是否返回非空值。 如果是,iframe已成功加载。 否则失败。

在这种情况下,把frame.src =“about:blank”。 这样做之前一定要取下装卸车。

不完全回答你的问题,但我的search答案带来了我在这里,所以我发布,以防万一谁有类似的查询给我。

它不完全使用加载事件,但它可以检测网站是否可访问和可调用(如果是,则理论上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。 我解决这个问题的方法是在服务器上执行一个CURL / Web请求,然后检查响应头信息a)网站是否存在,以及b)头文件是否设置了x-frame-options

如果您运行自己的networking服务器,这不是问题,因为您可以自己创buildAPI调用。

我在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(); });