Закройте дочернее окно из родительского onblur с помощью Javascript

У меня есть код, который возвращает другую страницу (Google) во всплывающем (дочернем) окне. Я не могу писать код в дочернем окне, поэтому мне приходится делать все от родителя. Я пытаюсь привязать событие onblur от родительского к дочернему окну, чтобы дочернее окно закрывалось после потери фокуса. Однако дочернее окно всплывает на микросекунду и автоматически закрывается.

Я не могу использовать jQuery в среде, над которой работаю.

Вот мой пример кода:

<html>
<head>
</head>

<body>
<input type="button" value="Open Google" onclick="OpenWindow()" />

<script type="text/javascript">

function OpenWindow()
{
    var url="http://www.google.com";

    var newWin=window.open(url, 'Popup','height=500,width=600,left=100,top=100,resizable=yes,scrollbars=no,toolbar=no,status=no');
    newWin.focus();
    newWin.onblur =  newWin.close();    
}
</script>

</body>
</html>

person Jitendra Zaa    schedule 27.07.2012    source источник


Ответы (4)


Просто пропустите круглые скобки после .close()

newWin.onblur = newWin.close;

Вы хотите передать ссылку на функцию, но не хотите присваивать значение, которое возвращается при выполнении .close().

person jAndy    schedule 27.07.2012

Другой ответ может быть таким:

function open_popup() {
                var my_window = window.open("", 'targetWindow', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=750px,height=500px');
                var html = '';
                html = "Muhammad Shoaib Qureshi's New Window Text";
                my_window.document.write(html);
                my_window.focus();
                my_window.onblur = function() {
                    my_window.close();
                };
            }

Для меня не работало ни одно решение, кроме указанного выше.

С уважением, Шоаиб.

person M Shoaib Qureshi    schedule 02.11.2013

У меня есть решение.

Используйте "window.top.close ();"

person Jitendra Zaa    schedule 08.08.2012

Вышеупомянутые решения больше не будут работать с доменами с перекрестным происхождением и могут вызвать эту ошибку Blocked a frame with origin "https://example.com" from accessing a cross-origin frame.

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

 let url = "https://example.com";
 let frame = window.open(url, "Popup", "height=500,width=600,left=100,top=100,resizable=yes,scrollbars=no,toolbar=no,status=no");
 window.addEventListener('focus', (e) => {
     if (!frame.closed) frame.close()
 })
person Jack Rogers    schedule 13.08.2020