Mon cas: localStorage avec clé + valeur qui devrait être supprimé lorsque le navigateur est fermé et pas un seul onglet.
Veuillez voir mon code s'il est correct et ce qui peut être amélioré:
//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;
});
undefined
remplacerait cependant l'élément précédemment stocké. Mais oui, l'utilisation.removeItem()
est plus appropriée.localStorage.clear();
si vous souhaitez effacer tout l'espace de stockage.Réponses:
devrait être fait comme ça et non avec l'opérateur de suppression:
la source
delete localStorage.key
fonctionne aussi bien quelocalStorage.removeItem(key)
. Il me semble plus clair d'utiliser la suppression lorsque je règle mes variables commelocalStorage.key = 1
plutôt quelocalStorage.setItem('key', 1)
.localStorage.removeItem = null;
, se faisantlocalStorage.removeItem(key);
une idée potentiellement mauvaise.localStorage.key = 1
en premier lieu - pour éviter ce genre d'accidentsUtiliser avec
window
un mot-clé global: -la source
localStorage.removeItem(key)
fonctionne tout simplement bien.Vous pouvez utiliser l'
beforeunload
événement en JavaScript.En utilisant vanilla JavaScript, vous pourriez faire quelque chose comme:
Cela supprimera la clé avant la fermeture de la fenêtre / de l'onglet du navigateur et vous invite à confirmer l'action de fermeture de la fenêtre / de l'onglet. J'espère que cela résout votre problème.
REMARQUE: la
onbeforeunload
méthode doit renvoyer une chaîne.la source
Vous devez utiliser sessionStorage à la place si vous souhaitez que la clé soit supprimée à la fermeture du navigateur.
la source
sessionStorage
est le remède à ce que le demandeur décrit.sessionStorage
, mais le projet du rédacteur en chef du W3C dit: `` La durée de vie d'un contexte de navigation peut être indépendante de la durée de vie du processus de l'agent utilisateur lui-même, car l'agent utilisateur peut prendre en charge la reprise des sessions après un redémarrage. ''Essayez d'utiliser
J'espère que cela fonctionne pour toi
la source
localStorage.clear();
Il existe un cas d'utilisation très spécifique dans lequel toute suggestion d'utiliser sessionStorage au lieu de localStorage n'aide pas vraiment. Le cas d'utilisation serait quelque chose d'aussi simple que d'avoir quelque chose stocké pendant qu'au moins un onglet est ouvert, mais l'invalider si vous fermez le dernier onglet restant. Si vous avez besoin que vos valeurs soient enregistrées sous forme de tableau croisé et de fenêtre, sessionStorage ne vous aide que si vous compliquez votre vie avec des auditeurs, comme j'ai essayé. En attendant, localStorage serait parfait pour cela, mais il fait le travail «trop bien», car vos données y attendront même après un redémarrage du navigateur. J'ai fini par utiliser un code et une logique personnalisés qui tirent parti des deux.
Je préfère expliquer puis donner du code. Enregistrez d'abord ce dont vous avez besoin dans localStorage, puis créez également dans localStorage un compteur qui contiendra le nombre d'onglets que vous avez ouverts. Cela augmentera à chaque chargement de la page et diminuera à chaque déchargement de la page. Vous pouvez faire votre choix ici des événements à utiliser, je suggère «charger» et «décharger». Au moment du déchargement, vous devez effectuer les tâches de nettoyage que vous souhaitez lorsque le compteur atteint 0, ce qui signifie que vous fermez le dernier onglet. Voici la partie délicate: je n'ai pas trouvé de moyen fiable et générique pour faire la différence entre un rechargement de page ou une navigation dans la page et la fermeture de l'onglet. Donc, si les données que vous stockez ne sont pas quelque chose que vous pouvez reconstruire lors du chargement après avoir vérifié qu'il s'agit de votre premier onglet, alors vous ne pouvez pas le supprimer à chaque rafraîchissement. Au lieu de cela, vous devez stocker un indicateur dans sessionStorage à chaque chargement avant d'augmenter le compteur d'onglets. Avant de stocker cette valeur, vous pouvez vérifier si elle a déjà une valeur et si ce n'est pas le cas, cela signifie que vous chargez dans cette session pour la première fois, ce qui signifie que vous pouvez faire le nettoyage à la charge si cela La valeur n'est pas définie et le compteur est 0.
la source
utiliser sessionStorage
L'objet sessionStorage est égal à l'objet localStorage, sauf qu'il stocke les données pour une seule session. Les données sont supprimées lorsque l'utilisateur ferme la fenêtre du navigateur.
L'exemple suivant compte le nombre de fois qu'un utilisateur a cliqué sur un bouton, dans la session en cours:
Exemple
la source
la source
la source
Bien que certains utilisateurs aient déjà répondu à cette question, je donne un exemple de paramètres d'application pour résoudre ce problème.
J'ai eu le même problème. J'utilise le module https://github.com/grevory/angular-local-storage dans mon application angularjs. Si vous configurez votre application comme suit, elle enregistrera la variable dans le stockage de session au lieu du stockage local. Par conséquent, si vous fermez le navigateur ou fermez l'onglet, le stockage de session sera supprimé automatiquement. Vous n'avez pas besoin de faire quoi que ce soit.
J'espère que cela vous aidera.
la source
Vous avez le choix entre cinq méthodes:
Vous pouvez utiliser clear (), cette méthode lorsqu'elle est invoquée efface tout le stockage de tous les enregistrements de ce domaine. Il ne reçoit aucun paramètre.
la source
Voici un test simple pour voir si vous avez la prise en charge du navigateur lorsque vous travaillez avec le stockage local:
Cela a fonctionné pour moi comme prévu (j'utilise Google Chrome). Adapté de: http://www.w3schools.com/html/html5_webstorage.asp .
la source
Je ne pense pas que la solution présentée ici soit 100% correcte, car l'événement window.onbeforeunload est appelé non seulement lorsque le navigateur / l'onglet est fermé (QUI EST REQUIS), mais également pour tous les autres événements. (QUI POURRAIT NE PAS ÊTRE REQUIS)
Voir ce lien pour plus d'informations sur la liste des événements pouvant déclencher window.onbeforeunload: -
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
la source
pourquoi ne pas utiliser sessionStorage?
"L'objet sessionStorage est égal à l'objet localStorage, sauf qu'il stocke les données pour une seule session. Les données sont supprimées lorsque l'utilisateur ferme la fenêtre du navigateur."
http://www.w3schools.com/html/html5_webstorage.asp
la source
Après avoir examiné cette question 6 ans après qu'elle a été posée, j'ai constaté qu'il n'y avait toujours pas de réponse suffisante à cette question; qui devrait atteindre tous les objectifs suivants:
Exécutez ce morceau de javascript au début de chaque chargement de page afin d'atteindre les objectifs ci-dessus:
Edit: L'idée de base ici est la suivante:
tabid
tabs
contenant un objet ces cléstabid
est définie sur 1.tabs
est mis à jour en un objet contenanttabid
défini sur 0.tabid
existe, ainsi que latabs
clé de stockage locale avec une sous-clé detabid
stockage local n'est pas non plus effacée.tabid
n'existera plus et un nouveautabid
sera généré. Étant donné que le stockage local n'a pas de sous-clé pour celatabid
, ni aucun autretabid
(toutes les sessions ont été fermées), il est effacé.tabid
est généré dans le stockage de session, mais comme au moins untabs
[tabid
] existe, le stockage local n'est pas effacéla source
window.onbeforeunload
ne sera pas appelé et le localtabs[tabid]
ne sera pas défini sur 0 => le stockage local ne sera plus effacé. Je pense qu'un chien de garde serait plus approprié dans ce cas, au lieu d'écrire 1 lors du chargement des onglets, vous devriez écrire l'horodatage actuel. Ensuite, dans la partie réduire, vous devez affirmer le retard car cet horodatage n'est pas trop grand ou le remplacer par 0 s'il l'est. De cette façon, vous ne dépendez pas de l'appel réel deonbeforeunload
. L'onglet a juste besoin de réinitialiser le chien de garde de temps en temps pour maintenir l'existence du stockage local.C'est une vieille question, mais il semble qu'aucune des réponses ci-dessus ne soit parfaite.
Dans le cas où vous souhaitez stocker l'authentification ou toute information sensible qui n'est détruite que lorsque le navigateur est fermé, vous pouvez compter sur
sessionStorage
etlocalStorage
pour la transmission des messages croisés.Fondamentalement, l'idée est:
localStorage
etsessionStorage
sont vides (sinon, vous pouvez effacer lelocalStorage
). Vous devrez enregistrer un écouteur d'événement de message sur lelocalStorage
.sessionStorage
à jour le pour stocker les informations sensibles, utilisez lelocalStorage
pour stocker ces informations, puis supprimez-les (vous ne vous souciez pas de la durée ici, car l'événement a été mis en file d'attente lorsque les données ont changé). Tout autre onglet ouvert à ce moment sera rappelé lors de l'événement de message, et mettra à jour sonsessionStorage
avec les informations sensibles.sessionStorage
ci sera vide. Le code devra définir une clé dans lelocalStorage
(par exemple:)req
. Tout (tous) les autres onglets seront rappelés dans l'événement de message, voir cette clé, et peuvent répondre avec les informations sensibles de leursessionStorage
(comme dans 3), s'ils en ont.Veuillez noter que ce schéma ne dépend pas d'un
window.onbeforeunload
événement fragile (puisque le navigateur peut être fermé / planté sans que ces événements soient déclenchés). De plus, la durée pendant laquelle les informations sensibles sont stockées sur lelocalStorage
durée pendant laquelle est très petite (puisque vous vous fiez à la détection des modifications transitoires pour les événements de message croisé), il est donc peu probable que de telles informations sensibles fuient sur le disque dur de l'utilisateur.Voici une démo de ce concept: http://jsfiddle.net/oypdwxz7/2/
la source
Il n'y a pas une telle façon de détecter la fermeture du navigateur, donc vous ne pouvez probablement pas supprimer localStorage à la fermeture du navigateur, mais il existe une autre façon de gérer les choses que vous pouvez utiliser sessionCookies car il détruira après la fermeture du navigateur.C'est ce que j'ai implémenté dans mon projet.
la source
Vous pouvez simplement utiliser sessionStorage. Parce que sessionStorage permet d'effacer toutes les valeurs de clé lorsque la fenêtre du navigateur sera fermée.
Voir ici: SessionStorage- MDN
la source
vous pouvez essayer le code suivant pour supprimer le stockage local:
la source
localStorage.removeItem(key);
pour supprimer une clé.delete
? J'ai essayé, et ça marche. Y a-t-il un effet secondaire ou quelque chose que nous ne devrions pas utiliser pour supprimer? Je vous remercie.delete
n'est pas la meilleure pratique danslocalStorage