检测Firefox中弹出窗口何时关闭

时间:2016-02-09 16:05:37

标签: javascript firefox

我打开一个这样的新窗口:

var newWindow = window.open('myPage.aspx', null, 'height=650,width=900,status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,top=0, left=0');

我等着它关闭:

var windowTimer = window.setInterval(function () {
    if (win.closed !== false) {
        //If window is closed ...
        window.clearInterval(windowTimer);
    }
}, 100);

这适用于Chrome和IE9以及Edge ,但不适用于Firefox,为什么

Firefox确实进入了该功能,但它永远不会进入win.closed if,即使有一个else它也没有进入它... 有没有替代它?

对我有用的解决方案:

在弹出窗口中:

    //Fires an event on the window that opened it
    window.onbeforeunload = function () {
        window.opener.myEvent();
    };

在主窗口:

window.myEvent= function () {
//This fires only when the popup gets closed on beforeunload
}

注意:必须将主窗口中要触发的事件声明为公共,以便可以访问它,如window.myEvent= function ()

另一个参考: cross-window javascript events

1 个答案:

答案 0 :(得分:1)

基本上,我认为最简单的方法如下:



function hasClosed(){
  document.getElementById('open').textContent = 'window has been closed';
}
window.addEventListener('beforeunload', function(){
  if(window.opener) window.opener.hasClosed();
});
document.getElementById('open').addEventListener('click', function(e){
  e.preventDefault();
  window.open('test.html');
});

<a href="#" id="open">open window</a>
&#13;
&#13;
&#13;

请注意,SO片段不允许打开窗口,因此代码在代码段内不起作用。只需复制代码并将其另存为名为test.html的文件。

您不需要继续检查,孩子只需调用父项上的函数即可。这样做的好处是您没有使用资源来继续检查它。另外,请注意,在此窗口中导航时,如果加载了新页面,调用父函数,则会调用onbeforeunload,但也许您可以执行hasClosed函数中已经执行的检查

您可能希望将uuid添加到您的窗口并将其传递给它,这样它就可以在结束时通知您它的身份,但这完全可以改进。