Как я могу поднять событие (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
внутри события, чтобы убедиться, что окно действительно закрыто.
Ответы
Ответ 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. Мне нечего делать, но я считаю, что выгрузка запускается, потому что по сути всплывающее окно выгружается из области родительского окна. Просто предположим.
Ответ 5
Вам нужно, чтобы вызов onBeforeUnload вызывал метод для уведомления вашего обработчика.
См. эту страницу для демонстрации.
http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo1.htm
Ответ 6
Используйте window.onUnload
Ответ 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.