关于javascript:如何识别网页是在iframe中加载还是直接加载到浏览器窗口?

How to identify if a webpage is being loaded inside an iframe or directly into the browser window?

我正在写一个基于iFrame的Facebook应用程序。现在我想使用相同的HTML页面来呈现普通的网站以及Facebook中的画布页面。我想知道我是否可以确定页面是在iframe中加载的,还是直接在浏览器中加载的?


由于相同的源站策略,浏览器可以阻止对window.top的访问。也会发生IE错误。这是工作代码:

1
2
3
4
5
6
7
function inIframe () {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

topself都是window对象(与parent一起),所以你可以看到你的窗口是否是顶部窗口。


当在与父级相同的iframe中,window.frameElement方法返回嵌入窗口的元素(例如iframeobject。否则,如果在顶级上下文中浏览,或者父框架和子框架具有不同的起源,它将对null进行评估。

1
2
3
window.frameElement
  ? 'embedded in iframe or object'
  : 'not embedded or cross-origin'

这是一个HTML标准,在所有现代浏览器中都有基本支持。