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


75

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

像这样的东西会很好:

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

我该如何实现?

Answers:


90

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

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

6
如果新打开的窗口与父窗口不在同一域中怎么办?有没有骇客?
xiaohan2012 '02

13
最好的办法是在您的域中打开一个文档,然后将远程URL加载到iframe中,或通过服务器脚本读取远程URL并从那里呈现。
glortho 2012年

1
@glortho与在new_window内定义onbeforeunload事件相比,此方法是否具有任何优势?更具体地说,是否可以在new_page及其脚本加载之前立即将代码与new_window绑定?
哈迪姆·阿里2015年

1
@ xiaohan2012有一个黑客。看到我的答案stackoverflow.com/questions/9388380/…–
达斯汀·霍夫纳

3
这实际上不是检测窗口已关闭的准确方法。每当窗口中的文档被卸载时,就会触发unload和beforeunload事件,例如,这可能是由于重定向或重新加载引起的。请参阅@DustinHoffner的答案(stackoverflow.com/a/48240128/51055),以获取准确的方法。

86

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

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” 。

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


4
好一个。谢谢!
Roshana Pitigala

4
我不认为这是针对跨域的专门工具,它实际上是检测窗口已关闭的唯一准确方法。每当卸载窗口中的文档时,都会触发unload和beforeunload事件,这可能是由于重定向或重新加载造成的,因此不一定意味着窗口已关闭。
大麻

不幸的是,这似乎在Microsoft Edge中不起作用
Jamie McCrindle '18

我刚刚在IE11-WIN7上进行了测试: var win = window.open('https://www.google.com/') 当用户允许弹出窗口时,win变量将包含预期的对象。当然,您必须通过用户触发的事件来调用它。(例如onClick在某件事上)
Dustin Hoffner

13

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


1
如果我们通过使用附加事件将其作为内联属性附加到html,并且html是区分大小写的,这意味着这绝对没有区别
nikoss 2015年

6

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

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

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


谢谢。确实onbeforeunload并且onunload必须在子窗口加载后才能正常工作。
哈维2013年

2

onbeforeunload加载弹出窗口必须添加事件。例如,您可以将其添加到其加载事件的末尾,如下所示;

const new_window = window.open('some url')
new_window.onload = function(){ 
    /* my code */ 
    this.onbeforeunload = function(){ /* my code */ }
}


0
var new_window = window.open('some_url')

您还可以检查是否new_window.windownull。但是您需要使用setTimeoutsetInterval功能手动检查它。

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


如果您有一个可以为您打开和管理窗口的全局方法,并且该URL可以是内部还是外部(取决于上下文),这将非常有用
jimconte
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.