检查JS是否可以访问iframe的文档

Fab*_*tté 14 javascript iframe jquery same-origin-policy

有没有标准的方法来知道我的脚本是否可以访问iframe文档?

我在网上找不到任何东西所以我想出了这个:

function checkifr() {
    function errHandler() {
        alert('Error. Try again later.');
    }
    var ifr = $('#ifr')[0]; //the iframe DOM element

    try {
        var d = ifr.contentWindow || ifr.contentDocument;
        if (!d) {
            errHandler();
            return false;
        }

        var b = $('#ifr').contents().find('body');
        //... manipulate iframe content

    } catch(e) {
        errHandler();
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,当我尝试访问iframe内容并最终在catch块中时,Firefox会抛出错误.Chrome Unsafe JavaScript attempt to access frame在控制台中显示警告但从未进入catch阻止状态,它似乎会返回null这些尝试,因此初始if (!d)处理它.Opera和IE的行为类似于FF.编辑:使用上面的代码,现在Chrome返回一个"空"Window对象(没有属性),它不会触发我的if块.检查Esailija的答案,它可以很好地跨浏览器!

这是小提琴.

不能测试iframesrc反对window.location.

正当性背景:这是因为该功能是我正在开发(使用一个小的图像上载的插件的一部分iframe作为靶标,因为IE <9不支持XHR2),目标主要是验证连接错误/超时/等.这些错误的默认浏览器页面受同一起源警察的影响,因此这个问题的目的.我不想发送ajax调用来检查页面是否可用,因为我想验证提交请求本身.jQuery的.load处理程序不会触发错误,jQuery的.erroronerrorHTML属性不适用于此.此处提供了工作脚本的说明,但您可以完全忽略它并简单地回答下面的问题.

请注意,上面的块仅用于说明为什么我不能使用iframe.src.

我确实认为应该有一种更简单/标准的方法来检查iframe"可访问性",但我在网络上找不到任何东西,除了半解决方案,只是检查iframe.src并且不适用于许多情况.如果我的hackish try/ catchblock被认为是技术上"干净"的解决方案,那么如果找不到更好的选择,其他人可能会重新使用它.

那么,有没有标准或简单的方式或jQuery插件来检查我的脚本可以访问一个iframe"没有比较小号文件iframeS" srcwindow.location?如果可能,在控制台中没有try/ catchblocks和错误/警告.

Esa*_*ija 12

这是另一种选择,如果没有尝试捕获就无法真正做到.

测试http://jsfiddle.net/LHjwZ/11/

function checkIframe( ifr ) {
    var key = ( +new Date ) + "" + Math.random();

    try {
        var global = ifr.contentWindow;
        global[key] = "asd";
        return global[key] === "asd";
    }
    catch( e ) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)