Mein Fall: localStorage mit Schlüssel + Wert, der beim Schließen des Browsers gelöscht werden soll und keine einzelne Registerkarte.
Bitte sehen Sie meinen Code, ob er richtig ist und was verbessert werden kann:
//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
Josef
quelle
quelle
undefined
würde das zuvor gespeicherte Element jedoch überschreiben. Aber ja, die Verwendung.removeItem()
ist angemessener.localStorage.clear();
Sie diese Option, wenn Sie den gesamten Speicher löschen möchten.Antworten:
sollte so gemacht werden und nicht mit dem Löschoperator:
quelle
delete localStorage.key
das genauso gut funktioniert wielocalStorage.removeItem(key)
. Es scheint mir klarer zu sein, delete zu verwenden, wenn ich meine VariablenlocalStorage.key = 1
eher wie als setzelocalStorage.setItem('key', 1)
.localStorage.removeItem = null;
, umlocalStorage.removeItem(key);
eine potenziell schlechte Idee zu machen.localStorage.key = 1
- um diese Art von Unfällen zu vermeidenVerwendung mit
window
globalem Schlüsselwort: -quelle
localStorage.removeItem(key)
funktioniert einfach gut.Sie können das
beforeunload
Ereignis in JavaScript verwenden.Mit Vanille-JavaScript können Sie Folgendes tun:
Dadurch wird der Schlüssel gelöscht, bevor das Browserfenster / die Registerkarte geschlossen wird, und Sie werden aufgefordert, die Aktion zum Schließen des Fensters / der Registerkarte zu bestätigen. Ich hoffe das löst dein Problem.
HINWEIS: Die
onbeforeunload
Methode sollte eine Zeichenfolge zurückgeben.quelle
Sie sollten stattdessen den sessionStorage verwenden, wenn der Schlüssel beim Schließen des Browsers gelöscht werden soll.
quelle
sessionStorage
ist das Mittel gegen das, was der Fragesteller beschreibt.sessionStorage
, aber im Entwurf des W3C-Editors heißt es: "Die Lebensdauer eines Browserkontexts kann nicht mit der Lebensdauer des eigentlichen Benutzeragentenprozesses selbst zusammenhängen, da der Benutzeragent möglicherweise die Wiederaufnahme von Sitzungen nach einem Neustart unterstützt."Versuchen Sie es mit
Hoffe das funktioniert bei dir
quelle
localStorage.clear();
Es gibt einen sehr speziellen Anwendungsfall, in dem ein Vorschlag, sessionStorage anstelle von localStorage zu verwenden, nicht wirklich hilft. Der Anwendungsfall wäre so einfach wie das Speichern von etwas, während Sie mindestens eine Registerkarte geöffnet haben. Machen Sie es jedoch ungültig, wenn Sie die letzte verbleibende Registerkarte schließen. Wenn Sie möchten, dass Ihre Werte tabellen- und fensterübergreifend gespeichert werden, hilft Ihnen sessionStorage nur, wenn Sie Ihr Leben mit Zuhörern komplizieren, wie ich es versucht habe. In der Zwischenzeit wäre localStorage perfekt dafür, aber es macht den Job "zu gut", da Ihre Daten dort auch nach einem Neustart des Browsers warten. Am Ende habe ich einen benutzerdefinierten Code und eine Logik verwendet, die beide Vorteile nutzen.
Ich würde es lieber erklären und dann Code geben. Speichern Sie zuerst das, was Sie benötigen, in localStorage und erstellen Sie dann auch in localStorage einen Zähler, der die Anzahl der geöffneten Registerkarten enthält. Dies wird bei jedem Laden der Seite erhöht und bei jedem Entladen der Seite verringert. Sie können hier eine Auswahl der zu verwendenden Ereignisse treffen. Ich würde "Laden" und "Entladen" vorschlagen. Zum Zeitpunkt des Entladens müssen Sie die gewünschten Bereinigungsaufgaben ausführen, wenn der Zähler 0 erreicht. Dies bedeutet, dass Sie die letzte Registerkarte schließen. Hier kommt der schwierige Teil: Ich habe keinen zuverlässigen und allgemeinen Weg gefunden, um den Unterschied zwischen einem erneuten Laden oder Navigieren der Seite innerhalb der Seite und dem Schließen der Registerkarte zu erkennen. Wenn die von Ihnen gespeicherten Daten beim Laden nicht neu erstellt werden können, nachdem Sie überprüft haben, ob dies Ihre erste Registerkarte ist, dann können Sie es nicht bei jeder Aktualisierung entfernen. Stattdessen müssen Sie bei jedem Laden ein Flag in sessionStorage speichern, bevor Sie den Tabulatorzähler erhöhen. Bevor Sie diesen Wert speichern, können Sie überprüfen, ob er bereits einen Wert hat. Wenn dies nicht der Fall ist, bedeutet dies, dass Sie zum ersten Mal in diese Sitzung laden. In diesem Fall können Sie die Bereinigung beim Laden durchführen Wert ist nicht gesetzt und der Zähler ist 0.
quelle
Verwenden Sie sessionStorage
Das sessionStorage-Objekt entspricht dem localStorage-Objekt, außer dass die Daten nur für eine Sitzung gespeichert werden. Die Daten werden gelöscht, wenn der Benutzer das Browserfenster schließt.
Im folgenden Beispiel wird gezählt, wie oft ein Benutzer in der aktuellen Sitzung auf eine Schaltfläche geklickt hat:
Beispiel
quelle
quelle
quelle
Obwohl einige Benutzer diese Frage bereits beantwortet haben, gebe ich ein Beispiel für Anwendungseinstellungen, um dieses Problem zu lösen.
Ich hatte das gleiche Problem. Ich verwende das Modul https://github.com/grevory/angular-local-storage in meiner AngularJS-Anwendung. Wenn Sie Ihre App wie folgt konfigurieren, werden Variablen im Sitzungsspeicher anstelle des lokalen Speichers gespeichert. Wenn Sie den Browser oder die Registerkarte schließen, wird der Sitzungsspeicher daher automatisch entfernt. Sie müssen nichts tun.
Hoffe es wird helfen.
quelle
Es stehen fünf Methoden zur Auswahl:
Sie können clear () verwenden. Diese Methode löscht beim Aufrufen den gesamten Speicher aller Datensätze für diese Domäne. Es werden keine Parameter empfangen.
quelle
Hier ist ein einfacher Test, um festzustellen, ob Sie Browserunterstützung haben, wenn Sie mit lokalem Speicher arbeiten:
Es hat bei mir wie erwartet funktioniert (ich verwende Google Chrome). Angepasst von: http://www.w3schools.com/html/html5_webstorage.asp .
quelle
Ich denke nicht, dass die hier vorgestellte Lösung zu 100% korrekt ist, da das Ereignis window.onbeforeunload nicht nur aufgerufen wird, wenn der Browser / Tab geschlossen ist (was erforderlich ist), sondern auch bei allen anderen verschiedenen Ereignissen. (WAS NICHT ERFORDERLICH SEIN KANN)
Unter diesem Link finden Sie weitere Informationen zur Liste der Ereignisse, die window.onbeforeunload auslösen können: -
http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
quelle
Warum nicht sessionStorage verwenden?
"Das sessionStorage-Objekt entspricht dem localStorage-Objekt, außer dass es die Daten nur für eine Sitzung speichert. Die Daten werden gelöscht, wenn der Benutzer das Browserfenster schließt."
http://www.w3schools.com/html/html5_webstorage.asp
quelle
Nachdem ich mir diese Frage 6 Jahre nach ihrer Beantwortung angesehen hatte, stellte ich fest, dass es immer noch keine ausreichende Antwort auf diese Frage gibt. was alles erreichen sollte:
Führen Sie dieses Javascript zu Beginn jedes Seitenladens aus, um Folgendes zu erreichen:
Bearbeiten: Die Grundidee hier ist die folgende:
tabid
tabs
der ein Objekt enthält, dessen Schlüsseltabid
auf 1 gesetzt ist.tabs
auf ein Objekt aktualisiert, dastabid
auf 0 gesetzt ist.tabid
vorhanden ist, wird auch der lokale Speicherschlüsseltabs
mit einem Unterschlüssel destabid
lokalen Speichers nicht gelöscht.tabid
nicht mehr vorhanden und es wird ein neuertabid
generiert. Da der lokale Speicher weder einen Unterschlüsseltabid
noch einen anderen hattabid
(alle Sitzungen wurden geschlossen), wird er gelöscht.tabid
im Sitzungsspeicher generiert. Da jedoch mindestens eintabs
[tabid
] vorhanden ist, wird der lokale Speicher nicht gelöschtquelle
window.onbeforeunload
wird der nicht aufgerufen undtabs[tabid]
der lokale Speicher wird nicht auf 0 gesetzt => Der lokale Speicher wird nie mehr gelöscht. Ich denke, ein Watchdog wäre in diesem Fall besser geeignet. Anstatt beim Laden der Registerkarte 1 zu schreiben, sollten Sie den aktuellen Zeitstempel schreiben. Dann sollten Sie im reduzierten Teil die Verzögerung aktivieren, da dieser Zeitstempel nicht zu groß ist, oder durch 0 ersetzen, wenn dies der Fall ist. Auf diese Weise sind Sie nicht auf den tatsächlichen Anruf von angewiesenonbeforeunload
. Die Registerkarte muss nur von Zeit zu Zeit den Watchdog zurücksetzen , um die lokale Speicherexistenz aufrechtzuerhalten.Dies ist eine alte Frage, aber es scheint, dass keine der obigen Antworten perfekt ist.
Wenn Sie die Authentifizierung oder vertrauliche Informationen speichern möchten, die nur beim Schließen des Browsers zerstört werden, können Sie sich auf
sessionStorage
und verlassenlocalStorage
für Quer Registerkarte Message Passing.Grundsätzlich lautet die Idee:
localStorage
alssessionStorage
auch leer (wenn nicht, können Sie die löschenlocalStorage
). Sie müssen einen Listener für Nachrichtenereignisse auf dem registrierenlocalStorage
.sessionStorage
, um die vertraulichen Informationen zu speichern, und verwenden daslocalStorage
, um diese Informationen zu speichern, und löschen sie dann (das Timing ist Ihnen hier egal, da das Ereignis in die Warteschlange gestellt wurde, als sich die Daten änderten). Alle anderen zu diesem Zeitpunkt geöffneten Registerkarten werden beim Nachrichtenereignis zurückgerufen und aktualisiertsessionStorage
mit den vertraulichen Informationen .sessionStorage
ist dieser leer. Der Code muss einen Schlüssel in derlocalStorage
(zum Beispiel :) setzenreq
. Jede (alle) anderen Registerkarte wird im Nachrichtenereignis zurückgerufen, siehe diesen Schlüssel, und kann mit den vertraulichen Informationen von ihremsessionStorage
(wie in 3) antworten , wenn sie solche haben.Bitte beachten Sie, dass dieses Schema nicht von einem
window.onbeforeunload
fragilen Ereignis abhängt (da der Browser geschlossen / abgestürzt werden kann, ohne dass diese Ereignisse ausgelöst werden). Außerdem ist die Zeit, in der die vertraulichen Informationen auf dem gespeichert werden,localStorage
sehr gering (da Sie sich auf die Erkennung von Transientenänderungen für Kreuztabellen-Nachrichtenereignisse verlassen), sodass es unwahrscheinlich ist, dass solche vertraulichen Informationen auf der Festplatte des Benutzers verloren gehen.Hier ist eine Demo dieses Konzepts: http://jsfiddle.net/oypdwxz7/2/
quelle
Es gibt keine Möglichkeit, das Schließen des Browsers zu erkennen, sodass Sie localStorage wahrscheinlich nicht beim Schließen des Browsers löschen können. Es gibt jedoch eine andere Möglichkeit, die Dinge zu behandeln, die Sie mit sessionCookies verwenden können, da diese nach dem Schließen des Browsers zerstört werden. Dies habe ich in meinem Projekt implementiert.
quelle
Sie können einfach sessionStorage verwenden. Da sessionStorage das Löschen aller Schlüsselwerte ermöglicht, wenn das Browserfenster geschlossen wird.
Siehe dort: SessionStorage-MDN
quelle
Sie können den folgenden Code verwenden, um den lokalen Speicher zu löschen:
quelle
localStorage.removeItem(key);
, um einen Schlüssel zu löschen.delete
? Ich habe es versucht und es funktioniert. Gibt es irgendwelche Nebenwirkungen oder etwas, das wir nicht zum Löschen verwenden sollten? Vielen Dank.delete
ist nicht die beste Praxis inlocalStorage