Javascript 检查JS是否可以访问iframe';s文件

Javascript 检查JS是否可以访问iframe';s文件,javascript,jquery,iframe,same-origin-policy,Javascript,Jquery,Iframe,Same Origin Policy,是否有任何标准方法可以知道我的脚本是否可以访问iframe的文档 我在网络上找不到任何东西,因此我提出了以下建议: 函数checkifr(){ 函数errHandler(){ 警报('错误。请稍后再试'); } var ifr=$('#ifr')[0];//iframe DOM元素 试一试{ var d=ifr.contentWindow | | ifr.contentDocument; 如果(!d){ errHandler(); 返回false; } var b=$('#ifr').conte

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

我在网络上找不到任何东西,因此我提出了以下建议:

函数checkifr(){
函数errHandler(){
警报('错误。请稍后再试');
}
var ifr=$('#ifr')[0];//iframe DOM元素
试一试{
var d=ifr.contentWindow | | ifr.contentDocument;
如果(!d){
errHandler();
返回false;
}
var b=$('#ifr').contents().find('body');
//…操纵iframe内容
}捕获(e){
errHandler();
}
}
当我试图访问
iframe
的内容时,Firefox会抛出一个错误,并最终进入
catch
块。Chrome在控制台中显示一个
不安全的JavaScript试图访问帧
警告,但从未进入
捕获
块,对于这些尝试,它似乎返回
null
,因此初始的
if(!d)
会处理它。Opera和IE的行为与FF相似编辑:使用上面的代码,现在Chrome返回一个“空”窗口对象(没有属性),它不会触发my
if
块。检查的答案很好地跨浏览器工作

这是我的建议

我无法根据
窗口位置测试
iframe
src


合理化背景:这是因为该功能是我正在开发的一个小型图像上传插件的一部分(使用
iframe
作为目标,因为IE这里有一个想法,无论访问是否引发异常,它都会起作用:

function checkFrameAccess(ifr) {
    try {
        var doc = ifr.contentDocument || ifr.contentWindow.document;
        var origClass = doc.body.className;
        var newClass = origClass += " xxxxx";
        doc.body.className = newClass;
        var valid = doc.body.className == newClass;
        doc.body.className = origClass;
        return(valid);
    } catch(e) {
        return(false);
    }
}

如果他们抛出异常,您将进入异常处理程序并返回
false
。如果他们不抛出异常,您将测试您是否可以在框架中实际修改body标记的类名。如果修改有效,那么您显然可以修改它。如果不能,那么它将不允许您访问它。

另一种选择是,如果不尝试捕捉,就无法真正做到这一点

测验


.documentWindow
?哪个浏览器实现了这个功能?哦,是的,它应该是
。contentWindow
很确定我是从SO中的另一个答案中选择的,但是很好的发现!
documentWindow
在我测试过的所有浏览器中返回未定义的内容。我会寻找答案来检查这是否是一个打字错误。是的,这是我的一个打字错误,谢谢@ŠimeVidas和Esa!我明白了,试图在iframe的
内容窗口
中设置一个var看起来比我的代码干净得多,而且很容易添加到抽象级别。+1秒,而我阅读其他答案并测试它们。
=]
@fabriciomatté如果
也是冗余的,因为它会在
全局[key]上抛出一个错误
如果它是
null
undefined
Yup,则设置一个名为的窗口属性,该属性使用与
Math.random()连接的毫秒时间戳
似乎有点过火,但毫无疑问,这是代码实用性的一个标志!-1不够jQuery。说真的,现在你的答案是清晰易懂的。+1感谢在Esailija之前回答。
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;
    }
}