如何检查iframe是否加载失败? jQuery的?

时间:2010-09-05 12:37:57

标签: jquery iframe load

我现在有这个jquery代码,它工作正常。当用户单击提交按钮时它会执行什么操作,它会隐藏表单,显示加载程序,然后将数据提交到链接并在iframe中加载输出。

$(document).ready(function() {

$("#xxx_form").validate({
    submitHandler: function() {
        $('#input_form').hide('slow');
        $('#loader').show('slow');
        form.submit();
    }
});

$("#xxx_frame").load(function (){
    $('#loader').hide('slow');
    $('#history').show('slow');
    $('#xxx_frame').show('slow');
});

});

这很好用。我需要的是如何检查iframe加载是否正常。在我测试期间,他们是iframe超时或发出无法连接到服务器的错误的时间。由于ISP故障。现在我需要检查这种错误,我该怎么做?

3 个答案:

答案 0 :(得分:1)

据我所知,没有办法在iframe中测试错误。有.error()事件,但根据文档中的评论:

  

在iframe上使用.error()似乎永远不会触发(即使.load()会在成功加载iframe时触发)。

也许您需要使用.load()事件自行实现某种超时:如果加载事件(表示成功)未在例如5秒内触发,则表示出错。

答案 1 :(得分:0)

...试

HTML:

<iframe id="box" ...

JQUERY:

$('#box').bind('error', function () {
   alert("loaded error");
}

编辑:存在更多命令绑定加载错误

答案 2 :(得分:0)

派对迟到了,但是我设法破解了它:它没有检测到iFrame是否正确加载,但它会检测服务器是否可访问。为了您的使用,您可以翻转逻辑,并在服务器加载成功后隐藏一些东西。

起初,我想做一个AJAX调用来测试网站a)是否存在以及b)允许跨域调用,除了它最初对我没有用,因为我使用了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();

修改
因此,这种方法可以正常工作,除非它有很多假阴性(由于交叉原始的malarky而拾取了很多会在iframe中显示的东西)。我解决这个问题的方法是在服务器上执行CURL / Web请求,然后检查响应标头a)如果网站存在,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();
});