如何监听子窗口关闭?
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。你是对的。这个答案并不能防止这种情况。我在这里写了一些简单的代码来展示所述问题的一般解决方案。肯定还有更多的事情需要考虑。以上是关于如何监听子窗口关闭?的主要内容,如果未能解决你的问题,请参考以下文章