在JavaScript中捕获弹出窗口的关闭事件

我需要在弹出窗口(使用window.open)关闭之前执行一些操作。

像这样的东西会很好:

var new_window = window.open('some url')
new_window.onBeforeUnload = function(){ my code}

我该如何实现?

xiaohan2012 asked 2019-11-18T22:52:11Z
6个解决方案
76 votes

只要弹出窗口的url与父页面位于同一个域中,您的示例就会起作用,并且您将事件更改为小写:

var new_window = window.open('some url')
new_window.onbeforeunload = function(){ /* my code */ }
glortho answered 2019-11-18T22:52:32Z
41 votes

虽然接受的答案对于相同来源是正确的,但我发现了针对跨来源弹出窗口的解决方案:

var win = window.open('http://www.google.com'); 
var timer = setInterval(function() { 
    if(win.closed) {
        clearInterval(timer);
        alert('closed');
    }
}, 1000);

资料来源:atashbahar.com

对于那些考虑使用它的人。

甚至Facebook也在其Javascript SDK中使用此“ hack”。

您可以通过查看他们的代码来验证这一点。 只需在[https://connect.facebook.net/zh_CN/sdk.js。]中搜索.closed

Dustin Hoffner answered 2019-11-18T22:53:21Z
13 votes

事件名称是onbeforeunload,而不是onBeforeUnload。JS区分大小写。

valentinas answered 2019-11-18T22:53:45Z
5 votes

您需要将onbeforeunload事件绑定到打开后的窗口。

最简单的方法是在窗口源代码中包含javascript onbeforeunload代码。

有关详细说明,请在此处和此处在Stackoverflow上参考这两个非常相似的问题。

random_user_name answered 2019-11-18T22:54:22Z
1 votes

如上所述,您需要在打开窗口后将onbeforeunload事件绑定到窗口。

请参见其他线程中的示例:[https://stackoverflow.com/a/25989253/578275。]

Sebastiaan Ordelman answered 2019-11-18T22:54:53Z
0 votes
var new_window = window.open('some_url')

您还可以检查new_window.window是否为null。但是您需要使用2620265741093962962754或setInterval函数手动进行检查。

这是当您不在同一域中时检查它的唯一方法。

Petr Odut answered 2019-11-18T22:55:25Z
translate from https://stackoverflow.com:/questions/9388380/capture-the-close-event-of-popup-window-in-javascript