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

Jak*_*eck 1 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)
Run Code Online (Sandbox Code Playgroud)

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

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

Guf*_*ffa 6

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

function getTopIframe(win) {
  try {
    return getTopIframe(win.parent);
  } catch(e) {
    return win;
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

function getTopIframe(win) {
  try {
    if (win.parent != win) {
      return getTopIframe(win.parent);
    }
  } catch(e) {
  }
  return win;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是对的.如果父窗口对象位于不同的域中,则可以访问它; 你无法访问它的任何属性.因此,这将返回您域中最顶层iframe的PARENT.如果你想要iframe本身,你应该使用`if(win.parent!= win && win.parent.document){` (3认同)