2009-07-10 12 views
9

He hecho esta pregunta antes y el problema estaba medio resuelto en el sentido en que me ayudaron a descubrir que Javascript tiene una seguridad muy estricta.¿Cómo ejecutar la función de la ventana primaria cuando se cierra la ventana secundaria?

Lo que aprendí: Una ventana principal abre una ventana secundaria. La ventana secundaria redirige a un dominio diferente y recibe una redirección. Intenta desencadenar una función de la ventana primaria al cerrarse.

window.opener.startLoad(); 

Esto genera un problema de permisos (seguridad) y no funciona.

(Medio) Nuevo problema: ¿Cómo puedo obtener una ventana para abrir una ventana secundaria y cuando se cierra ejecuta una función en la ventana principal?

Necesito una forma muy eficiente de hacerlo ya que esto va a pasar mucho!

Gracias por cualquier ayuda.

+0

En respuesta a su último comentario sobre mi respuesta, me temo que no puedo pensar en una razón por la que no llamaría a la función cuando se cierre la ventana. ¿Podría publicar su código donde abre la ventana y la función a la que está tratando de llamar cuando se cierra? Es posible que pueda ayudarte más, pero ahora estoy sin ideas. – Sean

Respuesta

19

Prueba esto:

var win = window.open(url, name); 
win.onunload = afterChildClose; // afterChildClose() is the function. 
win.close(); // afterChildClose() should fire now. 

Todo este código se encuentra y ejecutado en JavaScript de la ventana padre (incluyendo afterChildClose()). Está creando la ventana y asignando la función al evento de descarga.

Oh, una cosa en la que he pensado. Si la ventana secundaria se actualiza o navega a otra url, el evento onunload se activará también. Si solo desea que el evento se active cuando la ventana esté cerrada, debe incluir un check in después de ChildClose() en win.closed.

EDITAR: Aquí está el código de dos páginas de muestra que reuní para probar esto.

Ventana padre:

<html> 
<body> 
<script type="text/javascript"> 
    var win = window.open("secondwindow.html", "woo"); 
    win.onunload =onun; 

    function onun() { 
     if(win.location != "about:blank") // This is so that the function 
              // doesn't do anything when the 
              // window is first opened. 
     { 
      alert("closed"); 
     } 
    } 
</script> 
</body> 
</html> 

ventana secundaria ("secondwindow.html"):

<html> 
<body> 
<script type="text/javascript"> 
    setTimeout('window.close();', 5000); 
</script> 
</body> 
</html> 

Cuando intento abrir el primer documento en Firefox, se abre la ventana, la ventana de espera 5 segundos y se cierra, y el primer documento muestra la alerta(), por lo que está funcionando incluso cuando la ventana secundaria se cierra.

+0

¿Dónde reside la función afterChildClose? – Abs

+0

¿Estás cerrando la ventana Child desde la ventana principal? – Abs

+0

Sí, el 'win.close()' está ahí para demostrar lo que sucederá cuando se cierre la ventana secundaria. El código en mi respuesta no es su solución completa, simplemente muestra la técnica que le permitirá hacer lo que necesita.Esa técnica consiste en capturar el objeto de ventana hijo después de abrirlo, y luego asignar eventos a ese objeto (como onunload). – Sean

2

Aterricé aquí buscando una funcionalidad similar, pero nunca conseguí que funcionase con la compatibilidad entre navegadores. Así que aquí es otra manera de ejecutar código como se cierra una ventana secundaria:

var win = window.open("http://www.google.com"); 

var winClosed = setInterval(function() { 

    if (win.closed) { 
     clearInterval(winClosed); 
     location.assign("http://www.bing.com/"); //Execute your code here 
    } 

}, 250); 

que no utiliza cualquier controlador de eventos de la ventana secundaria, y no tiene que modificar el contenido de la ventana secundaria.

Cuestiones relacionadas