Вопрос - в значительной степени все в заголовке.
Действительно ли это возможно (и как?), чтобы открыть всплывающее окно с JavaScript и затем обнаружить, когда пользователь закрывает его?
Я использую jQuery в рамках проекта, таким образом, решение jQuery было бы хорошо.Удачи!
Если у вас есть контроль над содержимым всплывающего окна, обработайте в нем событие unload
и уведомите исходное окно через свойство открыватель
, сначала проверяя, был ли закрыт открыватель. Обратите внимание, что это не всегда работает в Opera.
window.onunload = function() {
var win = window.opener;
if (!win.closed) {
win.someFunctionToCallWhenPopUpCloses();
}
};
Поскольку событие unload
будет срабатывать всякий раз, когда пользователь уходит со страницы во всплывающем окне, а не только при закрытии окна, вы должны проверить, действительно ли всплывающее окно закрылось в someFunctionToCallWhenPopUpCloses
:
var popUp = window.open("popup.html", "thePopUp", "");
function someFunctionToCallWhenPopUpCloses() {
window.setTimeout(function() {
if (popUp.closed) {
alert("Pop-up definitely closed");
}
}, 1);
}
Если у вас нет контроля над содержимым всплывающего окна или если один из ваших целевых браузеров не поддерживает событие unload
, вы уменьшены какое-то решение для опроса в главном окне. Отрегулируйте интервал по своему усмотрению.
var win = window.open("popup.html", "thePopUp", "");
var pollTimer = window.setInterval(function() {
if (win.closed !== false) { // !== is required for compatibility with Opera
window.clearInterval(pollTimer);
someFunctionToCallWhenPopUpCloses();
}
}, 200);
Попробуйте изучить события unload
и beforeunload
окна. Мониторинг этих событий должен дать вам возможность вызвать обратный вызов, когда DOM выгружается при закрытии окна, примерно так:
var newWin = window.open('/some/url');
newWin.onunload = function(){
// DOM unloaded, so the window is likely closed.
}
Если вы можете использовать jQuery UI Dialog, у него действительно есть событие close
.
Чтобы открыть новое окно, вызовите:
var wnd = window.open("file.html", "youruniqueid", "width=400, height=300");
Если вы просто хотите знать, когда это окно будет закрыто, используйте onunload
.
wnd.onunload = function(){
// do something
};
Если вы хотите получить подтверждение от пользователя перед тем, как закрыть его, используйте перед загрузкой
.
wnd.onbeforeunload = function(){
return "are you sure?";
};
Мы делаем это в одном из моих проектов на работе.
Уловка состоит в том, чтобы на родительской странице была функция JS, которую вы планируете вызывать при закрытии всплывающего окна, а затем перехватить событие выгрузки во всплывающем окне.
Свойство window.opener
относится к странице, которая породила это всплывающее окно.
Например, если бы я написал функцию с именем callPageFunction
на моей исходной странице, я бы вызвал ее из всплывающего окна следующим образом:
$(window).unload(function() {
window.opener.callingPageFunction()
});
Два примечания:
Да, обработайте событие onbeforeUnload для всплывающего окна, а затем вызовите функцию на родительском окне, используя:
window.opener.myFunction()