繁体   English   中英

如何使用javascript从孩子的孩子访问父母的控件?

[英]How access parent's controls from child of child using javascript?

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

  • Window1打开Window2
  • Window2打开Window3
  • Window3打开Window2

现在,当从Window3打开Window2时,我需要从Window2访问Window1的控件,我该怎么办?

我试图使用window.opener.getElementById()window.opener.opener.getElementById()感到困惑!

编辑:

在Window1中打开Window2的代码

window.open('window2');

在Window2中打开Window3的代码

window.location.href = 'Window3';

在Window3中打开Windows2的代码:

window.open('window2');

在此处输入图片说明

由于您再次使用窗口, 因此原始的开启器值将丢失

您必须使用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;
}

您可以通过window.opener链向后扫描:

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>

然后,如果需要获取基本窗口,请在代码中的任何位置使用以下命令:

mainWindow

或再次运行getBaseOpener:

getBaseOpener(window)

这应该始终返回基本/主窗口(窗口1)-除非从基本窗口本身内执行...否则它将返回undefined

如果您随后希望使用getElementById ,则需要像这样访问文档:

mainWindow.document.getElementById('element_id');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM