ralphi: Existenz eines localStorage-Wert

Hi Leute,

ich suche nach einer fehlerfreien Prüfung auf die Existenz eines localStorage-Wert.

folgendes bringt nur Fehlermeldungen :-|

    if(!localStorage["anz"])  
    if("anz" in localStorage)  
    if (localStorage.getItem("anz") == null )  

Was ist eine korrekte Lösung?

Viele Grüße aus LA

--
ralphi
  1. ich suche nach einer fehlerfreien Prüfung auf die Existenz eines localStorage-Wert.

    folgendes bringt nur Fehlermeldungen :-|

    Verrätst du auch, was für Fehlermeldungen, damit wir nicht raten müssen?

    Ansonsten bleibt nur der Hinweis auf die Spezifikation, insbesondere jene zu getItem(). Da ist deutlich beschrieben, was passiert, falls ein Schlüssel nicht vorhanden ist.

    1. Verrätst du auch, was für Fehlermeldungen, damit wir nicht raten müssen?

      sorry
      dachte es ist bekannt (Anfängerfrage)

      if(!localStorage["anz"])  
      //Fehler: Die Eigenschaft "anz" eines undefinierten oder Nullverweises kann nicht abgerufen werden.  
        
      if("anz" in localStorage){  
      //Fehler: Ungültiger Operand für "in": Objekt erwartet  
        
      f(localStorage.getItem("anz")==null){  
      //Fehler: Die Eigenschaft "getItem" eines undefinierten oder Nullverweises kann nicht abgerufen werden.
      

      Viele Grüße aus LA

      --
      ralphi
      1. Hakuna matata!

        //Fehler: Die Eigenschaft "anz" eines undefinierten oder Nullverweises kann nicht
        //Fehler: Ungültiger Operand für "in": Objekt erwartet
        //Fehler: Die Eigenschaft "getItem" eines undefinierten oder Nullverweises kann nicht

        Die Fehler deuten darauf hin, dass die globale Variable localStorage offenbar nicht existiert. Ich vermute, dass du einen Tippfehler in deinem originalen Code hast, den du uns hier nicht zeigst. Oder du benutzt tatsächlich noch den IE7 oder einen ähnlich alten Browser, der localStorage einfach noch nicht kennt.

        --
        “All right, then, I'll go to hell.” – Huck Finn
        1. Die Fehler deuten darauf hin, dass die globale Variable localStorage offenbar nicht existiert. Ich vermute, dass du einen Tippfehler in deinem originalen Code hast, den du uns hier nicht zeigst. Oder du benutzt tatsächlich noch den IE7 oder einen ähnlich alten Browser, der localStorage einfach noch nicht kennt.

          es geht um den IE11 und um eine OFFLINE HTML – Datei, ohne Server
          In Chrom, FF , Opera und Safari (für Windows) klappts.

          localStorage.setItem("test","1");  
          //macht er auch error.
          

          Wo könnte den die Einstellung für die Erlaubnis (Storage) beim IE sein? - Find ich irgendwie nicht.
          Oder macht der IE  ohne Server gar nix mit Storage?

          Viele Grüße aus LA

          --
          ralphi
          1. Hakuna matata!

            Oder macht der IE  ohne Server gar nix mit Storage?

            Ja daran wirds liegen. Es gibt einige Funktionen, die ohne Server nicht funktionieren, im Chrome funktioniert geolocation zum Beispiel nicht. Beim localStorage ist es ja so, dass die Daten zu einer Domain gehören und in einer file://-Adresse gibt es gar keinen Domain-Teil, das kann also durchaus ein guter Grund sein.

            Um sicherzugehen kannst du ja einfach mal einen lokalen Webserver starten, ich benutze für solche Zwecke immer den schmalen Webserver node-static.

            --
            “All right, then, I'll go to hell.” – Huck Finn
            1. mit server gehts.
              Dann installier ich meinem Kunden FF.

              Eh ein komischer Auftrag:

              • Rechnungsdruck
              • nur Anschrift temporär speichern
              • offline
              • mit Standard win7 (wenn möglich noch mit Android)
              • keine DB
              • kein server

              Hab schon überlegt, ob ich nicht VB6 nehme.

              Viele Grüße aus LA

              --
              ralphi
              1. Hab schon überlegt, ob ich nicht VB6 nehme.

                store.js tut auch offline mit IE, Link s.o. und warum das so ist, steht auch alles da. Du kannst das ignorieren oder einfach mal ausprobieren.

                1. Hi,

                  store.js tut auch offline mit IE, Link s.o. und warum das so ist, steht auch alles da. Du kannst das ignorieren oder einfach mal ausprobieren.

                  danke für den Tipp :-)
                  Hab das Beispiel ausprobiert.- Futzt auch nicht.
                  Fehler: Die Eigenschaft "getItem" eines undefinierten oder Nullverweises kann nicht abgerufen werden.
                  store.js arbeitet auch mit local storage.

                  Viele Grüße aus LA

                  --
                  ralphi
                  1. Hi,
                    danke für den Tipp :-)
                    Hab das Beispiel ausprobiert.- Futzt auch nicht.
                    Fehler: Die Eigenschaft "getItem" eines undefinierten oder Nullverweises kann nicht abgerufen werden.

                    Gibts ja auch nicht bei store.js, welche Methoden das hat, steht auf Github.

                    store.js arbeitet auch mit local storage.

                    Und: localStorage wrapper for all browsers without using cookies or flash. Uses localStorage, globalStorage, and userData behavior under the hood

                    (userData seit IE5 wenn ich recht gelesen habe).

                    MfG

                    1. Hakuna matata!

                      Fehler: Die Eigenschaft "getItem" eines undefinierten oder Nullverweises kann nicht abgerufen werden.

                      Gibts ja auch nicht bei store.js, welche Methoden das hat, steht auf Github.

                      store.js benutzt intern aber die getItem()-Methode von localStorage und daher stammt der Fehler. Die Fehlermeldung sagt übrigens nicht, dass die Methode nicht existiert, sondern dass das Objekt, auf dem die Methode aufgerufen werden soll, nicht existiert.

                      --
                      “All right, then, I'll go to hell.” – Huck Finn
                      1. Hakuna matata!

                        Fehler: Die Eigenschaft "getItem" eines undefinierten oder Nullverweises kann nicht abgerufen werden.

                        Gibts ja auch nicht bei store.js, welche Methoden das hat, steht auf Github.

                        store.js benutzt intern aber die getItem()-Methode von localStorage und daher stammt der Fehler. Die Fehlermeldung sagt übrigens nicht, dass die Methode nicht existiert, sondern dass das Objekt, auf dem die Methode aufgerufen werden soll, nicht existiert.

                        Die Fehlermeldung alleine sagt auch nichts darüber aus, was Ralphi da gemacht hat ;)

                        Mein Ding, Dein Ding

                    2. Fehler: Die Eigenschaft "getItem" eines undefinierten oder Nullverweises kann nicht abgerufen werden.

                      Gibts ja auch nicht bei store.js, welche Methoden das hat, steht auf Github.

                      <script src="store.min.js"></script>  
                      <script>  
                          init()  
                          function init() {  
                              if (!store.enabled) {  
                                  alert('Local storage is not supported by your browser. Please disable "Private Mode", or upgrade to a modern browser.')  
                                  return  
                              }  
                              var user = store.get('user')  
                              // ... and so on ...  
                          }  
                      </script>
                      

                      wenn du IE hast, probiers aus. (mit file:///..)
                      Bei mir kommt die Fehlermeldung.
                      „store.js uses localStorage when available, and falls back on the userData behavior in IE6 and IE7.“
                      IE11 hat localStorage - kann ihn nur ohne Server nicht nutzen !

                      Viele Grüße aus LA

                      --
                      ralphi
                      1. hi,

                        wenn du IE hast, probiers aus. (mit file:///..)

                          
                        <!doctype html>  
                        <html>  
                        <head>  
                        <title> Store </title>  
                          
                        <script src="store.min.js"></script>  
                          
                        </head>  
                        <body>  
                          
                        <script>  
                            alert(store.enabled); // true  
                        </script>  
                          
                          
                        </body>  
                        </html>  
                        
                        

                        IE8
                        Version: 8.0.6001.18702

                        Offline, beide Dateien aus dem Dateisystem geladen.

                        1. Hakuna matata!

                          IE8
                          Version: 8.0.6001.18702

                          Offline, beide Dateien aus dem Dateisystem geladen.

                          Du hast offenbar das Problem missverstanden. Der IE11 hat eigentlich einbaute Unterstützung für den localStorage. Das Problem ist aber, dass HTML-Seiten, die über file://-Adressen geöffnet werden, vom IE11 keine Berechtigungen haben den localStorage zu benutzen.

                          store.js merkt nur "Ah hier ist ein Browser, der kann localStorage, also benutze ich den intern doch". store.js merkt nicht, dass der localStorage allerdings gesperrt ist, weil die Seite nicht von einem http-Server stammt. Dementsprechend wird bei store.js auch kein interner Hebel umgelegt, der es dazu veranlassen würde, intern eine andere Speicher-Engine zu benutzen. So geschieht es zum Beispiel, wenn store.js merkt, dass es in einem uralt IE ausgeführt, wo es noch keinen localStorage gibt, in diesem Fall benutzt die Bibliothek intern userData als Fallback.

                          --
                          “All right, then, I'll go to hell.” – Huck Finn
                          1. Hakuna matata!
                            Du hast offenbar das Problem missverstanden. Der IE11 hat eigentlich einbaute Unterstützung für den localStorage. Das Problem ist aber, dass HTML-Seiten, die über file://-Adressen geöffnet werden, vom IE11 keine Berechtigungen haben den localStorage zu benutzen.

                            store.js merkt nur "Ah hier ist ein Browser, der kann localStorage, also benutze ich den intern doch". store.js merkt nicht, dass der localStorage allerdings gesperrt ist, weil die Seite nicht von einem http-Server stammt. Dementsprechend wird bei store.js auch kein interner Hebel umgelegt, der es dazu veranlassen würde, intern eine andere Speicher-Engine zu benutzen. So geschieht es zum Beispiel, wenn store.js merkt, dass es in einem uralt IE ausgeführt, wo es noch keinen localStorage gibt, in diesem Fall benutzt die Bibliothek intern userData als Fallback.

                            Jow. So siehts aus. Und genauso würde ich das Problem auch lösen. Siehe mein Post von gestern abend.

                            MfG

                            1. Hakuna matata!

                              Jow. So siehts aus. Und genauso würde ich das Problem auch lösen. Siehe mein Post von gestern abend.

                              Ich habe doch erklärt, dass store.js haargenau das selbe Porblem wie die vanilla Variante mit dem localStorage hat. Ich weiß nicht, wie ich es noch anders formulieren könnte, sodass du es verstehst. store.js ist ganz nett, aber es trägt hier eben rein gar nichts zur Problemlösung bei.

                              --
                              “All right, then, I'll go to hell.” – Huck Finn
                              1. Hakuna matata!

                                Jow. So siehts aus. Und genauso würde ich das Problem auch lösen. Siehe mein Post von gestern abend.

                                Ich habe doch erklärt, dass store.js haargenau das selbe Porblem wie die vanilla Variante mit dem localStorage hat. Ich weiß nicht, wie ich es noch anders formulieren könnte, sodass du es verstehst. store.js ist ganz nett, aber es trägt hier eben rein gar nichts zur Problemlösung bei.

                                Das hier ist die Problemlösung: Mit einem Metatag (gestern beschrieb ich die Variante mit HTTP-Header) den Kompatibilitätsmodus für IE7 oder IE8 erzwingen (Fallback to userData).

                                Ob das mit IE11 funktioniert, kann ich leider nicht testen.

                                MfG

                                1. Hakuna matata!

                                  Das hier ist die Problemlösung: Mit einem Metatag (gestern beschrieb ich die Variante mit HTTP-Header) den Kompatibilitätsmodus für IE7 oder IE8 erzwingen (Fallback to userData).

                                  Gestern hast du den umgekehrten beschrieben, wie man den Internet-Explorer dazu veranlasst immer die aktuellste Rendering-Engine (IE=Edge) zu benutzen.

                                  Aber selbst mit dem Weg, den du jetzt vorschlägst (IE=EmulateIE7), bezweifle ich, dass das den internen Hebel von store.js umlegt. Der Kompaitbilitäts-Modus richtet sich nämlich vor allem die Rendering-Engine und nicht so sehr an die JavaScript-Engine. Ich habe leider keinen IE zu Hause, um das zu testen.

                                  Aber auch dann, ist das wohl kaum eine adäquate Lösung, weil man sich natürlich haufenweise Scherereien einhandelt, die typisch für den IE7 waren, und weil der IE12 oder spätere Versionen die Kompaitibilitäts-Modi sowieso nicht mehr unterstützen werden, Microsoft hat diese mit dem IE11-Release als deprecated eingestuft: http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx

                                  --
                                  “All right, then, I'll go to hell.” – Huck Finn
                                  1. Hakuna matata!

                                    Das hier ist die Problemlösung: Mit einem Metatag (gestern beschrieb ich die Variante mit HTTP-Header) den Kompatibilitätsmodus für IE7 oder IE8 erzwingen (Fallback to userData).

                                    Gestern hast du den umgekehrten beschrieben, wie man den Internet-Explorer dazu veranlasst immer die aktuellste Rendering-Engine (IE=Edge) zu benutzen.

                                    Es gibt ja noch mehr Emulate-Modi, soll ich Dir raussuchen?

                                    Aber selbst mit dem Weg, den du jetzt vorschlägst (IE=EmulateIE7),

                                    IE8 würde ich emulieren.

                                    Aber auch dann, ist das wohl kaum eine adäquate Lösung, weil man sich natürlich haufenweise Scherereien einhandelt, die typisch für den IE7 waren, und weil der IE12 oder spätere Versionen die Kompaitibilitäts-Modi sowieso nicht mehr unterstützen werden, Microsoft hat diese mit dem IE11-Release als deprecated eingestuft: http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx

                                    Am Anfang steht immer eine Idee, dann eine Entscheidung und ob die richtig war, zeigt sich meistens sehr viel später. Ideen habe ich schon immer gehabt und viele davon auf meiner Site nicht nur umgesetzt, sondern auch beschrieben, von ehemals i-netlab.de (1999) bis heute auf rolfrost.de, da gibt es keinen Stillstand trotz einiger Entscheidungen, die sich im nachhinein als nicht ganz so glücklich erwiesen haben. Und wenn mir eines Tages die Ideen ausgehen würden, wäre ich kein Entwickler mehr.

                                    Wenn jemand meine Ideen aufgreift, was tatsächlich auch sehr oft passiert, freut mich das, wenn auch die feedbacks heutzutage selten sind. Was mich weniger freut, sind Beiträge von solchen Leuten wie Du, die es nicht lassen können, meine Ideen mit allen Mitteln schlecht zu machen.

                                    MfG

                                    1. Hakuna matata!

                                      Was mich weniger freut, sind Beiträge von solchen Leuten wie Du, die es nicht lassen können, meine Ideen mit allen Mitteln schlecht zu machen.

                                      Ich will deine Ideen nicht schlecht machen, ich will sie diskutieren. Derzeit stehen drei sachliche Argumente im Raum, warum IE-Kompaitbilitäts-Modi keine gute Lösung sind:

                                      1. Sie liefern schlicht keine Antwort, auf das hier vorliegende Problem. Die Kompatibilitäts-Modi adressieren vornehmlich die Rendering-Engine, nicht die JavaScript-Engine.
                                      2. Sie sind von offizieller Seite als veraltet eingestuft, d.h. dass sie in zukünftigen Internet-Explorern nicht mehr zur Verfügung stehen.
                                      3. Eine Anwendung die im Kompatibilitätsmodus läuft, hat mit all den Darstellungsfehlern des emulierten Browsers zu kämpfen, was im Falle von IE7 oder IE8 nicht gerade wenig wären.

                                      Es ist schade, dass du nicht bereit bist, diese Argumente sachlich auszudiskutieren und mir stattdessen unterstellst, ich zerrede deine Beiträge.

                                      Bitte wirf auch mal einen Blick auf deine letzten paar Threads zu deinen Blog-Veröffentlichungen, dort war ich stets einer der wenigen konstruktiven Kritiker. Leider sind auch da Antworten von dir eher selten, obwohl ich sehe, dass du im Hintergrund einige meiner Vorschläge beherzigst und in die Tat umsetzt.

                                      Ich bin ein Herzensfreund von ergebnisoffnenen Diskussionen, das Prinzip muss allerdings auf Gegenseitigkeit stoßen, um zu fruchten.

                                      --
                                      “All right, then, I'll go to hell.” – Huck Finn
  2. Hakuna matata!

    folgendes bringt nur Fehlermeldungen :-|

    if(!localStorage["anz"])

    if("anz" in localStorage)
        if (localStorage.getItem("anz") == null )

      
    Kann ich nicht nachvollziehen.  
    
    -- 
    “All right, then, I'll go to hell.” – Huck Finn
    
  3. Hi Leute,
    Was ist eine korrekte Lösung?

    Egal :)

    Schnapp Dir store.js, das ist einfacher in der Handhabe.

    Ggf. setze header('X-UA-Compatible' => 'IE=Edge');

    MfG