我有一个打开多个窗口的Web应用程序。我遇到的问题是,当父窗口关闭/刷新时,子窗口仍然打开。
我尝试过使用onunload
和onbeforeunload
,但没有人抓住窗口关闭事件(在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(最新版本)。
答案 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);
});