【问题标题】: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');

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

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

【问题讨论】:

    标签: javascript dom-events cross-domain


    【解决方案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。你是对的。这个答案并不能防止这种情况。我在这里写了一些简单的代码来展示所述问题的一般解决方案。肯定还有更多的事情需要考虑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2012-10-14
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多