• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

localStore .clear() wird nicht gefeuert.

xorg1990

New member
Ich muss Heute noch ne Frage raushauen Weil ich am 28ten zur 25Jahre Feier mein Projekt vorstellen wollte.
Egal...
Jedenfalls speicher ich via JSON.stringify ein JS Array in localeStore ab , was soweit geht.

Beim ersten mal laden der Seite ist noch nichts gespeichert das überprüfe ich via IF abfrage.

Code:
if(localStorage.getItem("deleted") !== null){
			deletedRecIndex = JSON.parse(localStorage.getItem("deleted"));
}
Wobei das Item deleted ein JS array mit Zahlen ist
deletedRecIndex = [1, 2]; Das wird irwo auf der Seite durch ein click event gesetzt.
Jetzt geht er ins obige If rein. Soweit so gut.

Lösche ich nun den Store via clear() und gehe erneut in die IF Abfrage ist der Store wie zu Erwarten leer. Er geht nicht rein.

Lade ich aber die Seite neu geht er ins if rein?? Wieso schnall ich nicht.
Ich habe mal ein paar console logs gemacht:
localStorage.getItem("deleted") // [];
typeof localStorage.getItem("deleted") String

nach den JSON.parse
deletedRecIndex.length // 0
typeof deletedRecIndex // object.

Wieso geht er da rein und wiso ist mein Array ein Object?

Ps: sind meine ersten versuche mit den localStore
 
bin mir nicht sicher aber dbei test auf null da kann auch undefined zurück gegeben werden.
es genügt wenn du if(localStorage.getItem("deleted")){} oder if(!localStorage.getItem... verwendest. Arrays lassen sich nicht speichern nur Strings ,aber du kannst ja Array.toString() versuchen.
oder mit JESON. oder gleich html :)
hier ein Link zum testen ob dein Browser genug Speicher dafür hergibt Web Storage Support Test
 
andreax schrieb:
bin mir nicht sicher aber dbei test auf null da kann auch undefined zurück gegeben werden.
Das sollte eigentlich null sein:
The getItem(key) method must return the current value associated with the given key. If the given key does not exist in the list associated with the object then this method must return null.
https://www.w3.org/TR/webstorage/#dom-storage-getitem

andreax schrieb:
es genügt wenn du if(localStorage.getItem("deleted")){} oder if(!localStorage.getItem... verwendest.
Hatte ich schon so stehen, bringt nix.


andreax schrieb:
du kannst ja Array.toString() versuchen.
Nee JSON.stringify ist schon richtig, alle JS Objekte (Was so ziemlich alles ist) werden so zum string geparst. JSOn.parse macht wider ein JS Objekt daraus.
When obj is an array like [1,2,3] then .toString() gives:

"1,2,3"
And JSON.stringify:

"[1,2,3]"
These are close but not quite the same, the JSON serialized one has no ambiguity with commas and directly runs as Javascript or can be parsed as JSON.

See:

["1,",2,3].toString();
//"1,,2,3" ... so you can't just split by comma and get original array
//it is in fact impossible to restore the original array from this result

JSON.stringify(["1,",2,3])
//'["1,",2,3]'
//original array can be restored exactly
javascript - What's the difference in using toString() compared to JSON.stringify()? - Stack Overflow

andreax schrieb:
hier ein Link zum testen ob dein Browser genug Speicher dafür hergibt
Cool, kannte ich noch nicht, aber sollte reichen für ein Array mit max 4 eingräten.

Ich erstelle gleich mal einen neues File zum testen, da mein code schon 2000 Zeilen fast, nicht das ich da was übersehe. Was wiederum ausgeschlossen ist da setItem nur einmal vorkommt.

Array.pop ist auch komisch, da kommt immer 0 raus, wenn das array aber leer ist sollte da undefined kommen.

- - - Aktualisiert - - -

Eigenartig mein test Skript funktioniert:
Code:
<!DOCTYPE html>
<html>
	<head>
		<title>localStorage_test</title>
			<script src="localforage.min.js"></script>
	<script>
		function run(){
			var testArray = [];
			var obj = {};
			obj.irgendwas ="Irgendwas";
			var checkBtn = document.querySelector("#checkBtn");
			var delBtn = document.querySelector("#delBtn");
			var setBtn = document.querySelector("#setBtn");

			localforage.config({
				 driver: [localforage.INDEXEDDB],
    			name: 'Middle_wave_transmitter',
    			"storeName" : "records"
			});

			(function(){
					if(localStorage.getItem("test")){
						var a = JSON.parse(localStorage.getItem("test"));
						console.log("Beim ersten aufruf sollte dies nicht zu sehen sein", a)
					}
			})();

		function check(){
			if(localStorage.getItem("test")){
						var a = JSON.parse(localStorage.getItem("test"));
						console.log("Beim button klick sollte dies nicht zu sehen sein" , a)
					}
		}

		function del(){
			localStorage.clear();//localStorage.removeItem("test");
		}

		function set(){
			localforage.setItem("test", JSON.stringify(testArray));
			localStorage.setItem("test", JSON.stringify(testArray));
		}

		checkBtn.onclick = function(){
			check();
		}

		delBtn.onclick = function(){
			del();
		}

		setBtn.onclick = function(){
			set();
		}

		}
	</script>
	</head>
<body onload="run()">
	<button id="checkBtn">check</button><br>
	<button id="delBtn">del</button><br>
	<button id="setBtn">set</button><br>

</body>
	</html>
Habe extra localforage eingebunden weil ich beides verwende.
geht. Jetzt heist es 2000 Zeile durchwühlen obwohl ich weiß das setItem nur einmal vorkommt

- - - Aktualisiert - - -

Ich bin so ein Hack Horst. Ich habe ganz unten im code ein onbeforeunload, damit wenn jemand den Browser schließt Einstellung gespeichert werden. Und da habe ich das leere Array in den Store gepackt. Also muss ich ins if noch ein if machen und gucken ob das Array leer ist oder nicht.
 
Zuletzt bearbeitet:
Wieso geht er da rein und wiso ist mein Array ein Object?
Die erste Frage hast du ja geklärt. Zur Zweiten: typeof ist nicht immer wirklich intuitiv. Es kann auch nur "string", "number", "boolean", "symbol", "function", "undefined" und "object" zurückgeben. Und das meiste liefert "object" (auch z.B. null...)
 
Jo, ist mir dann auch eingefallen, in JS ist ja fast alles ein Objekt. Ein Array ist ein Objekt. Also stimmt die Ausgabe von typeof. Hätte lieber instanceof nehmen sollen.
 
Zurück
Oben