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

Захват события закрытия всплывающего окна в JavaScript

Мне нужно выполнить какое-либо действие перед закрытием всплывающего окна (с помощью window.open).

Что-то вроде хорошего будет:

var new_window = window.open('some url')
new_window.onBeforeUnload = function(){ my code}

Как я могу это достичь?

4b9b3361

Ответ 1

Ваш пример будет работать до тех пор, пока URL всплывающего окна находится в том же домене, что и родительская страница, и вы измените событие на все строчные:

var new_window = window.open('some url')
new_window.onbeforeunload = function(){ /* my code */ }

Ответ 2

В то время как принятый ответ является правильным для тех же самых источников, я нашел решение для всплывающих окон перекрестного происхождения:

var win = window.open('http://www.google.com'); 
var timer = setInterval(function() { 
    if(win.closed) {
        clearInterval(timer);
        alert('closed');
    }
}, 1000);

Источник: atashbahar.com

Для тех, кто рассматривает возможность его использования.

Даже Facebook использует этот "хак" в своем Javascript SDK.

Вы можете убедиться в этом, посмотрев на их код. Просто найдите .closed в https://connect.facebook.net/en_US/sdk.js.

Ответ 3

Имя события onbeforeunload, а не onbeforeunload. JS чувствителен к регистру.

Ответ 4

Вам нужно привязать событие onbeforeunload к окну ПОСЛЕ его открытия.

Самый простой способ сделать это - иметь код javascript onbeforeunload в исходном коде окна.

Подробные объяснения см. в этих двух очень похожих вопросах здесь и здесь в Stackoverflow.

Ответ 5

Как указано выше, вам нужно привязать событие onbeforeunload к окну после его открытия.

См. пример в другом потоке: fooobar.com/questions/155057/....

Ответ 6

var new_window = window.open('some_url')

Вы также можете проверить, есть ли new_window.window null. Но вам нужно вручную проверить его с помощью функций setTimeout или setInterval.

Это единственный способ проверить, когда вы не находитесь в одном домене.