在Javascript中检测iFrame嵌入

59
我有一个应用程序,其中有一个特定的页面--让我们称之为"A页面"。 A页面有时是顶级页面,但也有时嵌入到页面B的iframe中。所有页面都来自同一服务器,没有跨域问题。
我有一个运行在A页面上的Greasemonkey脚本。如何使Greasemonkey脚本检测出A页面是否处于iframe上下文中?

你可以查找父级框架并查看它们是否存在吗? - 76mel
5个回答

134

如果页面A本身有框架(我知道这在特定情况下可能不是这样),仅查看框架长度通常会失效。更可靠和有意义的测试方法是:

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

你能解释一下吗?这是因为a.parent可能等于a吗? - Cheekysoft
6
是的,确切地说 - .top 和 .parent 可以指向与 .self 相同的对象(事实上,测试 window.self != window.top 可能会更清晰明了)。 - annakata
这在Firefox扩展中对我不起作用,但我找到了另一种解决方案:https://dev59.com/yXRC5IYBdhLWcg3wVvnL - magnoz
我确认,为了覆盖IE8,您必须使用window.parent.frames.length。 - Marek Kowalski

12

谓词

(window.parent.frames.length > 0)

该函数将告诉您所需的内容。


1
别忘了在分号之后执行它 ;0) - Artem Barger
3
如果您在运行此检查的页面嵌套另一个iframe,这种方法会给出错误的阳性结果。 - Marek Kowalski
1
这并不简单。如果您的页面包含iframes,则window.parent == window,因此会产生误报。 - zsitro

6

4

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

相反,我能够通过 var isInIFrame = top.location != self.location 实现这个目标 - 它可以在IE8中工作,并且只要您不尝试读取top.location的内容,它就不会引起跨域违规。


0

使用 window.frameElement 并检查它是否不为 null,以及它的 nodeName 是否为 "IFRAME"。


1
这个元素在Safari或Opera中不可用。考虑到现在有很多人使用iPad上网冲浪,这可能不是一个合适的解决方案。 - Ash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接