检测iframe内容是否加载成功

发布于 2024-10-09 15:29:21 字数 224 浏览 9 评论 0原文

我有一个包含 iframe 的小部件。用户可以配置此 iframe 的 url,但如果无法加载该 url(它不存在或用户无法访问互联网),则 iframe 应该故障转移到默认的离线页面。

问题是,如何检测iframe是否可以加载?我尝试订阅“load”事件,如果该事件在一段时间后没有触发,那么我会进行故障转移,但这仅适用于 Firefox,因为 IE 和 Chrome 会在“找不到页面”时触发“load”事件显示。

I have a widget that contains an iframe. The user can configure the url of this iframe, but if the url could not be loaded (it does not exists or the user does not have access to internet) then the iframe should failover to a default offline page.

The question is, how can I detect if the iframe could be loaded or not? I tried subscribing to the 'load' event, and, if this event is not fired after some time then I failover, but this only works in Firefox, since IE and Chrome fires the 'load' event when the "Page Not Found" is displayed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

白馒头 2024-10-16 15:29:21

我通过 Google 找到了以下链接: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>

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

I found the following link via Google: http://wordpressapi.com/2010/01/28/check-iframes-loaded-completely-browser/

Don't know if it solves the 'Page Not Found' issue.

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

I haven't tried it myself, so I don't know if it works. Good luck!

甚是思念 2024-10-16 15:29:21

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

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

Nowadays the browsers have a series of security limitations that keep you away from the content of an iframe (if it isn´t of your domain).

If you really need that functionality, you have to build a server page that have to work as a proxy, that receive the url as a parameter, test if it is a valid url, and does the redirect or display the error page.

喜你已久 2024-10-16 15:29:21

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

If you control the content of the iframe, the iframe can send a message to the parent.

        parent.postMessage('iframeIsDone', '*');

The parent callback listens for the message.

        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
            }
        });
念﹏祤嫣 2024-10-16 15:29:21

检查 url 是否可用,然后设置 iframe 的实际 url 怎么样?
例如使用 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。

How about checking if the url is available and only then setting the actual url of the iframe?
e.g. with 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;
         }
    }
});

Edit:
This does not seem to work cross domain, the status code is 0 in those cases.

半世蒼涼 2024-10-16 15:29:21

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

以下是示例代码: http://www.tek-tips.com /viewthread.cfm?qid=1114265&page=420

If you have control over the contents of the iframe (e.g. you can add arbitrary code to the page), you can try to implement a special function in each of them, then in your page, you call that function and catch an error (via window.onerror handler) if the function called via eval fails because the page didn't load.

Here's example code: http://www.tek-tips.com/viewthread.cfm?qid=1114265&page=420

笑忘罢 2024-10-16 15:29:21

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

有关详细信息,请查看此处 http://roneiv.wordpress.com/2008/01/18/get-the-content-of-an-iframe-in-javascript-crossbrowser -适用于 ie 和 firefox 的解决方案/

After the onload fires, you can scavenge the content of the iframe to see if it contains a usefull page or not. You'd have to make this browser specifuc unfortunately because they all display a different "page not found" message.

For more info, take a look here at http://roneiv.wordpress.com/2008/01/18/get-the-content-of-an-iframe-in-javascript-crossbrowser-solution-for-both-ie-and-firefox/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文