Закрыть дочернее окно из родительского 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>

3 ответа

Решение

Просто пропустите скобки позади .close()

newWin.onblur = newWin.close;

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

Другой ответ может быть следующим:

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

Никакое решение не работало для меня кроме этого выше одного.

С уважением, Shoaib.

Я получил решение.

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

Вышеупомянутые решения больше не будут работать с доменами с перекрестным происхождением и могут вызвать эту ошибку.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()
 })
Другие вопросы по тегам