使用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请求]
在我用来检查的属性[window
]中加载document
或self, location, top, parent
时是否会有任何差异?因为我的脚本主要在文档准备好或窗口完全加载之前同步加载和执行,并且iniframe测试继续进行。
答案 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测试继续进行。
在您的窗口加载时,可以安全地进行此检查。 window
和window.top
在此时都有效,即使两者都尚未完成加载。因此,inFrame检测不应该有任何问题需要您等待任何事情来完成加载。