这个问题几乎都在标题中。
是否可以(以及如何?)使用javascript打开弹出窗口,然后检测用户何时关闭它?
我在项目中使用jquery,所以jquery解决方案会很好。干杯!
答案 0 :(得分:89)
如果您可以控制弹出窗口的内容,请在那里处理窗口的unload
事件,并通过opener
属性通知原始窗口,首先检查开启器是否已关闭。请注意,这在Opera中并不总是有效。
window.onunload = function() {
var win = window.opener;
if (!win.closed) {
win.someFunctionToCallWhenPopUpCloses();
}
};
由于unload
事件会在弹出窗口中导航离开页面而不是窗口关闭时触发,因此您应该检查弹出窗口是否已实际关闭{{1 }}:
someFunctionToCallWhenPopUpCloses
如果您无法控制弹出窗口的内容,或者您的某个目标浏览器不支持var popUp = window.open("popup.html", "thePopUp", "");
function someFunctionToCallWhenPopUpCloses() {
window.setTimeout(function() {
if (popUp.closed) {
alert("Pop-up definitely closed");
}
}, 1);
}
事件,那么您将被简化为主要的某种轮询解决方案窗口。调整间隔以适应。
unload
答案 1 :(得分:6)
尝试查看unload
和beforeunload
窗口事件。监视这些应该让你有机会在窗口关闭时通过类似这样的东西卸载DOM时回调:
var newWin = window.open('/some/url');
newWin.onunload = function(){
// DOM unloaded, so the window is likely closed.
}
答案 2 :(得分:6)
如果您可以使用jQuery UI Dialog,则实际上会有close
个事件。
答案 3 :(得分:6)
您的问题有一个非常简单的解决方案。
首先制作一个新对象,打开一个像这样的流行音乐:
var winObj = window.open('http://www.google.com','google','width=800,height=600,status=0,toolbar=0');
为了知道这个弹出窗口何时关闭,你只需要用以下循环来检查它:
var loop = setInterval(function() {
if(winObj.closed) {
clearInterval(loop);
alert('closed');
}
}, 1000);
现在,您可以使用任何所需的JavaScript代码替换警报。
玩得开心! :)
答案 4 :(得分:3)
打开新窗口调用:
var wnd = window.open("file.html", "youruniqueid", "width=400, height=300");
如果您只想知道该窗口何时关闭,请使用onunload
。
wnd.onunload = function(){
// do something
};
如果您想在关闭之前获得用户的确认,请使用onbeforeunload
。
wnd.onbeforeunload = function(){
return "are you sure?";
};
答案 5 :(得分:3)
我们在我的一个工作项目中这样做。
诀窍是在弹出窗口关闭时计划调用的父页面中有一个JS函数,然后在弹出窗口中挂钩unload事件。
window.opener
属性是指产生此弹出窗口的页面。
例如,如果我在原始页面上编写了一个名为callingPageFunction
的函数,我会从弹出窗口中调用它:
$(window).unload(function() {
window.opener.callingPageFunction()
});
两个注释:
答案 6 :(得分:1)
我认为最好的方法是:
const popup = this.window.open(url.toString());
popup.addEventListener('unload', ()=> console.log('closed'))
答案 7 :(得分:0)
是,处理弹出窗口的onbeforeUnload事件,然后使用以下命令调用父窗口上的函数:
window.opener.myFunction()