38

我的网页使用 iframe 从其他页面收集内容。所有页面都在同一个域中。

从主页,有没有办法确认所有 iframe 都已加载,并且没有 404 错误?

4

2 回答 2

21

状态仅存在于响应标头中。

404 页面正在处理一个HTTP 状态代码,它只包含在服务器发送到浏览器的响应中,而不包含在javascript 可能访问的 DOM的实际window和对象中。document这意味着虽然您当然可以收集状态码并采取适当的措施,但您只能在您的 javascript 接收响应时这样做,例如使用jQuery.ajax() 请求XmlHttRequest 来加载您的 "iframe"

希望 404 页面遵循 404 标准。

如果以上不是一个选项,则唯一的其他可能性可能是检查“404”的标题和/或 H 标签。虽然这肯定不太理想(我很想看到“404,找不到电影,电影。”),但这是您唯一的选择。

$('#iframe').load(function (e) {
    var iframe = $("#iframe")[0];

    if ( iframe.innerHTML() ) {
        // get and check the Title (and H tags if you want)
        var ifTitle = iframe.contentDocument.title;
        if ( ifTitle.indexOf("404")>=0 ) {
            // we have a winner! probably a 404 page!
        }
    } else {
        // didn't load
    }
});
于 2014-10-29T21:49:24.530 回答
19

假设这是你的 html

<html>
    <head></head>
    <body>
      <iframe id="iframe"></iframe>
    </body>
 </html>

有两种情况

  1. 您的 iframe 的 src 与您的页面所在的域相同。

    Ex : page url www.example.com and iframe's src www.example.com/iframe
    

    您可以使用 jQuery ajax 请求来检查资源是否可用

       $(function() {
            $.ajax({
                type : "HEAD",
                async : true,
                url : "www.example.com/iframe"
            })
            .success(function() {
                $("#iframe").attr("src", "www.example.com/iframe");
            })
            .error(function(){
               // Handle error perhaps a failover url
            })
        });
    
  2. 您的 iframe 的 src 未指向您的页面起源的同一个域。

    Ex : Page url www.example.com and iframe's src www.otherdomain.com/iframe
    

    由于跨源策略,现在浏览器将不允许您从 javascript 代码发出跨站点请求。解决方法是发出jsonp request

    $(function() {
        $.ajax({
            url: "www.otherdomain.com/iframe",
            dataType: "jsonp",
            timeout: 5000,
    
            success: function () {
                $("#iframe").attr("src", "www.otherdomain.com/iframe");
            },
            error: function (parsedjson) {
                if(parsedjson.status == "200") {
                    $("#iframe").attr("src", "www.otherdomain.com/iframe");
                } else {
                    // Handle error
                }
            }
        });
    });
    
于 2016-03-07T08:01:04.407 回答