【问题标题】:Detect iFrame embedding in Javascript检测 Javascript 中的 iFrame 嵌入
【发布时间】:2010-10-29 19:55:07
【问题描述】:

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

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

【问题讨论】:

标签: javascript iframe greasemonkey


【解决方案1】:

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

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

【讨论】:

  • 你能解释一下吗?这是因为 a.parent 可以等于 a 吗?
  • 是的,正是如此 - .top 和 .parent 可以指向与 .self 相同的对象(事实上,测试 window.self != window.top 可能会更清楚)
  • 这在 Firefox 扩展中对我不起作用,但我找到了不同的解决方案:stackoverflow.com/questions/326069#7769187
  • 我确认,要覆盖 IE8,您必须使用 window.parent.frames.length
【解决方案2】:

谓词

(window.parent.frames.length > 0)

会告诉你你想要什么。

【讨论】:

  • 只是不要忘记在 ;0) 之后执行它
  • 如果您在运行此检查的页面上嵌套另一个 iframe,这种方法会给您带来误报。
  • 这不是那么简单。如果您的页面包含 iframe,则 window.parent == window 所以它会给出误报。
【解决方案3】:

【讨论】:

    【解决方案4】:

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

    相反,我可以通过 var isInIFrame = top.location != self.location 实现这一点 - 它适用于 IE8,只要您不尝试读取 top.location 的内容,它就不会导致跨域冲突。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 此元素在 Safari 或 Opera 中不可用。鉴于如今在 iPad 上上网的人数众多,这可能不是一个合适的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 2016-12-13
      • 2012-07-04
      • 2017-08-08
      • 1970-01-01
      相关资源
      最近更新 更多