同一个域名中最顶层的iframe是什么?

时间:2010-05-21 19:09:26

标签: javascript iframe

如何获得同一域中最顶层的iframe,即

iframe level 1 example.org
    iframe level 2 example.org
    iframe level 2 example.org 
        iframe level 3 example.org <-- should return iframe level 1

iframe level 1 other-example.org
    iframe level 2 example.org
    iframe level 2 example.org 
        iframe level 3 example.org <-- should return iframe level 2

iframe level 1 other-example.org
    iframe level 2 example.org
    iframe level 2 example.org <-- should return iframe level 2 (this)

我需要它,因为我有一个网站应该在另一个域的iframe中工作并且独立。

在这个网站上有一些依赖于window.top的脚本,它不应该是顶层,而是同一域中最顶层的iframe。

2 个答案:

答案 0 :(得分:5)

如果您尝试访问父级而来自其他域,则会出现错误。您可以使用它来递归尝试访问父级,直到它失败,例如:

function getTopIframe(win) {
  try {
    return getTopIframe(win.parent);
  } catch(e) {
    return win;
  }
}

编辑:

最顶层的窗口是它自己的父窗口,因此如果顶部窗口位于同一个域中,您需要检查它以防止永久循环:

function getTopIframe(win) {
  try {
    if (win.parent != win) {
      return getTopIframe(win.parent);
    }
  } catch(e) {
  }
  return win;
}

答案 1 :(得分:1)

Guffa的答案在相反的情况下找不到最顶层的相同域窗口,其中来自不同域的窗口位于两个相同域窗口之间。要处理这种情况,我们需要始终遍历到最顶层的窗口,并分别跟踪来自同一域的窗口。

下面的实现还做了一些其他的好处:(a)它默认使用当前窗口,因此在最常见的情况下可以不带任何参数调用它们,(b)它消除了不必要的尾递归,有利于一个简单的while循环。

function topSameDomainWindow(win) {
  win = win || window;
  var top = win;
  while (win.parent != win) {
    try {
      // Will throw when the parent window is from a different domain
      win.parent.document;
      top = win;
    } catch (e) {}
    win = win.parent;
  }
  return top;
}