Moja sprawa: localStorage z kluczem + wartością, którą należy usunąć, gdy przeglądarka jest zamknięta, a nie pojedynczą kartę.
Proszę zobaczyć mój kod, jeśli jest poprawny 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;
});
javascript
jquery
html
local-storage
Yosef
źródło
źródło
undefined
zastępowania wcześniej zapisanego elementu. Ale tak, używanie.removeItem()
jest bardziej odpowiednie.localStorage.clear();
jeśli chcesz wyczyścić całe miejsce.Odpowiedzi:
należy to zrobić w ten sposób, a nie za pomocą operatora delete:
źródło
delete localStorage.key
działa równie dobrze jaklocalStorage.removeItem(key)
. Wydaje mi się, że użycie skasowania jest bardziej zrozumiałe, kiedy ustawiam zmienne jaklocalStorage.key = 1
zamiastlocalStorage.setItem('key', 1)
.localStorage.removeItem = null;
, colocalStorage.removeItem(key);
może być kiepskim pomysłem.localStorage.key = 1
w pierwszej kolejności - aby uniknąć tego rodzaju wypadkówUżywaj z
window
globalnym słowem kluczowym: -źródło
localStorage.removeItem(key)
działa dobrze.Możesz skorzystać z
beforeunload
zdarzenia w JavaScript.Za pomocą waniliowego JavaScript możesz zrobić coś takiego:
Spowoduje to usunięcie klucza przed zamknięciem okna / karty przeglądarki i monitowanie o potwierdzenie działania zamknięcia okna / karty. Mam nadzieję, że to rozwiąże twój problem.
UWAGA:
onbeforeunload
Metoda powinna zwrócić ciąg znaków.źródło
Zamiast tego należy użyć sessionStorage, jeśli chcesz, aby klucz został usunięty po zamknięciu przeglądarki.
źródło
sessionStorage
jest lekarstwem na to, co opisuje pytający.sessionStorage
, ale wersja robocza edytora W3C mówi: „Czas istnienia kontekstu przeglądania może być niezwiązany z czasem życia samego procesu agenta użytkownika, ponieważ agent użytkownika może obsługiwać wznawianie sesji po ponownym uruchomieniu”.Spróbuj użyć
Mam nadzieję, że to Ci odpowiada
źródło
localStorage.clear();
Istnieje bardzo szczególny przypadek użycia, w którym jakakolwiek sugestia użycia sessionStorage zamiast localStorage tak naprawdę nie pomaga. Przypadek użycia byłby czymś tak prostym, jak przechowywanie czegoś, gdy masz przynajmniej jedną otwartą kartę, ale unieważnij to, jeśli zamkniesz ostatnią pozostałą kartę. Jeśli potrzebujesz, aby twoje wartości były zapisywane między kartami i oknem, sessionStorage nie pomoże ci, chyba że komplikujesz swoje życie słuchaczom, tak jak próbowałem. W międzyczasie localStorage byłby do tego idealny, ale wykonuje to 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 korzysta z obu.
Wolę wyjaśnić, niż podać kod. Najpierw zapisz to, czego potrzebujesz w localStorage, a następnie również 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. Tutaj możesz wybrać wydarzenia, które chcesz użyć, sugeruję „załaduj” i „rozładuj”. Podczas 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 wiarygodnego i ogólnego sposobu na odróżnienie przeładowania strony lub nawigacji na stronie od zamknięcia karty. Jeśli więc przechowywane dane nie są czymś, co można odbudować po załadowaniu po sprawdzeniu, że jest to Twoja pierwsza karta, nie można go usunąć przy każdym odświeżeniu. Zamiast tego należy przechowywać flagę w sessionStorage przy każdym ładowaniu przed zwiększeniem licznika tabulatorów. Przed zapisaniem tej wartości możesz sprawdzić, czy ma ona już wartość, a jeśli nie, oznacza to, że ładujesz się do tej sesji po raz pierwszy, co oznacza, że możesz wykonać czyszczenie przy ładowaniu, jeśli to wartość nie jest ustawiona, a licznik wynosi 0.
źródło
użyj sessionStorage
Obiekt sessionStorage jest równy obiektowi localStorage, z wyjątkiem tego, że przechowuje dane tylko dla jednej sesji. Dane są usuwane, gdy użytkownik zamyka okno przeglądarki.
Poniższy przykład zlicza liczbę kliknięć przycisku przez użytkownika w bieżącej sesji:
Przykład
źródło
źródło
źródło
Chociaż niektórzy użytkownicy już odpowiedzieli na to pytanie, podam przykład ustawień aplikacji, aby rozwiązać ten problem.
Miałem ten sam problem. Korzystam z modułu https://github.com/grevory/angular-local-storage w mojej aplikacji angularjs. Jeśli skonfigurujesz aplikację w następujący sposób, zapisze ona zmienną w pamięci sesji zamiast w pamięci lokalnej. Dlatego jeśli zamkniesz przeglądarkę lub zamkniesz kartę, pamięć sesji zostanie automatycznie usunięta. Nie musisz nic robić.
Mam nadzieję, że to pomoże.
źródło
Istnieje pięć metod do wyboru:
Możesz użyć clear (), ta metoda po wywołaniu usuwa całą pamięć wszystkich rekordów dla tej domeny. Nie otrzymuje żadnych parametrów.
źródło
Oto prosty test, aby sprawdzić, czy masz obsługę przeglądarki podczas pracy z pamięcią lokalną:
Działa dla mnie zgodnie z oczekiwaniami (używam Google Chrome). Zaadaptowano z: http://www.w3schools.com/html/html5_webstorage.asp .
źródło
Nie sądzę, aby przedstawione tutaj rozwiązanie było w 100% poprawne, ponieważ zdarzenie window.onbeforeunload jest wywoływane nie tylko wtedy, gdy przeglądarka / karta jest zamknięta (CO JEST WYMAGANE), ale także w przypadku wszystkich innych kilku zdarzeń. (KTÓRE MOGĄ 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
źródło
dlaczego nie używany sessionStorage?
„Obiekt sessionStorage jest równy obiektowi localStorage, z wyjątkiem tego, że przechowuje dane tylko dla jednej sesji. Dane są usuwane, gdy użytkownik zamyka okno przeglądarki.”
http://www.w3schools.com/html/html5_webstorage.asp
źródło
Po przeanalizowaniu tego pytania 6 lat po zadaniu okazało się, że wciąż nie ma wystarczającej odpowiedzi na to pytanie; które powinny osiągnąć wszystkie następujące warunki:
Wykonaj ten fragment javascript na początku każdego ładowania strony, aby osiągnąć powyższe:
Edycja: Podstawowa idea tutaj jest następująca:
tabid
tabs
zawierającego obiekt zawierający klucztabid
jest ustawiony na 1.tabs
jest aktualizowana do obiektu zawierającegotabid
wartość 0.tabid
istnieje klucz pamięci sesji , podobnie jak lokalnytabs
klucz pamięci z podkluczemtabid
pamięci lokalnej nie jest czyszczony.tabid
nie będzie już miejsca na sesję itabid
zostanie wygenerowane nowe . Ponieważ pamięć lokalna nie ma podklucza do tegotabid
ani żadnego innegotabid
(wszystkie sesje zostały zamknięte), została wyczyszczona.tabid
pamięć jest generowana w pamięci sesji, ale ponieważ istnieje co najmniej jednatabs
[tabid
], pamięć lokalna nie jest czyszczonaźródło
window.onbeforeunload
nastąpi awaria przeglądarki, nie zostanie ona wywołana, atabs[tabid]
pamięć lokalna nie zostanie ustawiona na 0 => pamięć lokalna nigdy nie zostanie wyczyszczona. Myślę, że w takim przypadku bardziej odpowiedni byłby organ nadzorczy, zamiast pisać 1 przy ładowaniu tabulatorów, powinieneś zapisać aktualny znacznik czasu. Następnie w części zmniejszającej powinieneś potwierdzić opóźnienie, ponieważ ten znacznik czasu nie jest zbyt duży lub zastąpić go 0, jeśli tak jest. W ten sposób nie zależysz od faktycznego wezwaniaonbeforeunload
. Karta musi tylko od czasu do czasu resetować watchdoga, aby zachować lokalną pamięć.To stare pytanie, ale wydaje się, że żadna z powyższych odpowiedzi nie jest idealna.
W przypadku, gdy chcesz uwierzytelniania sklepu lub poufnych informacji, które są zniszczeniu dopiero wtedy, gdy przeglądarka jest zamknięta, na której można polegać
sessionStorage
ilocalStorage
do wiadomości cross-tab podjęcia.Zasadniczo chodzi o:
localStorage
isessionStorage
pusty są (jeśli nie, możesz wyczyścićlocalStorage
). Musisz zarejestrować odbiornik zdarzenia wiadomości wlocalStorage
.sessionStorage
aby przechowywać poufne informacje, i używaszlocalStorage
do przechowywania tych informacji, a następnie je usuwasz (nie przejmujesz się czasem, ponieważ zdarzenie było w kolejce, gdy dane się zmieniły). Każda inna zakładka otwarta w tym czasie zostanie wywołana ponownie w przypadku zdarzenia wiadomości i zaktualizuje ichsessionStorage
o poufne informacje.sessionStorage
będzie ona pusta. Kod będzie musiał ustawić klucz wlocalStorage
(na przykład:)req
. Każda (wszystkie) inna karta zostanie wywołana z powrotem w zdarzeniu wiadomości, zobacz ten klucz i może odpowiedzieć poufnymi informacjami z ichsessionStorage
(jak w 3), jeśli takie mają.Zauważ, że ten schemat nie zależy od
window.onbeforeunload
wydarzenia, które jest delikatne (ponieważ przeglądarkę można zamknąć / zawiesić bez uruchamiania tych zdarzeń). Czas przechowywania poufnych informacji wlocalStorage
bardzo mały (ponieważ polegasz na wykrywaniu zmian trans przejęć w przypadku komunikatu między kartami), więc jest mało prawdopodobne, aby takie wrażliwe informacje wyciekły na dysk twardy użytkownika.Oto demo tej koncepcji: http://jsfiddle.net/oypdwxz7/2/
źródło
Nie ma takiego sposobu na wykrycie zamknięcia przeglądarki, więc prawdopodobnie nie możesz usunąć localStorage na zamknięciu przeglądarki, ale jest też inny sposób radzenia sobie z rzeczami, których możesz użyć sessionCookies, ponieważ zniszczą się po zamknięciu przeglądarki. Jest to zaimplementowane w moim projekcie.
źródło
Możesz po prostu użyć sessionStorage. Ponieważ sessionStorage pozwala wyczyścić wszystkie wartości klucza, gdy okno przeglądarki zostanie zamknięte.
Zobacz tam: SessionStorage- MDN
źródło
możesz spróbować użyć następującego kodu, aby usunąć pamięć lokalną:
źródło
localStorage.removeItem(key);
aby usunąć klucz.delete
? Próbowałem i to działa. Czy jest jakiś efekt uboczny lub coś, czego nie powinniśmy używać delete? Dziękuję Ci.delete
nie jest najlepszą praktyką wlocalStorage