父窗口关闭时关闭所有子窗口

时间:2014-10-12 12:08:44

标签: javascript

我有一个打开多个窗口的Web应用程序。我遇到的问题是,当父窗口关闭/刷新时,子窗口仍然打开。 我尝试过使用onunloadonbeforeunload,但没有人抓住窗口关闭事件(在Chrome和Firefox中)。 我有一个窗口数组但刷新后对它们的引用丢失了。

还有其他方法可以捕获此事件吗?

这是与关闭窗口相关的代码(在closeAll()之外运行unload,而onbeforeunload关闭所有已打开的窗口,但在刷新页面时则不关闭:

window.unload = function() {
   closeAll();
}
window.onbeforeunload  = function() {
   closeAll();
}

var closePopup = function(popup) {
   removePopup(popup);
   popup.close();
};

var closeAll = function() {
   for (var popup in _this.popups) {
       closePopup(_this.popups[popup]);
    }
}

这仅适用于Chrome,但不适用于Firefox和IE(最新版本)。

4 个答案:

答案 0 :(得分:3)

使用此

var popup = window.open("popup.html", "popup", "width=200,height=200");

window.onunload = function() {
    if (popup && !popup.closed) {
        popup.close();
    }
};

答案 1 :(得分:3)

如果您使用window.open打开所有子窗口,请在所有页面中包含此javascript,然后从任何包含的页面中 CloseAll(false); 将关闭所有子项,孙子项,伟大的...等,并将第一个(根)页面重定向到login.aspx,并且不会干扰任何事件触发器,因为它会使初始处理程序通过。

function CloseAll(bTopFound)
{
    if (!bTopFound && nParent != null && !nParent.closed) {
        //parent window was not closed
        nParent.CloseAll(false);
        return;
    } else {
        if (nParent == null || nParent.closed)
        {
            top.location = '/login.aspx';
        }
    }

    for (var i = 0; i < Windows.length; i++)
    {
        if (!Windows[i].closed) {
            Windows[i].CloseAll(true);
        }
    }
    nParent = null;
    setTimeout(window.close, 150);
}

var Windows = [];
//override window.open to inject store child window objects
window.open = function (open) {
    return function (url, name, features) {
        // set name if missing here
        name = name || "default_window_name";
        var newWindow = open.call(window, url, name, features);
        Windows.push(newWindow);
        return newWindow;
    };
}(window.open);

var nParent = null;
window.onload = function (load) {
    return function (e) {
        nParent = window.opener;
        if (load != null) {
            load.call(e);
        }
    }
}(window.onload);

window.onunload = function (unload) {
    return function (e) {
        //promote first branch page to parent
        if (nParent != null && !nParent.closed && Windows.length > 0) {
            nParent.Windows.push(Windows[0]);
            Windows[0].nParent = nParent;
        }
        //make first child window new root
        for (var i = 1; i < Windows.length; i++) {
            Windows[i].nParent = Windows[0];
            Windows[0].Windows.push(Windows[i]);
        }
        if (unload != null) {
            unload.call(e);
        }
    }
}(window.onunload);

答案 2 :(得分:2)

找到适用于最新版Chrome,Firefox和IE的正确解决方案(jQuery)。

最初想要使用jQuery $().unload()函数(http://api.jquery.com/unload/),但自1.8(http://bugs.jquery.com/ticket/11733)以来它已被弃用。由于$().unload()$().bind('unload', fn)的快捷方式,因此我尝试使用基本的快捷方式。

$(window).on('unload', function() {
    closeAll();
});

答案 3 :(得分:0)

如果目标是在关闭或刷新父窗口时关闭子窗口,而不是实际检测到事件,则可以使用setInterval来检测window.opener何时不再存在。

            function CloseOnParentClose() {
                if (typeof window.opener != 'undefined' && window.opener != null) {
                    if (window.opener.closed) {
                        window.close();
                    }
                }
                else {
                    window.close();
                }
            }
            $(window).ready(function () {
                setInterval(CloseOnParentClose, 1000);
            });