2008-09-26 17 views
12

Quiero plantear un evento cuando se cierra una ventana emergente, o preferiblemente, justo antes del cierre. Estoy almacenando el objeto de la ventana emergente como un objeto, pero no conozco ninguna forma de enlazar al evento de cierre, o un evento justo antes de que se cierre la ventana.¿Cómo puedo plantear un evento (jQuery o Javascript vainilla) cuando se cierra una ventana emergente?

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780"); 

¿Hay alguna forma de suscribirse al evento close utilizando jQuery, o simplemente javascript en bruto? Estoy usando jQuery y no puedo agregar otra biblioteca, así que si no se puede hacer en jQuery tendré que implementar mi propio sistema de eventos de alguna manera para que funcione en todos los navegadores.

ACTUALIZACIÓN:
He intentado usar el evento de descarga en jQuery y por alguna razón el evento se produce tan pronto como mi emergente se abre en lugar de cuando está cerrado. Si utilizo Firebug para configurar un punto de interrupción para retrasar el evento de descarga de la suscripción, el evento de descarga funciona de la manera que se supone, pero por alguna razón, no funciona correctamente cuando se permite que el javascript se ejecute de forma natural.

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780"); 
$(popupWindow.window).unload(function() { alert('hello'); }); 

¿Alguien tiene alguna idea de por qué el evento de descarga podría aumentar cuando se carga la ventana?

Otro problema es que me he dado cuenta de ese evento "descarga" de jQuery no se queda suscrito a la ventana como lo hace normalmente, si acabo de hacer:

popupWindow.onunload = function(){alert('hello')}; 

Parece darse de baja del evento cada tiempo que se levanta. Se supone que pase esto? Si no fuera por este error (¿o función?) En jQuery, sería mejor tener el evento levantado en carga ya que puedo verificar la propiedad popupWindow.closed dentro del evento para asegurar que la ventana realmente se cerró.

Respuesta

2

El ejemplo de código jQuery para el evento de descarga

$(window).unload(function() { alert("Bye now!"); });

Desde el jQuery unload documentation

Editar:

He jugado un poco y no era capaz de conseguir que el padre ventana para poder configurar la descarga. La única forma en que podía hacer que funcionara, era tener el script presente en la ventana emergente html. La ventana emergente también necesitaba cargar jQuery. No tengo nada basado en esto, pero creo que la descarga se está desencadenando, porque esencialmente la ventana emergente se está descargando desde el alcance de la ventana principal. Solo una suposición.

0

Hay una pequeña captura tengo que mencionar en relación con el anterior menciones de onunload basado en mi experiencia anterior:

Opera 9.0.x-9.2.x sólo se ejecuta window.onunload si el usuario salga de una página. Si el usuario cierra la ventana, el evento nunca se disparará.Sospecho que esto se hizo para combatir el problema emergente de autorrecarga (donde una ventana emergente podría reabrirse al cerrar la página).

Esto probablemente persistió en Opera 9.5.x. Otros navegadores también pueden implementar esto, pero no creo que IE o Firefox lo hagan.

0

Por lo que he comprobado, la descarga de jQuery es solo un contenedor para la función nativa. Podría estar equivocado ya que no cavé tan profundo.

Este ejemplo funcionó para mí.

$(document).ready(function(){ 
    $(window).unload(function(){ 
     alert('preget'); 
     $.get(
      '/some.php', 
      { request: 'some' } 
     ); 
     alert('postget'); 
    }); 
}); 

Recuerde que algunos browsers block the window.open requests on unload, IE for example.

18

he creado un observador que comprueba si la ventana se ha cerrado:

var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true); 
var watchClose = setInterval(function() { 
    if (w.closed) { 
    clearTimeout(watchClose); 
    //Do something here... 
    } 
}, 200); 
+0

Grande, esto solucionó mi problema;) –

7

Probé el enfoque vigilante pero se encontró en el "permiso denegado" problema durante el uso de este en IE6. Esto sucede debido a la propiedad cerrada no ser totalmente accesible en todo caso de cierre de la ventana ... pero afortunadamente con un try {} la construcción de captura funciona aunque: o)

var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true); 

var watchClose = setInterval(function() { 
    try { 
     if (w.closed) { 
      clearTimeout(watchClose); 
      //Do something here... 
     } 
    } catch (e) {} 
}, 200); 

Gracias Magnus

3

Creo que descubrí lo que está sucediendo:

Cuando usa window.open, abre una nueva ventana con la ubicación "sobre: ​​en blanco" y luego lo cambia a la url que proporcionó en la llamada a la función.

Por lo tanto, el evento de descarga está vinculado antes del cambio de "aproximadamente: en blanco" a la url derecha y se activa cuando ocurre el cambio.

lo tengo trabajando con jQuery hacer esto:

$(function(){ 
    var win = window.open('http://url-at-same-domain.com','Test', 'width=600,height=500'); 
    $(win).unload(function(){ 
     if(this.location == 'about:blank') 
     { 
      $(this).unload(function(){ 
       // do something here 
      }); 
     } 
    }); 
}); 
Cuestiones relacionadas