Mi caso: localStorage con clave + valor que debe eliminarse cuando se cierra el navegador y no una sola pestaña.
Consulte mi código si es correcto y qué se puede mejorar:
//create localStorage key + value if not exist
if(localStorage){
localStorage.myPageDataArr={"name"=>"Dan","lastname"=>"Bonny"};
}
//when browser closed - psedocode
$(window).unload(function(){
localStorage.myPageDataArr=undefined;
});
javascript
jquery
html
local-storage
Yosef
fuente
fuente
undefined
sobrescribiría el elemento almacenado anteriormente. Pero sí, usar.removeItem()
es más apropiado.localStorage.clear();
si desea borrar todo el almacenamiento.Respuestas:
debe hacerse así y no con el operador de eliminación:
fuente
delete localStorage.key
funciona tan bien comolocalStorage.removeItem(key)
. Me parece más claro usar eliminar cuando configuro mis variables como enlocalStorage.key = 1
lugar delocalStorage.setItem('key', 1)
.localStorage.removeItem = null;
, haciendolocalStorage.removeItem(key);
una idea potencialmente pobre.localStorage.key = 1
en primer lugar, para evitar este tipo de accidentesUsar con
window
palabra clave global: -fuente
localStorage.removeItem(key)
funciona bien.Puede hacer uso del
beforeunload
evento en JavaScript.Usando JavaScript vainilla podría hacer algo como:
Eso eliminará la clave antes de cerrar la ventana / pestaña del navegador y le pedirá que confirme la acción de cerrar la ventana / pestaña. Espero que eso resuelva tu problema.
NOTA: El
onbeforeunload
método debería devolver una cadena.fuente
En su lugar, debe usar sessionStorage si desea que la clave se elimine cuando se cierre el navegador.
fuente
sessionStorage
es el remedio para lo que describe el autor de la pregunta.sessionStorage
, pero el Borrador del Editor del W3C dice: "La vida útil de un contexto de navegación puede no estar relacionada con la vida útil del proceso del agente de usuario en sí mismo, ya que el agente de usuario puede admitir la reanudación de sesiones después de un reinicio".Intenta usar
Espero que esto funcione para usted
fuente
localStorage.clear();
Hay un caso de uso muy específico en el que cualquier sugerencia de usar sessionStorage en lugar de localStorage realmente no ayuda. El caso de uso sería algo tan simple como tener algo almacenado mientras tiene al menos una pestaña abierta, pero invalidarlo si cierra la última pestaña restante. Si necesita que sus valores se guarden en tablas y ventanas, sessionStorage no lo ayudará a menos que le complique la vida a los oyentes, como lo he intentado. Mientras tanto, localStorage sería perfecto para esto, pero hace el trabajo "demasiado bien", ya que sus datos estarán esperando allí incluso después de reiniciar el navegador. Terminé usando un código personalizado y una lógica que aprovecha ambos.
Prefiero explicar y luego dar el código. Primero almacene lo que necesita en localStorage, luego también en localStorage cree un contador que contendrá el número de pestañas que ha abierto. Esto aumentará cada vez que se cargue la página y disminuirá cada vez que la página se descargue. Puede elegir aquí los eventos que usará, sugeriría 'cargar' y 'descargar'. En el momento de la descarga, debe realizar las tareas de limpieza que le gustaría cuando el contador llegue a 0, lo que significa que está cerrando la última pestaña. Aquí viene la parte difícil: no he encontrado una forma confiable y genérica de diferenciar entre una recarga de página o navegación dentro de la página y el cierre de la pestaña. Entonces, si los datos que almacena no son algo que puede reconstruir en la carga después de verificar que esta es su primera pestaña, entonces no puede eliminarlo en cada actualización. En su lugar, debe almacenar un indicador en sessionStorage en cada carga antes de aumentar el contador de pestañas. Antes de almacenar este valor, puede hacer una verificación para ver si ya tiene un valor y si no lo tiene, esto significa que está cargando en esta sesión por primera vez, lo que significa que puede hacer la limpieza en la carga si esto el valor no está establecido y el contador es 0.
fuente
usar sessionStorage
El objeto sessionStorage es igual al objeto localStorage, excepto que almacena los datos para una sola sesión. Los datos se eliminan cuando el usuario cierra la ventana del navegador.
El siguiente ejemplo cuenta la cantidad de veces que un usuario ha hecho clic en un botón, en la sesión actual:
Ejemplo
fuente
fuente
fuente
Aunque algunos usuarios ya respondieron esta pregunta, estoy dando un ejemplo de configuración de la aplicación para resolver este problema.
Tuve el mismo problema Estoy usando el módulo https://github.com/grevory/angular-local-storage en mi aplicación angularjs. Si configura su aplicación de la siguiente manera, guardará la variable en el almacenamiento de la sesión en lugar del almacenamiento local. Por lo tanto, si cierra el navegador o cierra la pestaña, el almacenamiento de la sesión se eliminará automáticamente. No necesitas hacer nada.
Espero que ayude.
fuente
Hay cinco métodos para elegir:
Puede usar clear (), este método cuando se invoca borra todo el almacenamiento de todos los registros para ese dominio. No recibe ningún parámetro.
fuente
Aquí hay una prueba simple para ver si tiene soporte de navegador cuando trabaja con almacenamiento local:
Funcionó para mí como se esperaba (uso Google Chrome). Adaptado de: http://www.w3schools.com/html/html5_webstorage.asp .
fuente
No creo que la solución presentada aquí sea 100% correcta porque el evento window.onbeforeunload se llama no solo cuando el navegador / Tab está cerrado (LO QUE SE REQUIERE), sino también en todos los demás eventos. (QUE NO SE REQUIERE)
Consulte este enlace para obtener más información sobre la lista de eventos que pueden activar window.onbeforeunload: -
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
fuente
¿Por qué no se utiliza sessionStorage?
"El objeto sessionStorage es igual al objeto localStorage, excepto que almacena los datos para una sola sesión. Los datos se eliminan cuando el usuario cierra la ventana del navegador".
http://www.w3schools.com/html/html5_webstorage.asp
fuente
Después de mirar esta pregunta 6 años después de haberla preguntado, descubrí que todavía no hay una respuesta suficiente para esta pregunta; que debería lograr todo lo siguiente:
Ejecute esta pieza de javascript al comienzo de cada carga de página para lograr lo anterior:
Editar: La idea básica aquí es la siguiente:
tabid
tabs
contiene un objeto, esa clavetabid
se establece en 1.tabs
se actualiza a un objeto que contiene eltabid
conjunto en 0.tabid
existe, y también latabs
clave de almacenamiento local con una subclave deltabid
almacenamiento local no se borra.tabid
ya no existe ytabid
se generará uno nuevo . Dado que el almacenamiento local no tiene una subclave para estotabid
, ni ninguna otratabid
(todas las sesiones se cerraron), se borra.tabid
se genera una nueva en el almacenamiento de la sesión, pero como existe al menos unatabs
[tabid
], el almacenamiento local no se borrafuente
window.onbeforeunload
no se llamará y el localtabs[tabid]
no se establecerá en 0 => el almacenamiento local nunca más se borrará. Creo que un perro guardián sería más apropiado en ese caso, en lugar de escribir 1 al cargar la pestaña, debería escribir la marca de tiempo actual. Luego, en la parte de reducción, debe afirmar el retraso ya que esa marca de tiempo no es demasiado grande o reemplazarla por 0 si lo es. De esa manera, no depende de la llamada real deonbeforeunload
. La pestaña solo necesita restablecer el perro guardián de vez en cuando para mantener la existencia de almacenamiento local.Esta es una vieja pregunta, pero parece que ninguna de las respuestas anteriores es perfecta.
En el caso de que desee almacenar la autenticación o cualquier información confidencial que se destruya solo cuando el navegador esté cerrado, puede confiar
sessionStorage
ylocalStorage
pasar mensajes de tabla cruzada.Básicamente, la idea es:
localStorage
comosessionStorage
están vacías (si no, puedes borrar ellocalStorage
). Deberá registrar un detector de eventos de mensajes en ellocalStorage
.sessionStorage
para almacenar la información confidencial, y usalocalStorage
para almacenar esta información, luego la elimina (no le importa el tiempo aquí, ya que el evento se puso en cola cuando los datos cambiaron). Cualquier otra pestaña abierta en ese momento se volverá a llamar al evento de mensaje y actualizará susessionStorage
con la información confidencial.sessionStorage
estará vacía. El código tendrá que establecer una clave enlocalStorage
(por ejemplo:)req
. Cualquier otra pestaña (todas) se volverá a llamar en el evento del mensaje, verá esa clave y podrá responder con la información confidencial de susessionStorage
(como en 3), si la tienen.Tenga en cuenta que este esquema no depende del
window.onbeforeunload
evento que es frágil (ya que el navegador puede cerrarse / bloquearse sin que se activen estos eventos). Además, el tiempo que la información confidencial se almacena en ellocalStorage
es muy pequeño (ya que depende de la detección de cambios de transitorios para eventos de mensajes cruzados), por lo que es poco probable que dicha información confidencial se filtre en el disco duro del usuario.Aquí hay una demostración de este concepto: http://jsfiddle.net/oypdwxz7/2/
fuente
No existe tal forma de detectar el cierre del navegador, por lo que probablemente no pueda eliminar localStorage en el cierre del navegador, pero hay otra forma de manejar las cosas que puede usar sessionCookies, ya que destruirá después del cierre del navegador. Esto lo implementé en mi proyecto.
fuente
Simplemente puede usar sessionStorage. Debido a que sessionStorage permite borrar todos los valores clave cuando se cierra la ventana del navegador.
Ver allí: SessionStorage- MDN
fuente
Puede intentar el siguiente código para eliminar el almacenamiento local:
fuente
localStorage.removeItem(key);
para eliminar una clave.delete
? Lo intenté y funciona. ¿Hay algún efecto secundario o algo que no debamos usar para eliminar? Gracias.delete
no es la mejor práctica enlocalStorage