从子窗口调用父窗口的JavaScript

8
我有一个日历,当我点击一个<td>时,会弹出一个窗口,让您为所选日期创建事件。我想添加一个功能。
当用户完成创建事件时,我想发送JavaScript请求到父页面,以便我可以使用AJAX刷新日历。基本上,我想从子页面调用父页面上的函数。
在谷歌上,我只找到了一个可以刷新父窗口的脚本 - 没有关于“父回调”的任何内容。☹ 它是否可能?
P.S. 答案可以是纯JS或jQuery,这不重要。与此同时,我会继续寻找。

@Neal David说他谷歌搜索了“父回调”之类的东西,我认为如果他的搜索足够彻底,这是一个合理的努力量。请注意,据我所知,David并没有要求完整的代码来更新和显示日历。他只是在询问弹出窗口如何调用其父窗口中的函数的一般方法。 - Rory O'Kane
这是一个非常有价值的问题,已经被广泛讨论,我不知道为什么会被投票降低。我可以想象,在未来的浏览器版本中,我们将看到JavaScript能够在更深入的层面上与窗口平台进行交互。 - OneChillDude
感谢你们两位为这个问题辩护。我只是在询问一个“如何做”的问题,但不需要代码...是的,我已经做了一些研究,但我找到的都是如何刷新父窗口。我什么也没找到。现在我希望将来这个问题可以成为谷歌搜索的热门问题,并帮助更多有需要的人。 - David Bélanger
1个回答

13

您要查找的是对打开弹出窗口的 window 的引用。一旦您获得了它,您就可以在该窗口中调用函数,在该窗口中读取和写入变量,甚至操作其 DOM。

这个引用被称为 opener。它会给您提供当前窗口所打开的窗口的 window 对象。例如,如果您在原始窗口中有一个如下的函数:

function updateMe( data ) {
    alert( data );
}

然后在弹出窗口中,您可以这样调用它:

opener.updateMe( 'Hello!' );

自然地,您需要确保updateMe()在原始页面中是一个全局函数。或者,如果您在原始页面中有一些对象,并且updateMe()是该对象的方法,您仍然可以这样做,只要该对象是全局的。例如,在宿主页面中:

var myObject = {
    updateMe: function( data ) {
        alert( data );
    }
};

然后在弹出窗口中,您可以执行以下操作:

opener.myObject.updateMe( 'Hello!' );

基本上,只要您可以通过 window.whatever 在原始页面上访问对象或函数,那么在弹出窗口中,您可以将其简单地更改为 opener.whatever


1
MDN的window.opener文档 - Rory O'Kane
谢谢你。从我所看到的,这正是我在寻找的。我明天会在工作中尝试它! - David Bélanger
它运行得非常好!非常感谢,我今天学到了一些东西! - David Bélanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接