检测Javascript中的iFrame嵌入

检测Javascript中的iFrame嵌入,javascript,iframe,greasemonkey,Javascript,Iframe,Greasemonkey,我有一个应用程序,它有一个特定的页面——我们称之为页面a。页面a有时是顶级页面,但有时也作为iframe嵌入到页面B中。所有页面都来自同一个服务器,没有跨域问题 我有一个在a页上运行的greasemonkey脚本。greasemonkey脚本如何检测a页是否在iframe上下文中?谓词 (window.parent.frames.length > 0) 将告诉您想要的内容。如果页面A本身有帧,查看帧长度通常会出现故障(我知道对于这个特定实例可能不是这样)。更可靠和更有意义的测试是: if

我有一个应用程序,它有一个特定的页面——我们称之为页面a。页面a有时是顶级页面,但有时也作为iframe嵌入到页面B中。所有页面都来自同一个服务器,没有跨域问题

我有一个在a页上运行的greasemonkey脚本。greasemonkey脚本如何检测a页是否在iframe上下文中?

谓词

(window.parent.frames.length > 0)

将告诉您想要的内容。

如果页面A本身有帧,查看帧长度通常会出现故障(我知道对于这个特定实例可能不是这样)。更可靠和更有意义的测试是:

if (window!=window.top) { /* I'm in a frame! */ }

从使用
window.frameElement
并检查它是否为null以及它的节点名是否为“IFRAME”。

如上所述,接受的解决方案在IE8中不起作用。此外,检查
window.parent.frames.length
可能会导致跨域异常


相反,我能够通过
var isInIFrame=top.location!=self.location
-它在IE8中工作,只要您不尝试读取
top.location的内容,它就不会导致跨域冲突。location

只是不要忘了以后再做;0)如果在运行此检查的页面上嵌套另一个iframe,此方法会导致误报。这并不是那么简单。如果您的页面包含iframe,那么window.parent==window会给出假阳性。您能解释一下吗?这是因为a.parent可以等于a吗?是的,正是如此-.top和.parent可以指向与.self相同的对象(事实上,测试window.self!=window.top可能更清晰)这在Firefox扩展中对我不起作用,但我找到了一个不同的解决方案:我确认,要同时覆盖IE8,您必须使用window.parent.frames.lengthWould您只需查看父级框架并查看它们是否存在?Safari或Opera中没有此元素的可能副本。考虑到如今在iPad上冲浪的人数,这可能不是一个合适的解决方案。
if (top === self) { not in a frame } else { in a frame }