Ich war fast am Verzweifeln, weil mein aktuell in Arbeit befindliche PhoneGap-App nicht so wollte wie ich. Ich bin wieder am Vorbereiten von Trainings bei Video2Brain und beschäftige mich dazu im Moment auch mit den Neuerungen von PhoneGap 3. Und zu Testzwecken erstelle ich gerade eine neue App zum Lernen von Vokabeln (auch in der Hoffnung, dass meine Jungs die für Englisch oder Latein nutzen).
Nun will ich die Vokabeln im Local Storage speichern. Und die Arbeit mit PhoneGap ist auch deswegen so schön, weil man viele Sachen im Webbrowser testen kann, bevor man sie in eine App portiert.
Also genau das gemacht – erst eine RIA erstellt und dann daraus die PhoneGap-App erzeugt.
Soweit, so gut. Nur hat die Geschichte auf meinem Smartphone nicht so funktioniert, wie in meiner RIA.
Und es war einfach nicht nachzuvollziehen, wo der Fehler liegt.
Ich hab den gesamten Quellcoce auf den Kopf gestellt, JavaScript mit JSLint optimiert, dann sogar auf Speichern auf dem Dateisystem umgestellt, etc. Und mit jeder Optimierung wurde es schlimmer … :-(. Kennt man ja.
Dann bin ich wieder auf meinen ursprünglichen Stand, den ich aus der RIA gehabt habe, zurück. Und hab die RIA mal im Chrome getestet, denn mir war mittlerweile aufgefallen, dass das JSON-Format, das ich zum Speichern der Vokabeln verwende, einen undefined-Index hatte. In der Android-App wohlgemerkt. Und im Firefox als RIA nicht. Im Chrome hingegen, der ja auch auf Webkit basiert, kam dieser undefined-Index auch!
Und das ist die Lösung – in Webkit wird wohl die Eigenschaft length von JavaScript-Arrays falsch geführt bzw. sie steht nicht zur Verfügung. Das kann nur ein Bug in der Engine sein oder aber eine Standard-widersprechende propiertäre Eigenheit. Was eine Arbeit, das rauszufinden.
Ein Workaround nutzt die Methode size() von jQuery. Aber die Besonderheiten von Webkit gehen noch weiter, denn auch getItem() liefert aus dem Storage ein leeres Objekt. Zumindest die String-Repräsentation. Das ist auch nicht so, wie man es m.E. zu erwarten hat. Da sollte null oder undefined kommen. Auch den Bug muss man bewusst bei einer PhoneGap-App einkalkulieren und umschiffen.
Frage mich wirklich, warum die blöden JavaScript-Engines immer noch so unterschiedlich arbeiten? Zumindest wenn man hart am Wind segelt.