Abra o pop-up e atualize a página principal ao fechar o pop-up

93

Abri uma janela pop-up por window.open em JavaScript, quero atualizar a página pai quando fechar esta janela pop-up. (Evento onclose?) Como posso fazer isso?

window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
ArMaN
fonte
1
Verifique isto: stackoverflow.com/questions/18321323/… pode ajudar alguém
NoNaMe

Respostas:

230

Você pode acessar a janela principal usando ' window.opener ', então, escreva algo como o seguinte na janela secundária:

<script>
    window.onunload = refreshParent;
    function refreshParent() {
        window.opener.location.reload();
    }
</script>
Morrison Cole
fonte
Eu não conhecia window.opener, obrigado! Sempre coloco a janela do chamador em uma variável na contentWindow da criança. : - /
kay - SE é mau
3
Se você não controlar o JavaScript na página filha (por exemplo, fluxo OAuth), será necessário verificar popupWindow.closedusando setIntervala solução do @Zuul.
jchook
34

A janela pop-up não possui nenhum evento de fechamento que você possa ouvir.

Por outro lado, existe uma propriedade fechada que é definida como true quando a janela é fechada.

Você pode definir um cronômetro para verificar essa propriedade fechada e fazer assim:

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

Veja este exemplo funcional do Fiddle !

Zuul
fonte
1
eu não quero usar o cronômetro! alguma outra ideia?
ArMaN
1
Um tanto hackeado, mas acho que usar um cronômetro funcionará melhor em todos os navegadores.
ok - SE é mau
Essa também é a melhor solução se o pop-up tiver várias páginas antes de fechar, já que o evento onunload é disparado somente depois que o usuário sai da primeira página.
AntonChanning de
14

na página do seu filho, coloque estes:

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

e

<body onbeforeunload="refreshAndClose();">

mas como um bom design de IU, você deve usar um Close buttonporque é mais amigável. veja o código abaixo.

<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' />
Ray Cheng
fonte
quando a janela pop-up é fechada, não quando o usuário clica em um botão para atualizar a página e fechar a janela pop-up
gengkev
@gengkev, eu sabia que o OP queria anexar o evento ao fechamento da janela, mas acredito que usar um botão é um design de IU melhor. no entanto, incluí código para ambos. Por favor informar.
Ray Cheng
Usei a <body onbeforeunload = "refreshAndClose ();"> <script type = "text / javascript"> função refreshAndClose () {window.opener.location.reload (true); } self.close (); </script>
steve0nz
3

Eu uso isso:

<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()''>

quando a janela é fechada, ela atualiza a janela pai.

Patrick Kershner
fonte
2

window.open retornará uma referência à janela recém-criada, desde que a URL aberta esteja em conformidade com a Política de Mesma Origem .

Isso deve funcionar:

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

var foo = window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
foo.onbeforeunload= windowClose;​
cranz
fonte
Não funcionará se o usuário for capaz de seguir os links na janela aberta. E tenho certeza de que um evento de descarregamento é lançado antes que o URL de destino seja carregado pela primeira vez, conforme você deixa implicitamente about: blank. (+1 por mencionar o SOP)
ok - SE é o mal
2

No meu caso, abri uma janela pop-up clicando no botão do link na página principal. Para atualizar o pai ao fechar o filho usando

window.opener.location.reload();

na janela secundária, a janela secundária foi reaberta (pode ser devido ao estado de exibição, eu acho. Corrija-me se eu estiver errado). Portanto, decidi não recarregar a página no pai e carregar a página novamente atribuindo o mesmo url a ela.

Para evitar que o pop-up abra novamente após fechar a janela pop-up, isso pode ajudar,

window.onunload = function(){
    window.opener.location = window.opener.location;};
Jitendra Sawant
fonte
1

Se o seu aplicativo for executado em um navegador habilitado para HTML5. Você pode usar postMessage . O exemplo dado aqui é bastante semelhante ao seu.

Chris Li
fonte
"Caso contrário, você não pode se comunicar entre janelas diferentes." está errado. A técnica ainda é possível, embora eu recomende a resposta de @Moses
gengkev
-1 removido. Se você der um pequeno exemplo, receberá até +1 ;-)
kay - SE is evil
Deixa pra lá. Mas não acho que window.opener seja adequado para o IE. Vou tentar.
Chris Li
1
@kay, funciona muito bem no IE7, 8. Muito bom, eu não sabia disso antes. 1 para Moisés.
Chris Li
1
@ArMaN: jsfiddle.net/8c2e4/10 , use window.opener. Você pode usar isso para testar seu ambiente.
Chris Li
1

Tente isto

        self.opener.location.reload(); 

Abra o pai de uma janela atual e recarregue o local.

nmkyuppie
fonte
0

Você pode chegar à página principal com o comando pai (pai é a janela) após a etapa, você pode fazer tudo ...

    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 + "");
    } 
Hamit YILDIRIM
fonte
0

Você pode usar o código abaixo na página pai.

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

O código a seguir conseguirá atualizar o fechamento da janela pai:

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
UJS
fonte