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


вопрос в значительной степени все в названии.

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

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

8 58

8 ответов:

если у вас есть контроль над содержимым всплывающего окна, ручка окна 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);

Если вы можете использовать jQuery UI Dialog, это close событие.

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

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

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

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?";
};

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

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

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

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

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

два замечания:

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

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

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

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

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

Удачи! :)

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

надеюсь, что это помогает.

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

window.opener.myFunction()