2010-07-20 16 views
53

La pregunta está prácticamente en el título.¿es posible abrir una ventana emergente con javascript y luego detectar cuando el usuario la cierra?

¿Es posible (y cómo?) Abrir una ventana emergente con javascript y luego detectar cuando el usuario la cierra?

Estoy usando jquery dentro del proyecto, por lo que una solución jquery sería buena. ¡Aclamaciones!

+0

¿un navegador emergente? – Reigel

+0

define "pop-up". ¿Estamos hablando de algún tipo de cuadro modal representado en la página? ¿Una alerta de javascript? Una nueva ventana del navegador? –

+1

Una nueva ventana del navegador ... disculpa por mi falta de claridad – Pablo

Respuesta

81

Si usted tiene control sobre el contenido de la ventana emergente, manejar el evento de la ventana unload allí y notificar a la ventana original a través de la propiedad opener , verificando primero si el abridor ha sido cerrado. Tenga en cuenta que esto no siempre funcionará en Opera.

window.onunload = function() { 
    var win = window.opener; 
    if (!win.closed) { 
     win.someFunctionToCallWhenPopUpCloses(); 
    } 
}; 

Dado que el evento unload se disparará cada vez que el usuario salga de la página en la ventana emergente y no sólo cuando la ventana está cerrada, usted debe comprobar que la emergente realidad ha cerrado en someFunctionToCallWhenPopUpCloses:

var popUp = window.open("popup.html", "thePopUp", ""); 
function someFunctionToCallWhenPopUpCloses() { 
    window.setTimeout(function() { 
     if (popUp.closed) { 
      alert("Pop-up definitely closed"); 
     } 
    }, 1); 
} 

Si usted no tiene control sobre el contenido de la ventana emergente, o si uno de los navegadores de destino no admite el evento unload, que está reducido a algún tipo de solución de votación en la ventana principal . Ajuste el intervalo para adaptarse.

var win = window.open("popup.html", "thePopUp", ""); 
var pollTimer = window.setInterval(function() { 
    if (win.closed !== false) { // !== is required for compatibility with Opera 
     window.clearInterval(pollTimer); 
     someFunctionToCallWhenPopUpCloses(); 
    } 
}, 200); 
+2

Recomiendo la solución de sondeo en lugar del evento 'descargar' ya que es compatible con más navegadores (consulte https://opera-bugs.jottit.com/). –

+0

@JonathonHill: De acuerdo. Aludí al problema de Opera al principio de la respuesta, pero debería haberlo dejado en claro. Gracias por la edición. Por cierto, ¿cuál es el motivo para requerir 'window.closed! == false' en Opera? –

+0

Es una solución para un error en Opera. Lo descubrí en https://opera-bugs.jottit.com/. –

0

La única forma en que puedo pensar en este momento es crear una función en tu página principal que tenga un tiempo de espera que se llama a sí mismo después de 10 segundos. En la función también puede verificar el valor de una cookie para ver si es verdadera o falsa. Cuando se cierra la ventana emergente, configure una cookie como verdadera.

Espero que esto ayude.

+0

Ignora esto. El camino de AJM es mucho más fácil. + rep –

4

Intente buscar en los eventos de ventana unload y beforeunload. La supervisión de estos debe darle una oportunidad para volver a llamar cuando el DOM se descarga cuando la ventana está cerrada a través de algo como esto:

var newWin = window.open('/some/url'); 
newWin.onunload = function(){ 
    // DOM unloaded, so the window is likely closed. 
} 
+0

Gracias ajm se ve genial. ¿Hay alguna forma de obtener la url de una ventana emergente por casualidad? – Pablo

+0

Esto no funcionará en el navegador cruzado. Necesita manejar el evento 'download' en la ventana emergente. –

+0

Descargue los incendios con cada solicitud nueva, no solo cuando se cierra la ventana. –

5

Si puede utilizar el jQuery UI Dialog, que en realidad tiene un evento close.

+8

jQuery no es la solución a todos los problemas :). – s4y

+10

cierto, cierto. Debería haber comenzado mi respuesta con la palabra "si" como en "Si puedes usar el diálogo de la interfaz de usuario jQuery" y no solo * supusiste * que fue posible. ¡Oye! Espere un segundo ... – eje211

+3

Y, en lo que respecta a JavaScript, jQuery nunca es realmente una solución a los problemas, pero a menudo es un atajo enorme, enorme, ** ENORME ** para la solución, cualquiera que sea. Aprende más tomando la ruta escénica, pero, en muchos casos, yo y la mayoría de las personas preferimos el acceso directo jQuery (enorme, GRANDE, ** GRANDE **). – eje211

0

Sí, controlar el evento onbeforeunload de la ventana emergente y luego llamar a una función en la ventana padre usando:

window.opener.myFunction() 
3

Para abrir una nueva llamada ventana:

var wnd = window.open("file.html", "youruniqueid", "width=400, height=300"); 

Si lo que desea para saber cuándo se cerrará esa ventana, use onunload.

wnd.onunload = function(){ 
    // do something 
}; 

Si desea una confirmación del usuario antes de que el puede cerrarla, utilice onbeforeunload.

wnd.onbeforeunload = function(){ 
    return "are you sure?"; 
}; 
+1

Esto no funcionará en el navegador cruzado. Debe manejar el evento 'download' en el documento emergente. –

+0

Descargue los incendios con cada nueva solicitud, no solo cuando se cierra la ventana. –

3

Hacemos esto en uno de mis proyectos en el trabajo.

El truco consiste en tener una función JS en la página principal a la que va a llamar cuando se cierre la ventana emergente, luego enganche el evento de descarga en la ventana emergente.

La propiedad window.opener hace referencia a la página que generó esta ventana emergente.

Por ejemplo, si escribía una función llamada callingPageFunction en mi página original, yo diría que es en el menú emergente de esta manera:

$(window).unload(function() { 
    window.opener.callingPageFunction() 
}); 

Dos notas:

  1. Esto debe ser envuelto en una función lista.
  2. que tienen una función anónima, porque es posible que desee otra lógica allí
2

Existe una solución muy simple a su problema.

En primer lugar hacer un nuevo objeto que abrirá una ventana como esta:

var winObj = window.open('http://www.google.com','google','width=800,height=600,status=0,toolbar=0'); 

Con el fin de saber cuando se cierra esta ventana emergente, sólo hay que mantener el control de esto con un bucle como el siguiente:

var loop = setInterval(function() { 
    if(winObj.closed) { 
     clearInterval(loop); 
     alert('closed'); 
    } 
}, 1000); 

Ahora puede reemplazar la alerta con cualquier código de javascript que desee.

Have Fun! :)

Cuestiones relacionadas