时的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