在Javascript中进行isInIframe检测

时间:2012-03-27 11:10:51

标签: javascript html

使用Javascript:

inFrame = true;
try {
   if(window.top == self) {
       inFrame = false;
   }
} catch (err){}

try {
   if(window.parent.location == self.location){
        inFrame = false;    
   }
} catch (err){}

这是我用来检测我的库是否在iframe中的javascript代码。 100%的请求中有1个报告我的库位于iframe中,我认为这是不可能的。

这段代码是否有可能失败[报告为假,反之亦然]?

从访问日志[我记录每个这样的iframe请求]

  1. 我发现它发生在用户代理字符串的所有现代浏览器中[即6-9,chrome,ff,safari]。
  2. 我无法理解推荐者,因为它们与我的发布商网站相同。
  3. 在某些情况下,我找到了相同的推荐人,同一网址请求&同一个客户端我的库曾经在iframe&不在其他地方。这让我怀疑上面的代码。
  4. 在我用来检查的属性[window]中加载documentself, location, top, parent时是否会有任何差异?因为我的脚本主要在文档准备好或窗口完全加载之前同步加载和执行,并且iniframe测试继续进行。

3 个答案:

答案 0 :(得分:1)

这就是我得到帧内结果的方式,它适用于我inFrame = window.top != window

答案 1 :(得分:0)

您知道大多数现代浏览器都允许您“查看框架”吗?在中,查看没有父级的帧内容。对于3来说,这是一个完全合理的答案。(我一直这样做。)

1和2的合理原因是self在javascript中没有真正定义,因此可能并不总是等于window。因此,您应该检查window或更好window.self而不是selfÖzgür建议。

答案 2 :(得分:0)

如果您要做的就是检测代码何时处于任何类型的框架中,您只需要:

if (window.top !== window) {
    // you are embedded in a frame
}

或设置变量inFrame,如下所示:

inFrame = (window.top !== window);

或以函数形式:

function isInFrame() {
    return (window.top !== window);
}

只要您不访问window.top对象上的属性,就不需要异常处理程序来保护跨域父项。在跨域来源的情况下,您可以访问window.top,但无法访问window.top.location.href等属性。

至于你的其他问题:

  

这段代码是否有可能失败[报告为假,反之亦然]?

虽然不需要异常处理程序,但代码的第一部分看起来还不错。当窗口和父框架的来源不同时,代码的第二部分每次都会在现代浏览器中抛出异常。

  

加载窗口或文档时是否会有任何差异   在我用来检查的属性[自我,位置,顶部,父]?   因为我的脚本主要在之前同步加载和执行   文档已准备好或窗口已完全加载,并且完成了   iniframe测试继续进行。

在您的窗口加载时,可以安全地进行此检查。 windowwindow.top在此时都有效,即使两者都尚未完成加载。因此,inFrame检测不应该有任何问题需要您等待任何事情来完成加载。