Abrir ventana emergente y actualizar la página principal al cerrar la ventana emergente


94

Abrí una ventana emergente por window.open en JavaScript, quiero actualizar la página principal cuando cierro esta ventana emergente. (¿Evento de cierre?) ¿Cómo puedo hacer eso?

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

1
Compruebe esto: stackoverflow.com/questions/18321323/… podría ayudar a alguien
NoNaMe

Respuestas:


231

Puede acceder a la ventana principal usando ' window.opener ', por lo tanto, escriba algo como lo siguiente en la ventana secundaria:

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

No conocía window.opener, ¡gracias! Siempre coloco la ventana de la persona que llama en una variable en la ventana de contenido del niño. : - /
kay

3
Si no controla JavaScript en la página secundaria (por ejemplo, el flujo de OAuth), deberá verificar popupWindow.closedusando setIntervalcomo en la solución de @ Zuul.
jchook

34

La ventana emergente no tiene ningún evento de cierre que pueda escuchar.

Por otro lado, hay una propiedad cerrada que se establece en verdadera cuando se cierra la ventana.

Puede configurar un temporizador para verificar esa propiedad cerrada y hacerlo así:

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

¡Vea este ejemplo funcional de Fiddle !


1
¡No quiero usar el temporizador! alguna otra idea?
ARMAN

1
Algo pirateado, pero creo que usar un temporizador funcionará mejor en todos los navegadores.
kay

Esta también es la mejor solución si la ventana emergente tiene varias páginas antes de cerrarse, ya que el evento onunload se activa solo después de que el usuario navega fuera de la primera página.
AntonChanning

14

en la página de su hijo, ponga estos:

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

y

<body onbeforeunload="refreshAndClose();">

pero como un buen diseño de interfaz de usuario, debe usar un cierre buttonporque es más fácil de usar. ver código a continuación.

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

cuando la ventana emergente está cerrada, no cuando el usuario hace clic en un botón para actualizar la página y cerrar la ventana emergente
gengkev

@gengkev, sabía que OP quería adjuntar el evento al cierre de la ventana, pero creo que usar un botón es un mejor diseño de interfaz de usuario. sin embargo, incluí código para ambos. por favor avise.
Ray Cheng

Usé <body onbeforeunload = "refreshAndClose ();"> <script type = "text / javascript"> función refreshAndClose () {window.opener.location.reload (true); } self.close (); </script>
steve0nz

3

Yo uso esto:

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

cuando la ventana se cierra, actualiza la ventana principal.


2

window.open devolverá una referencia a la ventana recién creada, siempre que la URL abierta cumpla con la Política del mismo origen .

Esto debería funcionar:

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

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

No funcionará si el usuario podrá seguir los enlaces en la ventana abierta. Y estoy bastante seguro de que se lanza un evento de descarga antes de que se cargue por primera vez la URL de destino, ya que implícitamente deja about: en blanco. (+1 por mencionar SOP)
kay

2

En mi caso, abrí una ventana emergente al hacer clic en el botón de enlace en la página principal. Para actualizar a los padres sobre el cierre del niño usando

window.opener.location.reload();

en la ventana secundaria provocó que se volviera a abrir la ventana secundaria (podría ser debido al estado de vista, supongo. Corrígeme si me equivoco). Así que decidí no volver a cargar la página en el padre y cargar la página nuevamente asignándole la misma URL.

Para evitar que la ventana emergente se abra nuevamente después de cerrar la ventana emergente, esto podría ayudar,

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

1

Si su aplicación se ejecuta en un navegador compatible con HTML5. Puede utilizar postMessage . El ejemplo que se da allí es bastante similar al suyo.


"De lo contrario, no podrá comunicarse entre distintas ventanas". Está Mal. La técnica aún es posible, aunque recomendaría la respuesta de @Moses
gengkev

-1 eliminado. Si das un pequeño ejemplo, incluso obtendrás un +1 ;-)
kay

No importa. Pero no creo que window.opener esté bien para IE. Lo intentaré.
Chris Li

1
@kay, funciona muy bien en IE7, 8. Muy bien, no lo sabía antes. +1 para Moisés.
Chris Li

1
@ArMaN: jsfiddle.net/8c2e4/10 , use window.opener. Puede usar esto para probar su entorno.
Chris Li

1

Prueba esto

        self.opener.location.reload(); 

Abra el padre de una ventana actual y vuelva a cargar la ubicación.


0

Puede acceder a la página principal con el comando principal (el padre es la ventana) después del paso, puede hacer todo ...

    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

Puede utilizar el siguiente código en la página principal.

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

0

El siguiente código logrará actualizar el cierre de la publicación de la ventana principal:

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.