Nachdem ich mich mit dieser Frage 6 Jahre nachdem sie gestellt wurde, befasst habe, habe ich festgestellt, dass es immer noch keine ausreichende Antwort auf diese Frage gibt, die alle folgenden Punkte erfüllen sollte:
- Löschen des lokalen Speichers nach dem Schließen des Browsers (oder aller Registerkarten der Domäne)
- Lokalen Speicher über Registerkarten hinweg beibehalten, wenn mindestens eine Registerkarte aktiv bleibt
- Lokalen Speicher beibehalten, wenn eine einzelne Registerkarte neu geladen wird
Führen Sie dieses Javascript zu Beginn jedes Seitenaufrufs aus, um das oben genannte Ziel zu erreichen:
((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');
Bearbeiten: Der Grundgedanke dabei ist folgender:
- Bei einem Neustart wird dem Sitzungsspeicher eine zufällige ID in einem Schlüssel namens
tabid
- Der lokale Speicher wird dann mit einem Schlüssel namens
tabs
mit einem Objekt, dessen Schlüssel tabid
wird auf 1 gesetzt.
- Wenn die Registerkarte entladen wird, wird der lokale Speicher
tabs
wird zu einem Objekt aktualisiert, das tabid
auf 0 gesetzt.
- Wenn die Registerkarte neu geladen wird, wird sie zunächst entladen und dann wieder fortgesetzt. Da der Schlüssel des Sitzungsspeichers
tabid
existiert, ebenso wie der lokale Speicher tabs
Schlüssel mit einem Unterschlüssel von tabid
wird der lokale Speicher nicht gelöscht.
- Wenn der Browser entladen wird, wird der gesamte Sitzungsspeicher geleert. Beim Wiederaufnehmen des Sitzungsspeichers
tabid
wird nicht mehr existieren und eine neue tabid
erzeugt werden. Da der lokale Speicher nicht über einen Unterschlüssel für diesen tabid
noch irgendeine andere tabid
(alle Sitzungen wurden geschlossen), ist sie gelöscht.
- Bei einer neu erstellten Registerkarte wird eine neue
tabid
wird im Sitzungsspeicher erzeugt, aber da mindestens ein tabs
[ tabid
] vorhanden ist, wird der lokale Speicher nicht geleert