用JavaScript捕获弹出窗口的关闭事件
Capture the close event of popup window in JavaScript
在弹出窗口(使用window.open
)关闭之前,我需要执行一些操作。
类似的东西会很好:
var new_window = window.open('some url')
new_window.onBeforeUnload = function(){ my code}
我怎样才能做到这一点?
虽然相同来源的公认答案是正确的,但我找到了跨来源弹出窗口的解决方案:
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中使用这种"黑客"。
您可以通过查看他们的代码来验证这一点。只需在中搜索.closed
https://connect.facebook.net/en_US/sdk.js.
只要弹出窗口url与父页面在同一域中,并且您将事件更改为全小写:,您的示例就会工作
var new_window = window.open('some url')
new_window.onbeforeunload = function(){ /* my code */ }
事件名称是onbeforeunload
,而不是onBeforeUnload
。JS区分大小写。
打开窗口后,需要将onbeforeunload
事件绑定到窗口。
最简单的方法是让javascript在窗口源代码中加载代码。
有关详细的解释,请参阅这里和这里关于Stackoverflow的这两个非常相似的问题。
onbeforeunload
事件必须在加载弹出窗口后添加。例如,您可以在其加载事件结束时添加它,如下所示;
const new_window = window.open('some url')
new_window.onload = function(){
/* my code */
this.onbeforeunload = function(){ /* my code */ }
}
您可能不想覆盖onbeforeunload
的值,因为如果popout也使用该钩子,这将干扰它的处理程序。
请改用addEventListener('beforeunload', ...)
。
const wnd = window.open(theUrl)
wnd.addEventListener('beforeunload', () => {
// do stuff
})
请注意,事件还存在其他选项,如unload
和pageHide
。阅读文档,了解什么活动最适合您的实现。
供参考:
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-每个状态的建议
import { useEffect, useRef } from "react";
const usePopupWindow = ({
url,
onPopupClose,
popupProperties = "width=200,height=200",
}) => {
const timer = useRef();
const handleWindowPopup = () => {
const windowPopup = window.open(url, "popup", popupProperties);
timer.current = setInterval(() => {
if (windowPopup.closed) {
clearInterval(timer.current);
onPopupClose();
}
}, 1000);
};
useEffect(() => {
return () => clearInterval(timer.current);
}, []);
return { handleWindowPopup };
};
export default usePopupWindow;
为React用例创建了这个钩子
如上所述,您需要在窗口打开后将onbeforenload事件绑定到窗口。
请参阅其他线程中的示例:https://stackoverflow.com/a/25989253/578275.
var new_window = window.open('some_url')
您也可以检查new_window.window
是否为null
。但您需要使用setTimeout
或setInterval
函数手动检查。
顺便说一句,这是当你不在同一个域上时如何检查它的唯一方法。
- 召回窗口加载事件 - javascript
- node-webkit-从父窗口捕获iframe鼠标事件
- 正在尝试处理子窗口上的关闭窗口事件
- 窗口大小调整事件在ie7中持续触发
- 为什么不'我的窗口滚动事件根本没有启动.其他答案没有解决问题
- 如何在Ol3弹出窗口中添加用javascript创建的按钮上的点击事件
- 点击AngularJS模态窗口捕捉背景事件
- 检测window.opener窗口刷新事件
- 我可以在FullCalendar中设置事件ClickLimit弹出窗口的样式吗
- 如何在事件函数中访问窗口实例
- 信息窗口谷歌地图点击事件给出错误
- 从父级触发弹出窗口中的事件
- 如何在窗口更改时触发事件
- 剑道窗口还原在最小化然后还原时不调用调整大小事件
- 销毁窗口.重新调整事件订阅服务器的大小
- AngularJS窗口滚动事件未触发
- 控制窗口.obeforeunload事件
- 如何跨窗口传递事件,可能
- 在聊天窗口中检测链接单击事件
- 保留动态创建的下拉列表's在事件窗口.history.back()上选择的值-JavaScript