Открыть всплывающее окно и обновить родительскую страницу при закрытии всплывающего окна


95

Я открыл всплывающее окно с помощью window.open в JavaScript, я хочу обновить родительскую страницу, когда закрою это всплывающее окно. (Событие onclose?) Как я могу это сделать?

window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");

1
Пожалуйста, проверьте это: stackoverflow.com/questions/18321323/… может кому-то помочь
NoNaMe

Ответы:


233

Вы можете получить доступ к родительскому окну, используя window.opener , поэтому напишите что-то вроде следующего в дочернем окне:

<script>
    window.onunload = refreshParent;
    function refreshParent() {
        window.opener.location.reload();
    }
</script>

Я не знал window.opener, спасибо! Я всегда помещаю окно вызывающего абонента в переменную в contentWindow дочернего элемента. : - /
kay

3
Если вы не контролируете JavaScript на странице ребенка (например , поток OAuth) , то вам нужно будет проверить , popupWindow.closedиспользуя , setIntervalкак в @ растворе Zuul в.
jchook

34

Во всплывающем окне нет события закрытия, которое вы могли бы прослушать.

С другой стороны, есть свойство closed, для которого устанавливается значение true, когда окно закрывается.

Вы можете установить таймер, чтобы проверить это закрытое свойство, и сделать это следующим образом:

var win = window.open('foo.html', 'windowName',"width=200,height=200,scrollbars=no");   
var timer = setInterval(function() {   
    if(win.closed) {  
        clearInterval(timer);  
        alert('closed');  
    }  
}, 1000); 

Посмотрите этот рабочий пример Fiddle !


1
я не хочу использовать таймер! любая другая идея?
ArMaN

1
Немного хакерский, но я думаю, что использование таймера будет лучше всего работать во всех браузерах.
kay

Это также лучшее решение, если во всплывающем окне есть несколько страниц до его закрытия, поскольку событие onunload запускается только после того, как пользователь уйдет с первой страницы.
AntonChanning

14

на своей дочерней странице поместите эти:

<script type="text/javascript">
    function refreshAndClose() {
        window.opener.location.reload(true);
        window.close();
    }
</script>

а также

<body onbeforeunload="refreshAndClose();">

но в качестве хорошего дизайна пользовательского интерфейса вам следует использовать Close, buttonпотому что он более удобен для пользователя. см. код ниже.

<script type="text/javascript">
    $(document).ready(function () {
        $('#btn').click(function () {
            window.opener.location.reload(true);
            window.close();
        });
    });
</script>

<input type='button' id='btn' value='Close' />

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

@gengkev, я знал, что OP хотел привязать событие к закрытию окна, но я считаю, что использование кнопки - лучший дизайн пользовательского интерфейса. однако я включил код для обоих. пожалуйста, порекомендуйте.
Рэй Ченг

Я использовал <body onbeforeunload = "refreshAndClose ();"> <script type = "text / javascript"> функцию refreshAndClose () {window.opener.location.reload (true); } self.close (); </script>
steve0nz

3

Я использую это:

<script language='javascript'>
var t;
function doLoad() {
t = setTimeout("window.close()",1000);
}

</script>
<script type="text/javascript">
function refreshAndClose() {
    window.opener.location.reload(true);
    window.close();
}
</script>
<body onbeforeunload="refreshAndClose();" onLoad='doLoad()''>

когда окно закрывается, обновляет родительское окно.


2

window.open вернет ссылку на вновь созданное окно при условии, что открытый URL-адрес соответствует политике того же происхождения .

Это должно работать:

function windowClose() {
    window.location.reload();
}

var foo = window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
foo.onbeforeunload= windowClose;​

Не сработает, если пользователь сможет переходить по ссылкам в открывшемся окне. И я совершенно уверен, что перед первой загрузкой целевого URL возникает событие выгрузки, поскольку вы неявно оставляете about: blank. (+1 за упоминание СОП)
kay

2

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

window.opener.location.reload();

в дочернем окне вызвало повторное открытие дочернего окна (возможно, из-за состояния просмотра, я думаю. Исправьте меня, если я ошибаюсь). Поэтому я решил не перезагружать страницу в родительском элементе и снова загружать страницу, назначая ей тот же URL-адрес.

Чтобы избежать повторного открытия всплывающего окна после закрытия всплывающего окна, это может помочь,

window.onunload = function(){
    window.opener.location = window.opener.location;};

1

Если ваше приложение работает в браузере с поддержкой HTML5. Вы можете использовать postMessage . Приведенный здесь пример очень похож на ваш.


«В противном случае вы не сможете общаться между собой через разные окна». неправильно. Этот метод все еще возможен, хотя я бы порекомендовал ответ от @Moses
gengkev

-1 удалено. Если вы приведете небольшой пример, вы даже получите +1 ;-)
kay

Ничего. Но я не думаю, что window.opener подходит для IE. Я попробую.
Крис Ли

1
@kay, отлично работает в IE7, 8. Очень хорошо, я этого раньше не знал. +1 для Моисея.
Крис Ли

1
@ArMaN: jsfiddle.net/8c2e4/10 , используйте window.opener. Вы можете использовать это для тестирования своей среды.
Крис Ли

1

Попробуй это

        self.opener.location.reload(); 

Откройте родительский элемент текущего окна и перезагрузите местоположение.


0

Вы можете перейти на главную страницу с помощью родительской команды (родительское окно - это окно) после шага, вы можете сделать все ...

    function funcx() {
        var result = confirm('bla bla bla.!');
        if(result)
            //parent.location.assign("http://localhost:58250/Ekocc/" + document.getElementById('hdnLink').value + "");
            parent.location.assign("http://blabla.com/" + document.getElementById('hdnLink').value + "");
    } 

0

Вы можете использовать приведенный ниже код на родительской странице.

<script>
    window.onunload = refreshParent;
    function refreshParent() {
      window.opener.location.reload();
    }
</script>

0

Следующий код сможет обновить сообщение о закрытии родительского окна:

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.