【发布时间】:2009-09-01 19:31:41
【问题描述】:
对于我的 Web 应用程序,我需要在父窗口关闭时关闭子窗口。 “关闭”是指浏览器窗口实际上已关闭,而不仅仅是导航到新页面。
我已经看过“How can I close the child window if the parent window is closed?”问题,但我的问题是它的扩展。该问题的答案解决了在父级的任何卸载事件上关闭子窗口的问题。但是卸载!=关闭(IMO);只需单击链接即可触发卸载事件。
由于 JS 中没有“onclose”事件,我决定最好的方法是在子级的父级卸载事件 setTimeout 上查看它的父级是否仍然存在,如果不存在则关闭:
var w = window.open("", "Logger", "height=480,width=640,resizeable,scrollbars=yes");
if (w) {
JSEvents.on(window,'unload',function(){
if (w && !w.closed) {
w.setTimeout(function(){
//IE this==w.opener
if (!w.opener || w.opener.closed) {
w.close();
}
},500);
}
});
}
但是,我相信我已经非常明确地表明,在 IE(7) 中,您不能在父窗口或子窗口的卸载事件期间使用 setTimeout。在上面的示例中,this == w.opener 在 setTimeout 匿名函数内部。此测试从不产生警报:
JSEvents.on(window, 'unload', function(){
window.setTimeout(function(){alert('HERE');},500);
});
没有setTimeout 的直接alert 将产生警报。
我可以使用从父母那里为孩子设置 setTimeout 的技巧吗?
我可以使用另一种检测父级何时关闭的方法吗?
在 FF 中做起来要容易得多,所以我专注于让它在 IE 下工作。
【问题讨论】:
-
我发现在 IE 中,如果页面正在转换,
document.activeElement.toString()是一个 URL,但如果关闭,[object]是一个 URL。结合我上面的 setTimeout 方法,我相信我可以实现我的目标。如果这可行,我将在下面发布我的解决方案。但这需要大量测试。
标签: javascript internet-explorer