JavaScript 检测父框架是不是同源?

Posted

技术标签:

【中文标题】JavaScript 检测父框架是不是同源?【英文标题】:JavaScript to detect if the parent frame is of the same origin?JavaScript 检测父框架是否同源? 【发布时间】:2011-02-04 07:19:01 【问题描述】:

我正在寻找一种跨浏览器的方法来检测父框架是否与我的框架同源,最好不要在 javascript 错误控制台上打印警告。

以下似乎可行,但我想避免将错误打印到控制台(至少 Safari 和 Chrome 在访问父框架上的 location.href 时会这样做。Firefox 抛出一个可以被捕获的异常):

function parentIsSameOrigin() 
    var result = true;
    try 
        result = window.parent.location.href !== undefined;
     catch (e) 
        result = false;
    
    return result;

【问题讨论】:

【参考方案1】:

我会这样做:

var sameOrigin;
try

    sameOrigin = window.parent.location.host == window.location.host;

catch (e)

    sameOrigin = false;

return sameOrigin;

【讨论】:

谢谢 - 这真的让我很生气! 遗憾的是,我花了几个小时在这个解决方案上,却发现这不适用于同源错误无法解决的 WebKit。不要使用此解决方案。 @Spork,我使用最近的 Chrome (43) 没有这个问题。请问这个问题出现在哪个浏览器/版本上?【参考方案2】:

我使用这种方法来判断 iframe 是否包含本地内容,

但你也可以从 iframe 传递 window.top

function islocal(win)
var H=location.href,
    local= H.substring(0, H.indexOf(location.pathname));
    try
        win=win.document;
        return win && win.URL && win.URL.indexOf(local)== 0;
    
    catch(er)
        return false
    

//测试用例alert(islocal(window.top))

【讨论】:

这不是跨浏览器,因为window.URL support varies greatly 唯一不支持 window.URL 的浏览器已报废。所以除非你是 JQuery....【参考方案3】:

试试这个:

function parentIsSameOrigin()

    var result = true;
    if (window.parent)
    
        result = Boolean
        (
            // more precise modifications needed here
            window.this.location.href.indexOf(window.parent.location.href) == 0
        );
    
    return result;

【讨论】:

那里似乎有一个额外的“this”,但即使我删除它,我也会收到警告。只需访问window.parent.location.href 即可触发它。 这仍然会给出同源异常。

以上是关于JavaScript 检测父框架是不是同源?的主要内容,如果未能解决你的问题,请参考以下文章

高级篇javascript静态页面传值的三种方法 url方法,取值方便,可跨域; cookie方法,同源访问; window.open方法,指向父窗口

高级篇javascript静态页面传值的三种方法 url方法,取值方便,可跨域; cookie方法,同源访问; window.open方法,指向父窗口

JSONP跨域

在 Javascript 中捕获同源异常?

iFrame javascript 影响父 DOM

win下如何解决在chrome的同源访问问题