Захватить событие закрытия всплывающего окна в JavaScript - PullRequest
53 голосов
/ 22 февраля 2012

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

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

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

Как мне этого добиться?

Ответы [ 6 ]

75 голосов
/ 22 февраля 2012

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

var new_window = window.open('some url')
new_window.onbeforeunload = function(){ /* my code */ }
37 голосов
/ 13 января 2018

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

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.

13 голосов
/ 22 февраля 2012

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

5 голосов
/ 22 февраля 2012

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

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

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

1 голос
/ 23 сентября 2014

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

См. Пример в другой теме: https://stackoverflow.com/a/25989253/578275.

0 голосов
/ 17 июля 2017
var new_window = window.open('some_url')

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...