Alpha2k
Alpha2k

Reputation: 2241

Detecting when popup window is closed in Firefox

I open a new window like this:

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');

And I wait for it to close:

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

This does work in Chrome and IE9 and Edge but not in Firefox, why?

Firefox does get inside the function but it never gets on win.closed if, even if there is an else it neither goes into it... is there any alternative to this?

Solution that worked for me:

On the popup window:

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

On the main window:

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

Note: the event to fire in the main window must be declared as public so it can be accessible, like so window.myEvent= function ()

Another reference: cross-window javascript events

Upvotes: 0

Views: 827

Answers (1)

somethinghere
somethinghere

Reputation: 17330

Basically, I think the simplest way to do this is the following:

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>

Please keep in mind that SO snippets are not allowed to open windows, so the code is not functional inside the snippet. Simply copy the code and save it as a file called test.html.

You do not need to keep checking, the child will simply call the function on the parent. This has the advantage that you are not using resources to keep checking for it. Also, be aware that when navigating in this window, onbeforeunload gets called if a new page is loaded, calling the parent function, but maybe you could just do the check you were already doing in the hasClosed function.

You might want to give an uuid to your window and pass it into it so it can inform you of it's identity on closing, but that's all refinement.

Upvotes: 1

Related Questions