Закрытие всплывающего окна, когда оно теряет фокус

#javascript

#javascript

Вопрос:

Мне интересно, можно ли создать всплывающее окно с помощью javascript, а затем закрыть это окно, когда оно потеряет фокус.

Вот мой код:

     var theWindow;


function launchWindow() {
            theWindow=window.open('www.domain.com');

          theWindow.onblur = function() {
                this.close();
        };
}
 

Но это вообще не работает. Есть какие-нибудь предложения?

РЕДАКТИРОВАТЬ: я нашел решение, которое работает для меня, надеюсь, оно будет работать для кого-то другого:

 var theWindow;
var windows = [];


function launchWindow() {
            theWindow=window.open('www.domain.com');

            windows.push(theWindow);

            window.onfocus = function() {
                for (x in windows) {
                    windows[x].close();
                }
            };
}
 

Это не точное решение моей первоначальной проблемы (оно не закрывает окно, когда оно теряет фокус, а скорее закрывает его, когда главное окно восстанавливает фокус), но это работает для меня.

Ответ №1:

Является ли URL-адрес всплывающего окна из того же домена, что и родительский? В противном случае вы, вероятно, не сможете прикрепить событие к событию onblur нового окна.

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

 var theWindow = window.open ("http://www.stackoverflow.com","theWindow");
theWindow.onblur = function() { this.close(); };
 

Комментарии:

1. Я пробовал именно это, на самом деле, всего минуту назад, и у меня это не сработало. Тем не менее, я нашел хорошее решение и опубликовал его как редактирование исходного вопроса. Спасибо за вашу помощь.

Ответ №2:

window не имеет onblur события

Попробуйте вызвать его закрытие, сосредоточив внимание на <body> главном окне

Комментарии:

1. Правильно. Но это доступно не во всех браузерах.

Ответ №3:

Проблема, с которой вы можете столкнуться, заключается в том, что вы привязываете onblur обработчик до того, как окно начнет загружать страницу. Как только страница загружена, ваш onblur обработчик исчез. Вам нужно будет отложить привязку достаточно долго, чтобы дать странице возможность начать загрузку, прежде чем привязывать ваш обработчик событий:

 function launchWindow() { 
    var theWindow = window.open('www.domain.com'); 
    setTimeout(function() {
        theWindow.onblur = function() { 
            this.close();
        };
    }, 2000); 
} 
 

Если вы загружаете страницу в другом домене, вы вообще не сможете привязать onblur обработчик. Вам нужно будет придерживаться своего решения, используя onfocus .

Комментарии:

1. Нет, дело не в этом! Он не присоединяет событие в IE8 даже с таймаутом! Тот же домен. В IE9 он работает без тайм-аута.