如何监听子窗口关闭?

Posted

技术标签:

【中文标题】如何监听子窗口关闭?【英文标题】:How to listen for child window closing? 【发布时间】:2011-08-08 09:43:22 【问题描述】:

我正在以这种方式打开 Facebook 共享的子窗口:

window.open(sharingUrl,'','toolbar=0,status=0,width=626,height=436');

当用户点击分享或关闭时,窗口会自动关闭...

有没有办法为这些事件添加监听器?

【问题讨论】:

【参考方案1】:

为了将来的参考,我想分享另一个不需要setInterval 的解决方案:

var child = window.open('http://google.com','','toolbar=0,status=0,width=626,height=436');
child.onunload = function() console.log('Child window closed'); ;

【讨论】:

我们将不胜感激提出建设性意见而不是负 1。你用什么浏览器来测试这个。 Same-Origin 适用,这使得在不同的域中附加这样的处理程序是不可能的。 我试过这个。但是即使用户从同一个子窗口导航到不同的网页,卸载事件也会被触发。如何检测实际的窗口关闭? @diosney 你可能已经解决了这个问题,但是给那些目前正在寻找类似问题的人留下评论。我创建时禁用了打开窗口功能,以便只有在关闭窗口时才能识别卸载事件。【参考方案2】:

这样就可以了

   <html>
<head>
<title>Detecting browser close in IE</title>
<script type="text/javascript">

window.onbeforeunload = function() myUnloadEvent(); 
function myUnloadEvent() 
    alert ('You can have Ur Logic Here ,');



</script>
</head>
</script>
</head>
<body >
<h1>Close the Window now</h1>
</body>
</html>

【讨论】:

这对 Oleg 不起作用,因为他正在子窗口中打开 Facebook 页面。他没有(我猜)有能力改变 html 的 Facebook 代码。 他没有,这将是一个安全问题,您在跨域操作方面非常有限。【参考方案3】:

如果在调用window.open() 时存储了对子窗口的引用,则可以使用setInterval() 进行轮询,以使用window.closed 属性查看窗口是否仍处于打开状态。下面的示例每秒检查两次。

var child = window.open('http://google.com','','toolbar=0,status=0,width=626,height=436');
var timer = setInterval(checkChild, 500);

function checkChild() 
    if (child.closed) 
        alert("Child window closed");   
        clearInterval(timer);
    

其他人注意:如果您曾经处于可以控制子窗口中的 html 的情况,您可以利用 onbeforeunload 事件并提醒父窗口。

【讨论】:

然后您可以创建一个动态页面,该页面生成一个 100% 大小的 iframe,该页面将在关闭时触发 onbeforeunload 如果setInterval 调用了一个直到之后才定义的函数,为什么这会起作用? @HelpingHand 由于函数提升。 这在 Chrome 等默认情况下是否不起作用,这将阻止弹出窗口并且对子项的引用将为空?因此,您会在 null/undefined 上调用 .close ,我认为这可能会出错。哦,如果页面只是试图在没有用户交互的情况下打开它,Chrome 会阻止弹出窗口。 @PeterP。你是对的。这个答案并不能防止这种情况。我在这里写了一些简单的代码来展示所述问题的一般解决方案。肯定还有更多的事情需要考虑。

以上是关于如何监听子窗口关闭?的主要内容,如果未能解决你的问题,请参考以下文章

Vue监听页面窗口改变,实现子页面高度数值更新

子窗口关闭,父窗口如何刷新

2016-11-6坚持学习Day21子窗口关闭时,同步关闭它的主窗口(方法二)

firefox下如何关闭子窗口刷新父窗口? - 技术问答

C# WPF如何关闭通过父窗口打开的所有子窗口

Python 如何实现关闭当前子窗口