如何访问父级';使用javascript从子对象的子对象创建控件?

如何访问父级';使用javascript从子对象的子对象创建控件?,javascript,parent-child,Javascript,Parent Child,我想从popoup的子级访问父窗口的控件,如: 从Window1,打开Window2 从窗口2,打开窗口3 从Window3,打开Window2 现在我需要从Window2访问Window1的控件,以防从Window3打开Window2时,我该如何操作 我试图使用window.opener.getElementById()和window.opener.opener.getElementById(),但我在这里感到困惑 编辑: window.open('window2'); 窗口1中打开窗口

我想从popoup的子级访问父窗口的控件,如:

  • Window1
    ,打开
    Window2
  • 窗口2
    ,打开
    窗口3
  • Window3
    ,打开
    Window2
现在我需要从Window2访问Window1的控件,以防从Window3打开Window2时,我该如何操作

我试图使用
window.opener.getElementById()
window.opener.opener.getElementById()
,但我在这里感到困惑

编辑:

window.open('window2');
窗口1中打开窗口2的代码

window.open('window2');
window.location.href = 'Window3';
窗口2中打开窗口3的代码:

window.open('window2');
window.location.href = 'Window3';
在Window3中编码以打开Window2:

window.open('window2');

您可以通过
窗口向后扫描。打开器
链:

function getBaseOpener(win){
  var opener;
  do {
    /// check to see if our storage property has been set, if so use it
    /// this gets around the problem that the window.opener chain may have
    /// been broken.
    if ( win.baseOpener ) {
      opener = win.baseOpener;
      break;
    }
    /// for each window.opener we find scan backwards until we find a 
    /// window that has no window.opener. This should be our main window.
  } while( (opener = win.opener) && (win = opener) );
  /// return the result and store it for next time, this will prevent
  /// problems if any of our openers are ever closed.
  return (win.baseOpener = opener);
}
只要在创建每个新打开的窗口之后(并且整个窗口链在该点上仍然处于活动状态),上面的操作将始终返回基本打开器

显然,如果基本窗口曾经关闭过,您就会遇到问题;)

更新 抱歉,我认为上面的内容很清楚,我想如果你处理过大量的windows之间的交互——但如果不是:)无论如何,我已经添加了注释来解释代码,并添加了用法信息以使事情更清楚

放置以下内容,以便将其加载到每个打开的窗口中

<script>
  function getBaseOpener(win){
    var opener;
    do {
      if ( win.baseOpener ) {
        opener = win.baseOpener;
        break;
      }
    } while( (opener = win.opener) && (win = opener) );
    return (win.baseOpener = opener);
  }
  /// this first execution is important, it creates the baseOpener
  /// property that will keep our link to the main window even
  /// if our parents have been closed and reopened later on.
  var mainWindow = getBaseOpener(window);
</script>
或者再次运行getBaseOpener:

getBaseOpener(window)
这应该总是返回基本/主窗口(窗口1)-除非从基本窗口本身执行。。。在那里它将返回未定义的

如果希望使用
getElementById
,则需要如下方式访问文档:

mainWindow.document.getElementById('element_id');

由于再次使用窗口,原始的打开程序值将丢失

必须使用window.name来标识窗口

window3 > window.open(url, "window2",.....);
window1 > window.open(url, "window2",.....);
您可以使用命名/重命名窗口

window.name = "window3";
你也可以用这个

function getOpenerWindowByName(name)
{
     var w = window;
     while(w = w.opener) if(w.name === name) return w;
     return null;
}

您可以发布您正在使用的实际代码吗?当从Window2打开Window3时,如何从Window3打开Window2?你的意思是,某个东西可能会关闭Window2,然后用另一个父对象重新打开它吗?网站根本不应该打开windows。这是错误的UX。-1此方法无法满足OP的要求。首先,您没有提到OP将如何引用窗口(只提到如何打开窗口)。其次,考虑到原始窗口没有名称,这对原始窗口(OP要求的窗口)不起作用。第三,不必使用名称来标识窗口,JavaScript有这些方便的东西,称为变量和属性,可用于存储引用或值,否则可能会丢失。是的,但名称是引用已打开窗口的唯一方法,如果这些窗口改变了位置,但这不是OP要求的。他们要求只引用其他窗口中的主窗口<代码>窗口1。。。这完全可以不用名字。通过存储在使用
窗口时创建的返回的
窗口对象
,也可以很容易地引用打开的没有名称的窗口。打开
——您只需将这些对象存储起来,以便以后在某种查找对象中使用。然后,您只需检查每个对象上的
窗口。closed
布尔值,查看窗口是否/何时关闭。我尝试过,但它显示我正在使用的baseOpener是“未定义的”IE9@YaqubAhmad您如何使用上述功能?因为它根本不应该返回那种错误。。。因为代码在使用之前正在检查其属性是否存在。您将无法直接使用
window.baseOpener
,如果您是这样尝试的,因为它不是本机属性。非常感谢您提供完整的解决方案,我的第一选择是遵循此解决方案,让我再试一次。win.baseOpener=有些东西不适合我。我像window.open(…).baseOpener=window一样直接尝试了它。但我可以访问它,并且它在IE9中始终保持
未定义。