检测嵌入在 Javascript 中的 iFrame

IT技术 javascript iframe greasemonkey
2021-01-19 19:40:25

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

我有一个在页面 A 上运行的油脂猴脚本。油脂猴脚本如何检测页面 A 是否在 iframe 上下文中?

5个回答

如果页面 A 本身有框架(我知道对于这个特定实例可能不是这种情况),查看框架长度通常会崩溃。更可靠和更有意义的测试是:

if (window!=window.top) { /* I'm in a frame! */ }
是的,正是如此 - .top 和 .parent 可以指向与 .self 相同的对象(实际上,测试 window.self != window.top 可能会更清楚)
2021-03-14 19:40:25
我确认,为了覆盖 IE8,你必须使用 window.parent.frames.length
2021-03-20 19:40:25
这在 Firefox 扩展中对我不起作用,但我找到了一个不同的解决方案:stackoverflow.com/questions/326069#7769187
2021-04-04 19:40:25
你可以解释吗?这是因为 a.parent 可以等于 a 吗?
2021-04-10 19:40:25

谓词

(window.parent.frames.length > 0)

会告诉你你想要什么。

这不是那么简单。如果您的页面包含 iframe,那么 window.parent == window 会导致误报。
2021-03-15 19:40:25
只是不要忘记在 ;0) 之后做
2021-04-07 19:40:25
如果您在运行此检查的页面上嵌套另一个 iframe,这种方法会给您误报。
2021-04-08 19:40:25
if (top === self) { not in a frame } else { in a frame }

如何识别网页是在 iframe 中加载还是直接加载到浏览器窗口中?

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

相反,我能够通过以下方式实现这一点var isInIFrame = top.location != self.location- 它可以在 IE8 中运行,并且只要您不尝试读取top.location.

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

此元素在 Safari 或 Opera 中不可用。鉴于如今在 iPad 上冲浪的人数众多,这可能不是一个合适的解决方案。
2021-03-30 19:40:25