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


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>

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 !


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' />

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.


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

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

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.


"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.


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 + "");
    } 

0

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

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

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();
                }
            };
        }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.