我正在写一个基于iframe的facebook应用程序。现在我想使用相同的html页面来渲染正常的网站以及facebook内的画布页面。我想知道我是否可以确定页面是否已经在iframe内加载或直接在浏览器中加载?


当前回答

如果你想知道用户是否通过facebook page tab或canvas访问你的应用,请检查Signed Request。如果你没有得到它,可能用户没有从facebook访问。 确保确认signed_request字段结构和字段内容。

使用php-sdk,你可以像这样获得Signed Request:

$signed_request = $facebook->getSignedRequest();

你可以在这里阅读更多关于签名请求的内容:

https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/

在这里:

https://developers.facebook.com/docs/reference/login/signed-request/

其他回答

我用这个:

var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1);

在每一页写这个javascript

if (self == top)
  { window.location = "Home.aspx"; }

然后它会自动重定向到主页。

由于您是在facebook应用程序的上下文中请求,您可能想要考虑在初始请求发出时在服务器上检测这一点。如果从iframe调用,Facebook将传递一堆查询字符串数据,包括fb_sig_user键。

因为你可能需要在你的应用程序中检查和使用这些数据,所以使用它来确定要渲染的适当上下文。

浏览器会阻塞对窗口的访问。顶部由于同源政策。IE漏洞也会发生。下面是工作代码:

function inIframe () {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

Top和self都是窗口对象(还有父窗口),所以你会看到你的窗口是否是顶部窗口。

我不确定这个例子如何适用于旧的Web浏览器,但我使用这个IE, Firefox和Chrome没有问题:

var iFrameDetection = (window === window.parent) ? false : true;