标题中几乎所有问题。
是否可以(以及如何?)用JavaScript打开弹出窗口,然后检测用户何时关闭它?
我在项目中使用jquery,所以jquery解决方案会很好。干杯!
Answers:
如果您可以控制弹出窗口的内容,请在unload
此处处理窗口的事件,并通过opener
属性通知原始窗口,首先检查打开器是否已关闭。请注意,这在Opera中并不总是有效。
window.onunload = function() {
var win = window.opener;
if (!win.closed) {
win.someFunctionToCallWhenPopUpCloses();
}
};
由于该unload
事件将在用户离开弹出窗口中的页面时(而不只是关闭窗口时)触发,因此您应该检查弹出窗口在以下位置是否确实已关闭someFunctionToCallWhenPopUpCloses
:
var popUp = window.open("popup.html", "thePopUp", "");
function someFunctionToCallWhenPopUpCloses() {
window.setTimeout(function() {
if (popUp.closed) {
alert("Pop-up definitely closed");
}
}, 1);
}
如果您无法控制弹出窗口的内容,或者您的目标浏览器之一不支持该unload
事件,则可以在主窗口中使用某种轮询解决方案。调整间隔以适合。
var win = window.open("popup.html", "thePopUp", "");
var pollTimer = window.setInterval(function() {
if (win.closed !== false) { // !== is required for compatibility with Opera
window.clearInterval(pollTimer);
someFunctionToCallWhenPopUpCloses();
}
}, 200);
unload
事件,因为它与更多浏览器兼容(请参阅opera-bugs.jottit.com)。
window.closed !== false
在Opera中要求的原因是什么?
window.clearInterval()
通话。如果不包括在内,原始页面将继续轮询...一遍又一遍...
有一个非常简单的解决方案来解决您的问题。
首先创建一个新对象,它将打开一个弹出窗口,如下所示:
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代码。
玩得开心!:)
尝试查看unload
和beforeunload
窗口事件。监视这些应该使您有机会在通过以下方式关闭窗口时在DOM卸载时进行回调:
var newWin = window.open('/some/url');
newWin.onunload = function(){
// DOM unloaded, so the window is likely closed.
}
unload
在弹出窗口中处理事件。
unload
。
如果您可以使用jQuery UI对话框,则它实际上有一个close
事件。
要打开新的窗口调用:
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?";
};
unload
在弹出文档中处理事件。