For example I'm on domain1:
a.click(function(){
window.win=window.open(domain2,'name');
});
Now I'm on domain2 and I'm closing it. How will window.win
know that user closed that window? Is there any event or property to check via interval?
For example I'm on domain1:
a.click(function(){
window.win=window.open(domain2,'name');
});
Now I'm on domain2 and I'm closing it. How will window.win
know that user closed that window? Is there any event or property to check via interval?
- Detecting when a Cross-Domain Popup Window Closes is very similar. – Matthew Flaschen Commented Apr 19, 2012 at 14:57
3 Answers
Reset to default 9There is a property which is not part of any W3C spec. It's called closed
and would get accessed like
if( window.win.closed ) {
// window was closed
}
I'm not sure about the cross-browser patibilty for that property. I'm also not sure how this behaves on cross-origin domains. But if you try it please let me and the rest of this munity know about it.
Another option is that you take care for the notification yourself. That means, you are listening for the onbeforeunload
within the popup-window. When the event fires, you could use HTML5's postMessage
method to municate between cross-domain windows. For instance:
MainWindow:
window.addEventListener('message', function(e) {
if( e.origin === 'http://www.popupdomain.' ) {
if( e.data === 'closed' ) {
alert('popup window was closed');
}
}
}, false);
Domain2:
window.onbeforeunload = function() {
window.opener.postMessage('closed', 'http://www.popupdomain.');
};
The only caveat on this solution is that it's only patible with browser that support basic HTML5. There are other (sneaky) ways to have a cross-domain munication on old'ish browsers, but I guess that is another story.
You can check if the cross domain was closed by using an interval check on the windows closed property.
var url = "http://stackoverflow.";
var width = 500;
var height = 500;
var closeCheckInterval = 500; //Check every 500 ms.
var popup = window.open(url, "_new", 'width=' + width + ', height=' + height);
popup.focus();
var closeCheck = setInterval(function () {
try {
(popup == null || popup.closed) && (clearInterval(closeCheck), onWindowClosed());
} catch (ex) { }
}, closeCheckInterval);
var onWindowClosed = function () {
...
// Stuff to do after window has closed
...
}
I was working on the similar problem in which a window of domain1 is opened from domain2. I needed to keep a check on when the window gets closed. I tried following :-
I used window.onunload event , it didn't work because of Same Origin Policy and showed following error
Error: attempt to run pile-and-go script on a cleared scope Source File: chrome://firebug/content/net/httpLib.js
Error: attempt to run pile-and-go script on a cleared scope Source File: chrome://firebug/content/firefox/tabWatcher.js
But I maintained an array of Window objects and applied "Window.closed" property , it works even in cross domain. :)
Also you can try postMessage API or CORS