494 votes

Comment supprimer un élément localStorage lorsque la fenêtre/onglet du navigateur est fermée ?

Mon cas : localStorage avec clé + valeur qui doit être supprimé lorsque le navigateur est fermé et non 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;
});

41 votes

Si vous voulez effacer le stockage local à la fermeture du navigateur, je m'interroge sur les raisons de votre utilisation.

19 votes

Vous pouvez avoir à la fois des objets de stockage local et de session - j'utiliserais sessionStorage pour les valeurs de session. Par ailleurs, le fait de donner à une valeur la valeur indéfinie ne la supprime pas, ni ne la retire du localStorage, mais lui donne simplement la valeur indéfinie.

3 votes

@kennebec - Réglage à undefined écraserait cependant l'élément précédemment stocké. Mais oui, en utilisant .removeItem() est plus approprié.

927voto

Yosef Points 2879

Devrait être fait de cette façon et non avec l'opérateur delete :

localStorage.removeItem(key);

1 votes

Pourquoi ne pouvons-nous pas utiliser l'opérateur delete, exactement ? D'après mes tests, il semble que delete localStorage.key fonctionne tout aussi bien que localStorage.removeItem(key) . Il me semble plus clair d'utiliser delete lorsque je définis mes variables comme suit localStorage.key = 1 plutôt que localStorage.setItem('key', 1) .

7 votes

Si cela fonctionne, vous pouvez techniquement l'utiliser. Mais étant donné que removeItem est fourni comme une fonction membre, il semble logique de l'utiliser plutôt que de se heurter à un comportement potentiellement indéfini en utilisant un opérateur séparé.

0 votes

@kungphu gardez à l'esprit que l'on peut toujours (accidentellement) faire localStorage.removeItem = null; en faisant localStorage.removeItem(key); une idée potentiellement mauvaise.

120voto

Graou13 Points 319

Vous devez utiliser le sessionStorage à la place si vous voulez que la clé soit supprimée à la fermeture du navigateur.

11 votes

C'est la meilleure réponse ; sessionStorage est le remède pour ce que le demandeur décrit.

11 votes

+1 pour la mention sessionStorage mais le Projet de l'éditeur du W3C dit : "La durée de vie d'un contexte de navigation peut être sans rapport avec 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".

48 votes

Le problème avec 'sessionStorage' est qu'il n'est pas enregistré lorsque vous ouvrez un nouvel onglet, par exemple en cliquant sur un lien avec la touche Ctrl. J'ai besoin d'un hybride localStorage/sessionStorage.

107voto

MT. Points 1069

Vous pouvez utiliser le beforeunload en JavaScript.

En utilisant du JavaScript classique, vous pourriez faire quelque chose comme :

window.onbeforeunload = function() {
  localStorage.removeItem(key);
  return '';
};

Cela supprimera la clé avant la fermeture de la fenêtre/de l'onglet du navigateur et vous invitera à confirmer l'action de fermeture de la fenêtre/de l'onglet. J'espère que cela résoudra votre problème.

NOTE : Le onbeforeunload doit retourner une chaîne de caractères.

0 votes

C'était en effet utile. Ce serait bien d'accepter la réponse (même après tout ce temps).

9 votes

@dhsto VanillaJS est un simple JavaScript :) Regardez ici : Qu'est-ce que VanillaJS ? .

2 votes

Le problème est que cette fonction est appelée même si vous naviguez sur la même page, et pas seulement lorsque l'onglet est fermé, ce qui n'est peut-être pas le but recherché. Remarque : retourner undefined à partir de onbeforeunload désactivera le message affiché lors du déchargement.

12voto

Rafael Marques Points 404

Essayez d'utiliser

$(window).unload(function(){
  localStorage.clear();
});

J'espère que cela fonctionnera pour vous

2 votes

Voulez-vous effacer la totalité du LocalStorage ? Si oui, utilisez simplement localStorage.clear();

0 votes

Ce que je voulais était clair dans la question - clé seulement supprimer + valeur

24 votes

Cela nettoiera tout le localstorage. mauvaise solution !

3voto

rdonatoiop Points 655

Voici un test simple pour voir si votre navigateur prend en charge le stockage local :

if(typeof(Storage)!=="undefined") {
  console.log("localStorage and sessionStorage support!");
  console.log("About to save:");
  console.log(localStorage);
  localStorage["somekey"] = 'hello';
  console.log("Key saved:");
  console.log(localStorage);
  localStorage.removeItem("somekey");  //<--- key deleted here
  console.log("key deleted:");
  console.log(localStorage);
  console.log("DONE ===");
} else {
  console.log("Sorry! No web storage support..");
}

Cela a fonctionné pour moi comme prévu (j'utilise Google Chrome). Adapté de : http://www.w3schools.com/html/html5_webstorage.asp .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X