Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测iframe内容是否已成功加载_Javascript_Dom Events_Cross Domain - Fatal编程技术网

Javascript 检测iframe内容是否已成功加载

Javascript 检测iframe内容是否已成功加载,javascript,dom-events,cross-domain,Javascript,Dom Events,Cross Domain,我有一个包含iframe的小部件。用户可以配置此iframe的url,但如果无法加载该url(该url不存在或用户无权访问internet),则iframe应故障切换到默认的脱机页面 问题是,如何检测iframe是否可以加载?我尝试订阅“加载”事件,如果该事件在一段时间后未触发,则我会进行故障切换,但这仅在Firefox中有效,因为IE和Chrome在显示“未找到页面”时会触发“加载”事件。如果您可以控制iframe的内容(例如,您可以向页面添加任意代码),您可以尝试在它们中的每一个中实现一个特

我有一个包含iframe的小部件。用户可以配置此iframe的url,但如果无法加载该url(该url不存在或用户无权访问internet),则iframe应故障切换到默认的脱机页面


问题是,如何检测iframe是否可以加载?我尝试订阅“加载”事件,如果该事件在一段时间后未触发,则我会进行故障切换,但这仅在Firefox中有效,因为IE和Chrome在显示“未找到页面”时会触发“加载”事件。

如果您可以控制iframe的内容(例如,您可以向页面添加任意代码),您可以尝试在它们中的每一个中实现一个特殊函数,然后在页面中调用该函数,如果通过eval调用的函数由于页面未加载而失败,则会捕获错误(通过
window.onerror
handler)


下面是示例代码:

在onload激发之后,您可以清除iframe的内容,查看它是否包含有用的页面。不幸的是,您必须指定此浏览器,因为它们都显示不同的“未找到页面”消息


有关更多信息,请查看这里的

我通过谷歌找到了以下链接:

不知道它是否解决了“未找到页面”问题

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

var iframe=document.createElement(“iframe”);
iframe.src=”http://www.your_iframe.com/";
if(navigator.userAgent.indexOf(“MSIE”)>-1&&!window.opera){
iframe.onreadystatechange=函数(){
如果(iframe.readyState==“完成”){
警报(“Iframe现在已加载”);
}
};
}否则{
iframe.onload=函数(){
警报(“Iframe现在已加载”);
};
}

我自己没有试过,所以我不知道它是否有效。祝你好运

如今,浏览器有一系列安全限制,使您远离iframe的内容(如果它不属于您的域)


如果您真的需要该功能,您必须构建一个服务器页面,该页面必须作为代理,接收url作为参数,测试它是否是有效的url,并重定向或显示错误页面。

检查url是否可用,然后才设置iframe的实际url如何? e、 g.使用JQuery

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;
         }
    }
});
编辑:
这似乎不适用于跨域,在这些情况下,状态代码为0。

如果您控制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
            }
        });

既然他贴上了“跨域”的标签,我想他无法控制双方。是的,我无法控制内容。这个想法是用户可以用他想要的任何url来配置iframe的src。eval是邪恶的。伊夫拉梅和伊瓦尔是恶魔。这与onload事件非常相似,(iframe.readyState==“complete”)条件为true,即使加载的页面是IE错误页面。因此,它会让我知道页面何时加载,但不会告诉我是否成功加载。无论如何谢谢你!非常感谢。我花了两个小时寻找一个有效的解决方案。最后!:)在Chrome中不起作用:iframe不是XMLHttpRequests!,不,这不行。最好的答案!在chrome上运行良好。是的,你是对的,它不会让你访问跨域内容。嘿,skinssay,你找到没有使用代理的解决方案了吗?不,我没有。我做了一个更深入的研究,我认为这是不可能的:(根据OneRor属性是由webkit支持的,但我没有任何运气使它工作。是吗?截至Chrome 35,至少OneRor不受iframe支持。