如何访问父级';使用javascript从子对象的子对象创建控件?
我想从popoup的子级访问父窗口的控件,如:如何访问父级';使用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中打开窗口
- 从
,打开Window1
Window2
- 从
,打开窗口2
窗口3
- 从
,打开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中始终保持未定义。