12

Can the parent window be notified when a child window closes? (on a different domain?)

Trying to get around the window.opener not working when on different domains.

Can I at least be notified somehow when the child window closes?

Blankman
  • 259,732
  • 324
  • 769
  • 1,199

2 Answers2

14

You can't directly be notified of the window closing, but you can work out when the child window has been closed by inspecting the closed property on the window object reference returned by window.open().

Here's an example that will display an alert within 5 seconds of the child window being closed by polling the closed property:

var win = open('http://www.google.com');
var intervalId = setInterval(function() {
        if (win.closed) {
            clearInterval(intervalId);
            alert('Window closed! Hoorah!');
        }
    }, 5000);
Simon Lieschke
  • 13,058
  • 6
  • 46
  • 60
  • You cant be directly notified because the child window is in a separate domain, correct? – Adam Sep 07 '10 at 14:58
  • It's because there is no suitable browser event that you can use to work out when a window is closed. – Simon Lieschke Sep 08 '10 at 03:22
  • A suggestion: If let's us say you create a popup window with a page you control (same domain) and from the popup triggers a redirect to an external domain, the `closed` property wont' be availble anymore. You may want to check the `parent` property of the popup window – dickwan May 25 '16 at 06:48
  • @dickwan: nope, `closed` will still be available as cross-origin access is allowed to that window property. See https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Window – Simon Lieschke May 25 '16 at 16:45
-2

A better solution with two pieces of code 1/ in the popup :

$(window).bind('unload',
  function(){
    window.opener.PopupUnload(window)
  })

2/ in the parent (main window) :

function PopupUnload(wnd){
 setTimeout(function(){ // setTimeout is for IE
   if(wnd.closed)
     alert('You just killed me...')
  },10)
}

with this code, no function called forever (with setInterval()) and you make the difference between close and refresh popup (post/get)

(tested in IE8 and FF3)

Tomap
  • 610
  • 8
  • 22
  • 1
    Your `window.opener.PopupUnload` call is going to fail if the parent and popup windows are loaded from different domains due to cross site scripting restrictions. – Simon Lieschke Sep 08 '10 at 03:25