子窗口关闭时如何运行父窗口的功能?

Abs*_*Abs 10 javascript

我之前已经问过这个问题,问题已经解决了一半,我帮助发现Javascript有一些严格的安全性.

我学到了什么:父窗口打开一个子窗口.子窗口重定向到不同的域并重定向回.它会在关闭自身时尝试触发父窗口的功能.

window.opener.startLoad();
Run Code Online (Sandbox Code Playgroud)

这会导致权限(安全性)问题,并且无法正常工作.

(一半)新问题:如何获得打开子窗口的窗口以及何时关闭在父窗口中运行一个函数?

我需要一种非常有效的方法,因为这将会发生很多!

感谢您的任何帮助.

Sea*_*ean 21

试试这个:

var win = window.open(url, name);
win.onunload = afterChildClose; // afterChildClose() is the function.
win.close(); // afterChildClose() should fire now.
Run Code Online (Sandbox Code Playgroud)

所有这些代码都将在父窗口的javascript中找到并执行(包括afterChildClose()).您正在创建窗口并将该函数分配给卸载事件.

哦,我刚才想到的一件事.如果子窗口刷新或导航到另一个URL,则onunload事件也将触发.如果您只想在窗口关闭时触发事件,则应在win.closed上包含afterChildClose()的检查.

编辑:这是我放在一起试用的两个示例页面的代码.

父窗口:

<html>
<body>
<script type="text/javascript">
    var win = window.open("secondwindow.html", "woo");
    win.onunload =onun; 

    function onun() {
        if(win.location != "about:blank") // This is so that the function 
                                          // doesn't do anything when the 
                                          // window is first opened.
        {
            alert("closed");
        }
    }
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

子窗口("secondwindow.html"):

<html>
<body>
<script type="text/javascript">
    setTimeout('window.close();', 5000);
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

当我尝试在firefox中打开第一个文档时,它打开窗口,窗口等待5秒并退出,第一个文档显示alert(),因此即使子窗口自行关闭它也能正常工作.


小智 5

我来到这里寻找类似的功能,但永远无法让它与跨浏览器兼容。所以这是在子窗口关闭时执行代码的另一种方法:

var win = window.open("http://www.google.com");

var winClosed = setInterval(function () {

    if (win.closed) {
        clearInterval(winClosed);
        location.assign("http://www.bing.com/");  //Execute your code here
    }

}, 250);
Run Code Online (Sandbox Code Playgroud)

它不使用来自子窗口的任何事件处理程序,也不需要修改子窗口的内容。