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

时间:2012-02-22 02:39:56

标签: javascript dom-events

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

类似的东西会很好:

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

我怎样才能做到这一点?

8 个答案:

答案 0 :(得分:74)

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

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

答案 1 :(得分:32)

虽然接受的答案对于相同的起源是正确的,但我找到了一个跨源弹出窗口的解决方案:

401 Unauthorised Page

来源:atashbahar.com

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

即使Facebook在他们的Javascript SDK中使用这种“黑客”。

您可以通过查看代码来验证这一点。只需在https://connect.facebook.net/en_US/sdk.js中搜索var win = window.open('http://www.google.com'); var timer = setInterval(function() { if(win.closed) { clearInterval(timer); alert('closed'); } }, 1000);

答案 2 :(得分:13)

事件名称为onbeforeunload,而非onBeforeUnload。 JS区分大小写。

答案 3 :(得分:5)

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

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

有关详细说明,请参阅Stackoverflow上的这两个非常相似的问题herehere

答案 4 :(得分:1)

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

参见其他帖子中的示例:https://stackoverflow.com/a/25989253/578275

答案 5 :(得分:1)

加载弹出窗口后,必须添加

onbeforeunload事件 。例如,您可以将其添加到其加载事件的末尾,如下所示;

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

答案 6 :(得分:0)

您可能不想覆盖 onbeforeunload 的值,因为如果它也使用该钩子,这会干扰弹出窗口的处理程序。

改用 addEventListener('beforeunload', ...)

const wnd = window.open(theUrl)
wnd.addEventListener('beforeunload', () => {
  // do stuff
})

请注意,事件存在其他选项,例如 unloadpageHide。阅读文档以了解哪种事件最适合您的实施。

供参考:

https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event

https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event

https://developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event

有关页面生命周期的概述,请参阅:

https://developers.google.com/web/updates/2018/07/page-lifecycle-api#developer-recommendations-for-each-state

答案 7 :(得分:-1)

var new_window = window.open('some_url')

您还可以检查new_window.window是否为null。但您需要使用setTimeoutsetInterval函数手动检查它。

这是btw当你不在同一个域时如何检查它的唯一方法。