it-swarm.com.ru

можно ли открыть всплывающее окно с Javascript, а затем определить, когда пользователь закрывает его?

Вопрос почти все в названии.

Возможно ли (и как?) Открыть всплывающее окно с помощью JavaScript, а затем определить, когда пользователь закрывает его?

Я использую jquery в рамках проекта, поэтому решение jquery было бы хорошо. Ура!

62
Pablo

Если у вас есть контроль над содержимым всплывающего окна, обработайте в нем событие unload окна и уведомите исходное окно через свойство opener, проверив сначала, был ли открыватель закрыт. Обратите внимание, что это не всегда работает в 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);
88
Tim Down

Если вы можете использовать jQuery UI Dialog , у него фактически есть событие close.

6
eje211

Существует очень простое решение вашей проблемы.

Сначала создайте новый объект, который откроет всплывающее окно, как это:

var winObj = window.open('http://www.google.com','google','width=800,height=600,status=0,toolbar=0');

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

var loop = setInterval(function() {   
    if(winObj.closed) {  
        clearInterval(loop);  
        alert('closed');  
    }  
}, 1000); 

Теперь вы можете заменить оповещение любым кодом JavaScript, который вы хотите.

Повеселись! :)

5
Kshitij Mittal

Попробуйте просмотреть события окон unload и beforeunload . Мониторинг этого должен дать вам возможность перезвонить, когда DOM выгружается, когда окно закрывается, примерно так:

var newWin = window.open('/some/url');
newWin.onunload = function(){
  // DOM unloaded, so the window is likely closed.
}
5
ajm

Чтобы открыть новое окно вызова:

var wnd = window.open("file.html", "youruniqueid", "width=400, height=300");

Если вы просто хотите знать, когда закрывается это окно, используйте onunload.

wnd.onunload = function(){
    // do something
};

Если вы хотите получить подтверждение от пользователя, прежде чем сможете его закрыть, используйте onbeforeunload.

wnd.onbeforeunload = function(){
    return "are you sure?";
};
3
jAndy

Мы делаем это в одном из моих проектов на работе.

Хитрость заключается в том, чтобы на родительской странице была функция JS, которую вы планируете вызывать при закрытии всплывающего окна, а затем перехватить событие unload во всплывающем окне.

Свойство window.opener относится к странице, которая породила это всплывающее окно.

Например, если бы я написал функцию с именем callingPageFunction на своей исходной странице, я бы вызвал ее из всплывающего окна следующим образом:

$(window).unload(function() {
    window.opener.callingPageFunction()
});

Две заметки:

  1. Это должно быть включено в готовую функцию.
  2. У меня есть анонимная функция, потому что вы можете использовать другую логику
3
Powerlord

На данный момент я могу думать только о том, чтобы создать на родительской странице функцию с тайм-аутом, которая вызывает себя через 10 секунд. В функции вы также можете проверить значение файла cookie, чтобы увидеть, является ли оно истинным или ложным. Когда всплывающее окно закрывается, установите для cookie значение true.

Надеюсь это поможет.

0
Ash Burlaczenko

Да, обработайте событие onbeforeUnload для всплывающего окна, а затем вызовите функцию в родительском окне, используя:

window.opener.myFunction()
0
TimS