[英]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.