2008-12-17 161 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(); 
});