2012-06-24 16 views
5

¿Existe tal cosa?Evento de Javascript que se ejecuta antes de que la página cambie

Sé que puedo conectar mi función en el evento de clic de todos los enlaces, pero hay otras situaciones en las que se cambia una página, como refresco o cuando un guión diferente cambia la window.location


al final, lo hice mediante el envío de una cadena de postMessage a través del evento de descarga, así:

$(window).bind('unload', function(e){ 
    window.parent.postMessage('unloading'); 
}); 

en el documento principal:

$(window).bind('message', function(e){  
    if(e.originalEvent.data == 'unloading'){ 
    // ajax stuff here 
    } 
}); 

Parece que funciona. Probablemente debería haber mencionado que hay un iframe involucrado :)

+0

Will en la página dispuesto no funciona? –

+0

pero no funciona después de que la página se carga? Lo necesito antes para poder lanzar una solicitud de ajax y actualizar algunas cosas, luego cargar la página – Alex

+0

No se puede confiar en la capacidad de hacer algo antes de que una página se descargue. El usuario podría, por ejemplo, cerrar la computadora abruptamente. – Pointy

Respuesta

16

Está el beforeunload event, que se dispara cuando la página se está derribando (para seguir un enlace, o si la ventana se está cerrando, o actualizar, etc. .). Ejemplo:

window.onbeforeunload = function(event) { 
    var s = "You have unsaved changes. Really leave?"; 

    event = event || window.event; 
    if (event) { 
     // This is for IE 
     event.returnValue = s; 
    } 

    // This is for all other browsers 
    return s; 
} 

Hay, por razones obvias, muy estrictos límites a lo que puede hacer en el controlador del evento beforeunload, y como se puede ver arriba beforeunload manipuladores tienen una firma diferente de controladores de eventos normales. Básicamente, su código no puede hacer nada asincrónico, no puede abrir ventanas nuevas y no puede cancelar el evento. Es puede devolver una cadena, y si lo hace, el navegador abrirá una ventana que le preguntará si realmente desea abandonar la página e incluir su cadena en esa ventana emergente.

Desde su comentario sobre la cuestión:

lo necesito antes, así que puede disparar una petición Ajax y actualizar algunas cosas ...

Cuando la página está siendo demolido, se Por lo general, puede salirse con la llamada síncrona ajax (async: false) siempre que no tarde demasiado. Esta no es una gran idea y recomiendo evitarla si puede (por ejemplo, con guardados provisionales), ya que, entre otras cosas, introduce un retraso al cerrar la página. Pero si realiza la llamada de forma sincrónica (en lugar de la llamada asincrónica predeterminada y muy preferida), generalmente el navegador le permitirá hacerlo. Por supuesto, no sirve de nada si el navegador termina abruptamente (bloqueos, cierre forzado por parte del usuario, etc.).

Tenga en cuenta que async marca is being deprecated and removed de jQuery (ticket). Creo que planean desaprobarlo en 1.8 y eliminarlo realmente en 1.9, pero no es hiper-claro desde la publicación del blog y el ticket.

+0

Uso de ajax síncrono en el evento me ha funcionado (nunca va ** nunca ** use sync ajax: D) – Esailija

+0

@Esailija: sí, es uno de los pocos casos de uso para ajax síncrono (aunque presenta un retraso como ese no es) t gran UX). Como dije, no puedes hacer nada * asincrónico *. –

+0

no estoy seguro de cuál es la diferencia entre async vs sync? – Alex

1

Cuando se vuelve a cargar una página, lo que haya antes se habrá ido. Por lo tanto, parece que lo que estás diciendo es algo que harías en DOMReady o "carga" en la nueva página , ya que no puedes "empujar" el código de la página anterior al nuevo contexto.

+0

@Somebodyisintrouble el valor hash no es realmente parte de la página; es parte de la URL, y solo se transfiere si la nueva URL usa el mismo hash. Si está en 'http: // foo.bar.com/xyz # hello' y hace clic en un enlace a' http: // cnn.com/international', el antiguo valor de hash no estará disponible en el nuevo página. – Pointy

+0

@Somebodyisintrouble no hay mención de eso de una manera u otra en la pregunta. – Pointy

+0

no. Si el enlace va a otro dominio, no me importa si mi solicitud de ajax no se activa. Solo necesito actualizar algunas cosas (temporales), que se usan en la página siguiente del mismo sitio. – Alex

4

jQuery tiene unload función:

El evento de descarga se envía al elemento de ventana cuando el usuario navega fuera de la página. Esto podría significar una de muchas cosas.El usuario podría hacer clic en un enlace para salir de la página o escribir una nueva URL en la barra de direcciones . Los botones de avance y retroceso activarán el evento. Al cerrar la ventana del navegador, se desencadenará el evento. Incluso una página de recarga creará primero un evento de descarga.

Tenga en cuenta que esto se debe a binded window objeto en lugar de document:

$(window).unload(function() { 
    // do something 
}); 

También puede unirse a beforeunload manejador de eventos:

$(window).bind('beforeunload', function() { 
    // do something, preferably ajax request etc 
    return 'are you sure?'; 
}); 
+0

Los comentarios en esa página de documentación de jQuery sugieren que este evento podría no funcionar de manera confiable. – Pointy

+0

hm .. en Chrome aparece un error en la consola: alerta bloqueada ('descarga ...') durante la descarga. – Alex

+0

He editado mi publicación. He probado esto en Chrome. – Zbigniew

Cuestiones relacionadas