Javascript: междоменное событие window.close из родительского окна - PullRequest
4 голосов
/ 16 марта 2012

Например, я нахожусь на домене 1:

a.click(function(){
  window.win=window.open(domain2,'name');
});

Теперь я нахожусь на домене 2 и закрываю его.Как window.win узнает, что пользователь закрыл это окно?Есть ли какое-либо событие или свойство для проверки через интервал?

Ответы [ 3 ]

7 голосов
/ 16 марта 2012

Существует свойство, которое не является частью какой-либо спецификации W3C. Он называется closed и будет доступен как

if( window.win.closed ) {
    // window was closed
}

Я не уверен в совместимости между браузерами для этого свойства. Я также не уверен, как это ведет себя на доменах с разными источниками. Но если вы попробуете это, пожалуйста, дайте мне и остальной части этого сообщества знать об этом.


Другой вариант - вы сами позаботитесь об уведомлении. Это означает, что вы слушаете onbeforeunload во всплывающем окне. Когда событие запускается, вы можете использовать HTML5 postMessage метод для связи между междоменными окнами. Например:

MainWindow:

window.addEventListener('message', function(e) {
    if( e.origin === 'http://www.popupdomain.com' ) {
        if( e.data === 'closed' ) {
            alert('popup window was closed');
        }
    }
}, false);

Domain2:

window.onbeforeunload = function() {
    window.opener.postMessage('closed', 'http://www.popupdomain.com');
};

Единственное предостережение в отношении этого решения заключается в том, что оно совместимо только с браузером, поддерживающим базовый HTML5. Существуют и другие (хитрые) способы междоменной связи в старых браузерах, но, думаю, это другая история.

2 голосов
/ 03 сентября 2014

Вы можете проверить, был ли кросс-домен закрыт, используя интервальную проверку свойства windows closed.

var url = "http://stackoverflow.com";
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
    ...
}
0 голосов
/ 20 марта 2013

Я работал над подобной проблемой, в которой окно домена1 открывается из домена2. Мне нужно было проверить, когда окно закрывается. Я попробовал следующее: -

  1. Я использовал событие window.onunload, оно не работало из-за Одинаковой политики происхождения и показало следующую ошибку

    Ошибка: попытка запустить скрипт compile-and-go в очищенной области Исходный файл: chrome: //firebug/content/net/httpLib.js

    Ошибка: попытка запустить скрипт compile-and-go в очищенной области Исходный файл: chrome: //firebug/content/firefox/tabWatcher.js

  2. Но я сохранил массив объектов Window и применил свойство "Window.closed" , оно работает даже в кросс-домене. :)

  3. Также вы можете попробовать postMessage API или CORS

...