2010-09-23 12 views
18

Así que quiero almacenar cierta información en el almacenamiento local de un navegador cuando la página se actualiza o el usuario sale de la página para usarla en el futuro. Pensé que usaría algo de Javascript para detectar el evento y almacenar el estado de la visita de la página.Pregunta JavaScript: ¿Antes de descargar o Onunload?

Ahora mi problema es: ¿debo usar el método Onbeforeunload o Onunload para lograr este objetivo?

Gracias

+0

ver el apoyo del navegador de 'onbeforeunload' WindowEventHandler en https://developer.mozilla.org/en-US/docs/WindowEventHandlers.onbeforeunload#Browser_compatibility –

+0

ver el soporte de navegador de 'onunload' WindowEventHandler en https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers.onunload#Browser_compatibility (Tenga en cuenta que las versiones del navegador no se especifican en este documento) –

+0

http://stackoverflow.com/questions/158673/onbeforeunload-support-detection relacionada –

Respuesta

20

Por qué no registrar con tanto sólo para estar en el lado seguro? Simplemente haga que el oyente verifique si los datos están almacenados y salga temprano.

Aquí está un ejemplo rápido usando las propiedades de evento:

window.onunload = window.onbeforeunload = (function(){ 

    var didMyThingYet=false; 

    return function(){ 
    if (didMyThingYet) return; 
    didMyThingYet=true; 
    // do your thing here... 
    } 

}()); 

o puede utilizar attachEvent:

(function(){ 

    var didMyThingYet=false; 

    function listener(){ 
    if (didMyThingYet) return; 
    didMyThingYet=true; 
    // do your thing here... 
    } 

    window.attachEvent("onbeforeunload", listener); 
    window.attachEvent("onunload", listener);  

}()); 
+1

Eso suena como una idea factible para cubrir todas las bases. Sería grandioso si pudieras indicarme un fragmento o un recurso en cuanto al oyente del evento y salir temprano. – pratyk

+0

gracias por el fragmento. Lo probé en Windows y mac os Chrome/Firefox y parecía cubrir todas las bases. Un poco más de pruebas para Opera e IE9 beta deberían ponerme en funcionamiento. – pratyk

0

creo que onbeforeunload es una apuesta segura. Es posible que el navegador no ejecute el script de descarga por completo; por ejemplo, si tiene una alerta en onunload, Chrome no se mostrará si cierra la ventana.

+3

Probé Chrome v. 5 y 6 en Mac OS X y alerta en OnUnload. Ojalá hubiera una matriz/gráfico que enumerara el soporte de DOM para cada navegador. Gracias. – pratyk

8

El lugar adecuado para hacerlo es onUnload. onbeforenload está destinado a ser utilizado cuando es posible que deba evitar que el usuario abandone la página, como cuando hay datos no guardados.

Me cansaría de escribir código para cubrir todos los casos porque no está dispuesto a probar todos los casos. Si investigas y descubres que es demasiado complicado en todos los buscadores, sí, adelante y haz todo lo que puedas. Sin embargo, creo que no hay problema con el almacenamiento local en la descarga. De hecho, me encontré con un problema, tratando de enviar información al servidor onunload. Eso no ocurrió de manera confiable en todos los navegadores, así que terminé con un enfoque que utilizaba descarga y descarga previa, pero solo después de la debida diligencia.

Así que mi sugerencia es hacerlo onunload, comprobar todos sus navegadores.

+0

+1 Lo intenté con ambos y Chrome genera un diálogo desagradable con 'onbeforeunload' si llama a 'indexedDB.deleteDatabase' dentro de él, pero está feliz de hacer la misma llamada dentro de' onunload'. –

0

Desde mi experiencia: use onunload ya que Opera no es compatible con el otro evento. Sí, lo sé ... Opera ... pero aún así :)

+0

Actualización: Opera usa V8 ahora :) –

Cuestiones relacionadas