Как мне вызвать событие (jQuery или vanilla Javascript), когда всплывающее окно закрыто? - PullRequest
12 голосов
/ 26 сентября 2008

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

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780");

Есть ли способ подписаться на событие close, используя jQuery, или просто необработанный javascript? Я использую jQuery и не могу добавить другую библиотеку, поэтому, если это невозможно сделать в jQuery, мне придется как-то свернуть свою собственную систему событий, чтобы она работала во всех браузерах.

UPDATE:
Я попытался использовать событие unload в jQuery, и по какой-то причине событие возникает, как только мое всплывающее окно открывается, а не когда оно закрывается. Если я использую Firebug, чтобы установить точку останова, чтобы задержать событие unload от подписки, событие unload работает так, как и должно, но по какой-то причине оно не работает правильно, когда javascript разрешено выполнять естественным образом.

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780");
$(popupWindow.window).unload(function() { alert('hello'); });

Кто-нибудь имеет представление о том, почему событие unload может быть вызвано при загрузке окна?

Еще один улов - то, что я заметил, что событие "unload" в jQuery не остается подписанным на окно, как это обычно происходит, если я просто делаю:

popupWindow.onunload = function(){alert('hello')};

Кажется, что отписаться от события каждый раз, когда оно поднято. Это должно случиться? Если бы не эта ошибка (или функция?) В jQuery, было бы хорошо, чтобы событие вызывалось при загрузке, поскольку я могу проверить свойство popupWindow.closed внутри события, чтобы убедиться, что окно действительно закрыто.

Ответы [ 8 ]

18 голосов
/ 04 февраля 2010

Я создал наблюдатель, который проверяет, было ли окно закрыто:

var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true);
var watchClose = setInterval(function() {
    if (w.closed) {
     clearTimeout(watchClose);
     //Do something here...
    }
 }, 200);
7 голосов
/ 04 марта 2010

Я попробовал подход наблюдателя, но столкнулся с проблемой «отказано в разрешении» при использовании этого в IE6. Это происходит из-за того, что свойство closed не полностью доступно во время закрытия окна ... но, к счастью, с помощью конструкции try {} catch оно работает, хотя:

var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true);

var watchClose = setInterval(function() {
    try {
        if (w.closed) {
            clearTimeout(watchClose);
            //Do something here...
        }
    } catch (e) {}
}, 200);

Спасибо, магнус

3 голосов
/ 07 июня 2011

Мне кажется, я понял, что происходит:

Когда вы используете window.open, он открывает новое окно с местоположением «about: blank», а затем меняет его на URL-адрес, указанный вами при вызове функции.

Таким образом, событие unload связывается перед изменением с «about: blank» на правый URL и вызывается при изменении.

Я работал с JQuery следующим образом:

$(function(){
    var win = window.open('http://url-at-same-domain.com','Test', 'width=600,height=500');
    $(win).unload(function(){
        if(this.location == 'about:blank')
        {
            $(this).unload(function(){
                // do something here
            });
        }
    });
});
2 голосов
/ 26 сентября 2008

Пример кода jQuery для события unload

$(window).unload( function () { alert("Bye now!"); } );

Из документации выгрузки jQuery

Edit:

Я поиграл и не смог получить родительское окно, чтобы можно было установить разгрузку. Единственный способ, которым я мог заставить это работать, был при наличии сценария во всплывающем окне html. Всплывающее окно также необходимо для загрузки jQuery. Мне не на чем основывать это, но я полагаю, что выгрузка запускается, потому что, по сути, всплывающее окно выгружается из области родительского окна. Просто предположение.

1 голос
/ 26 сентября 2008

Вам нужно, чтобы событие onBeforeUnload вызывало метод для уведомления вашего обработчика.

См. Эту страницу для демонстрации.

http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo1.htm

0 голосов
/ 22 июля 2009

Из того, что я проверил, выгрузка jQuery - это просто оболочка для встроенной функции. Я могу ошибаться, потому что я не копал так глубоко.

Этот пример сработал для меня.

$(document).ready(function(){
    $(window).unload( function (){
        alert('preget');
        $.get(
            '/some.php',
            { request: 'some' }
        );
        alert('postget');
    });
});

Помните, что некоторые браузеры блокируют запросы window.open при выгрузке, например, IE .

0 голосов
/ 26 сентября 2008

Есть одна маленькая уловка, которую я должен упомянуть в связи с предыдущими упоминаниями onunload на основе моего предыдущего опыта:

Opera 9.0.x-9.2.x запускает window.onUnload, только если пользователь уходит со страницы. Если пользователь вместо этого закрывает окно, событие никогда не сработает. Я подозреваю, что это было сделано для борьбы с проблемой самообновляющегося всплывающего окна (когда всплывающее окно может снова открыться при закрытии страницы).

Скорее всего, это сохранилось до Opera 9.5.x. Другие браузеры могут также реализовать это, но я не верю, что IE или Firefox делают.

0 голосов
/ 26 сентября 2008

Использование window.onUnload

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...