是否可以使用javascript打开弹出窗口,然后检测用户何时关闭它?

Pab*_*blo 66 javascript jquery popup

问题几乎全在标题中.

是否可以(以及如何?)使用javascript打开弹出窗口,然后检测用户何时关闭它?

我在项目中使用jquery,所以jquery解决方案会很好.干杯!

Tim*_*own 91

如果您可以控制弹出窗口的内容,请在unload那里处理窗口的事件并通过opener属性通知原始窗口,首先检查开启器是否已关闭.请注意,这在Opera中并不总是有效.

window.onunload = function() {
    var win = window.opener;
    if (!win.closed) {
        win.someFunctionToCallWhenPopUpCloses();
    }
};
Run Code Online (Sandbox Code Playgroud)

由于unload只要用户在弹出窗口中离开页面而不是窗口关闭时,事件就会触发,您应检查弹出窗口是否已实际关闭someFunctionToCallWhenPopUpCloses:

var popUp = window.open("popup.html", "thePopUp", "");
function someFunctionToCallWhenPopUpCloses() {
    window.setTimeout(function() {
        if (popUp.closed) {
            alert("Pop-up definitely closed");
        }
    }, 1);
}
Run Code Online (Sandbox Code Playgroud)

如果您无法控制弹出窗口的内容,或者您​​的某个目标浏览器不支持该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);
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用轮询解决方案而不是`unload`事件,因为它与更多浏览器兼容(请参阅https://opera-bugs.jottit.com/). (3认同)

Ksh*_*tal 7

您的问题有一个非常简单的解决方案.

首先制作一个新对象,打开一个像这样的流行音乐:

var winObj = window.open('http://www.google.com','google','width=800,height=600,status=0,toolbar=0');
Run Code Online (Sandbox Code Playgroud)

为了知道这个弹出窗口何时关闭,你只需要通过如下循环来检查它:

var loop = setInterval(function() {   
    if(winObj.closed) {  
        clearInterval(loop);  
        alert('closed');  
    }  
}, 1000); 
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用您想要的任何JavaScript代码替换警报.

玩得开心!:)

  • 请注意,Google 设置了“cross-origin-opener-policy”标头,因此即使窗口未关闭,“winObj.close”也会返回“true”。 (2认同)

ajm*_*ajm 6

尝试查看unloadbeforeunload窗口事件.监视这些应该让你有机会在窗口关闭时通过以下方式卸载DOM时回调:

var newWin = window.open('/some/url');
newWin.onunload = function(){
  // DOM unloaded, so the window is likely closed.
}
Run Code Online (Sandbox Code Playgroud)


eje*_*211 6

如果你可以使用jQuery UI对话框,它实际上有一个close事件.

  • 的确如此.我应该用"if"这个词开始我的回答,如"如果你可以使用jQuery UI对话框"而不只是*假设*它是可能的.嘿! 等一等... (11认同)
  • jQuery不是每个问题的解决方案:). (10认同)
  • 而且,当谈到JavaScript时,jQuery永远不是解决问题的方法,但它通常是解决方案的巨大,巨大,**巨大的捷径,无论它是什么.你可以通过风景路线了解更多,但是,在很多情况下,我和大多数人都喜欢(巨大的,巨大的,巨大的**)jQuery快捷方式. (3认同)