我有一个包含iframe的小部件。用户可以配置此iframe的URL,但如果URL无法加载(不存在或用户无法访问互联网),则iframe应该故障转移至默认的离线页面。
问题是,如何检测是否能够加载iframe?我尝试订阅“load”事件,如果在一定时间内没有触发此事件,则进行故障转移,但这仅适用于Firefox,因为IE和Chrome在显示“页面未找到”时会触发“load”事件。
我有一个包含iframe的小部件。用户可以配置此iframe的URL,但如果URL无法加载(不存在或用户无法访问互联网),则iframe应该故障转移至默认的离线页面。
问题是,如何检测是否能够加载iframe?我尝试订阅“load”事件,如果在一定时间内没有触发此事件,则进行故障转移,但这仅适用于Firefox,因为IE和Chrome在显示“页面未找到”时会触发“load”事件。
我通过谷歌找到了下面的链接:http://wordpressapi.com/2010/01/28/check-iframes-loaded-completely-browser/
不确定它是否解决了“页面未找到”的问题。
<script type="javascript">
var iframe = document.createElement("iframe");
iframe.src = "http://www.your_iframe.com/";
if (navigator.userAgent.indexOf("MSIE") > -1 && !window.opera) {
iframe.onreadystatechange = function(){
if (iframe.readyState == "complete"){
alert("Iframe is now loaded.");
}
};
} else {
iframe.onload = function(){
alert("Iframe is now loaded.");
};
}
</script>
我自己没试过,所以不知道它是否有效。祝你好运!
如果您控制iframe的内容,那么该iframe可以向其父级发送消息。
parent.postMessage('iframeIsDone', '*');
var attachFuncEvent = "message";
var attachFunc = window.addEventListener ;
if (! window.addEventListener) {
attachFunc = window.attachEvent;
attachFuncEvent = "onmessage";
}
attachFunc(attachFuncEvent, function(event) {
if (event.data == 'iframeIsDone') { // iframe is done callback here
}
});
var url = "google.com"
var loading_url = "/empty.html"
document.getElementById("iframe").src = loading_url;
$.ajax({
url: url,
type: 'GET',
complete: function(e, xhr, settings){
if(e.status === 200){
document.getElementById("iframe").src = url;
}
}
});
如果您可以控制 iframe 的内容(例如,您可以向页面添加任意代码),则可以尝试在每个 iframe 中实现一个特殊函数,然后在您的页面中调用该函数,并通过 window.onerror
处理程序捕获错误(如果通过 eval 调用的函数失败,因为页面没有加载)。
以下是示例代码:http://www.tek-tips.com/viewthread.cfm?qid=1114265&page=420
在 onload 触发后,您可以清理 iframe 的内容,以查看它是否包含有用的页面。不幸的是,您必须针对不同的浏览器进行特定处理,因为它们都显示不同的“页面未找到”消息。