Jak usunąć element localStorage, gdy okno/karta przeglądarki jest zamknięte?

Mój przypadek: localStorage z kluczem + wartość, która powinna być usunięta, gdy przeglądarka jest zamknięta, a nie pojedyncza karta.

Proszę zobaczyć mój kod, jeśli jest prawidłowy i co można poprawić:

//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;
});
Author: MT., 2012-03-30

15 answers

Powinno się tak robić, a nie z operatorem delete:

localStorage.removeItem(key);
 616
Author: Yosef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-12 08:00:07

Możesz użyć zdarzenia beforeunload w JavaScript.

Używając vanilla JavaScript możesz zrobić coś w stylu:

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

Spowoduje usunięcie klucza przed zamknięciem okna/karty przeglądarki i poprosi o potwierdzenie operacji zamknij okno / kartę. Mam nadzieję, że to rozwiąże twój problem.

Uwaga: Metoda onbeforeunload powinna zwracać łańcuch znaków.

 86
Author: MT.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-26 19:40:52

Użyj window globalnego słowa kluczowego:-

 window.localStorage.removeItem('keyName');
 78
Author: vineet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 06:27:08

Powinieneś użyć sessionStorage, jeśli chcesz, aby klucz został usunięty po zamknięciu przeglądarki.

 74
Author: Graou13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-12 07:41:41

Spróbuj użyć

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

Mam nadzieję, że to działa dla ciebie

 16
Author: Rafael Marques,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 15:01:26

Istnieje bardzo specyficzny przypadek użycia, w którym sugestie użycia sessionStorage zamiast localStorage nie pomagają. Przypadek użycia byłby czymś tak prostym, jak posiadanie czegoś zapisanego, gdy masz co najmniej jedną kartę otwartą, ale Unieważnij go, jeśli zamkniesz ostatnią kartę pozostałą. Jeśli chcesz, aby twoje wartości zostały zapisane na karcie i oknie, sessionStorage nie pomoże Ci, chyba że skomplikować swoje życie ze słuchaczami, jak próbowałem. W międzyczasie localStorage będzie idealne do tego, ale wykonuje zadanie "zbyt dobrze", ponieważ Twoje dane będą tam czekać nawet po ponownym uruchomieniu przeglądarki. Skończyło się na użyciu niestandardowego kodu i logiki, która wykorzystuje oba.

Raczej wyjaśnię, potem podam kod. Najpierw przechowuj to, czego potrzebujesz w localStorage, a następnie w localStorage Utwórz licznik, który będzie zawierał liczbę otwartych kart. Będzie to zwiększane za każdym razem, gdy Strona się ładuje i zmniejszane za każdym razem, gdy Strona się rozładowuje. Możesz mieć Wybierz tutaj zdarzenia do wykorzystania, proponuję "Załaduj" i "rozładuj". W momencie rozładowywania musisz wykonać zadania czyszczenia, które chcesz, gdy licznik osiągnie 0, co oznacza, że zamykasz ostatnią kartę. Oto trudna część: nie znalazłem niezawodnego i ogólnego sposobu, aby odróżnić przeładowanie strony lub nawigację wewnątrz strony od zamknięcia karty. Więc jeśli przechowywane dane nie są czymś, co można odbudować po załadowaniu po sprawdzeniu, że jest to twój pierwszy tab, a następnie nie można go usunąć przy każdym odświeżaniu. Zamiast tego musisz zapisać flagę w sessionStorage przy każdym obciążeniu przed zwiększeniem licznika kart. Przed zapisaniem tej wartości możesz sprawdzić, czy ma ona już wartość, a jeśli nie, oznacza to, że wczytywasz się do tej sesji po raz pierwszy, co oznacza, że możesz wykonać czyszczenie przy ładowaniu, jeśli ta wartość nie jest ustawiona, a licznik wynosi 0.

 11
Author: Solthun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-04 16:05:46

Użyj sessionStorage

Obiekt sessionStorage jest równy obiektowi localStorage, z tym wyjątkiem, że przechowuje dane tylko dla jednej sesji. Dane są usuwane po zamknięciu przez użytkownika okna przeglądarki.

Poniższy przykład zlicza liczbę kliknięć przez użytkownika przycisku w bieżącej sesji:

Przykład

if (sessionStorage.clickcount) {
    sessionStorage.clickcount = Number(sessionStorage.clickcount) + 1;
} else {
    sessionStorage.clickcount = 1;
}
document.getElementById("result").innerHTML = "You have clicked the button " +
sessionStorage.clickcount + " time(s) in this session.";
 9
Author: DilanG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 10:53:53

Oto prosty test, aby sprawdzić, czy masz obsługę przeglądarki podczas pracy z lokalną pamięcią masową:

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..");
}

Zadziałało zgodnie z oczekiwaniami (używam Google Chrome). Dostosowany od: http://www.w3schools.com/html/html5_webstorage.asp .

 3
Author: rdonatoiop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-28 14:20:24

Wydaje mi się, że przedstawione tutaj rozwiązanie nie jest w 100% poprawne, ponieważ window.Zdarzenie onbeforeunload jest wywoływane nie tylko wtedy, gdy przeglądarka/karta jest zamknięta (co jest wymagane), ale także we wszystkich innych zdarzeniach. (CO MOŻE NIE BYĆ WYMAGANE)

Zobacz ten link, aby uzyskać więcej informacji na temat listy zdarzeń, które mogą uruchomić window.onbeforeunload: -

Http://msdn.microsoft.com/en-us/library/ms536907 (VS.85). aspx

 3
Author: miztaken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 20:34:19

Dlaczego nie użyto sessionStorage?

" obiekt sessionStorage jest równy obiektowi localStorage, z tą różnicą, że przechowuje dane tylko dla jednej sesji. Dane są usuwane po zamknięciu przez użytkownika okna przeglądarki."

Http://www.w3schools.com/html/html5_webstorage.asp

 3
Author: wjfinder77,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-15 16:25:25

Chociaż niektórzy użytkownicy już odpowiedzieli na to pytanie, podaję przykład ustawień aplikacji, aby rozwiązać ten problem.

Miałem ten sam problem. Używam https://github.com/grevory/angular-local-storage moduł w mojej aplikacji angularjs. Jeśli skonfigurujesz aplikację w następujący sposób, zmienna zostanie zapisana w pamięci sesji zamiast pamięci lokalnej. Dlatego jeśli zamkniesz przeglądarkę lub zamkniesz kartę, pamięć sesji zostanie automatycznie usunięta. Nie potrzebujesz zrobić wszystko.
app.config(function (localStorageServiceProvider) {
  localStorageServiceProvider
  .setPrefix('myApp')
  .setStorageType('sessionStorage')
});
Mam nadzieję, że to pomoże.
 3
Author: user1012513,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-03 13:25:02
        for (let i = 0; i < localStorage.length; i++) {
        if (localStorage.key(i).indexOf('the-name-to-delete') > -1) {
          arr.push(localStorage.key(i));
        }
      }

for (let i = 0; i < arr.length; i++) {
        localStorage.removeItem(arr[i]);
      }
 2
Author: Gil Snovsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 10:50:21

Po obejrzeniu tego pytania 6 lat po jego zadaniu, stwierdziłem, że nadal nie ma wystarczającej odpowiedzi na to pytanie; które powinno osiągnąć wszystkie z następujących:

  • Wyczyść lokalny magazyn po zamknięciu przeglądarki (lub wszystkich kart domeny)
  • Zachowaj pamięć lokalną między kartami, jeśli przynajmniej jedna karta pozostaje aktywna
  • Zachowaj pamięć lokalną podczas przeładowywania pojedynczej karty

Wykonaj ten fragment javascript na początku każdego ładowania strony w kolejności aby osiągnąć powyższe:

((nm,tm) => {
    const
            l = localStorage,
            s = sessionStorage,
            tabid = s.getItem(tm) || (newid => s.setItem(tm, newid) || newid)((Math.random() * 1e8).toFixed()),
            update = set => {
                let cur = JSON.parse(l.getItem(nm) || '{}');
                if (set && typeof cur[tabid] == 'undefined' && !Object.values(cur).reduce((a, b) => a + b, 0)) {
                    l.clear();
                    cur = {};
                }
                cur[tabid] = set;
                l.setItem(nm, JSON.stringify(cur));
            };
    update(1);
    window.onbeforeunload = () => update(0);
})('tabs','tabid');
 0
Author: Hacktisch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 11:12:14

Możesz spróbować wykonać następujący kod, aby usunąć lokalny magazyn:

delete localStorage.myPageDataArr;
 -3
Author: aztechy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 12:17:26

To będzie działać jak urok, jeśli używasz AngularJS

$localStorage.$reset(); 
 -4
Author: shreedhar bhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-01 18:10:33