Подтвердить что ты не робот

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Думаю, я понял, что происходит:

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

Итак, событие выгрузки привязано перед изменением от "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
            });
        }
    });
});

Ответ 4

Пример кода jQuery для события выгрузки

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

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

Edit:

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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