Si je n'avais pas besoin de localStorage, mon code ressemblerait à ceci:
var names=new Array();
names[0]=Prompt("New member name?");
Cela marche. Cependant, j'ai besoin de stocker cette variable dans localStorage, ce qui s'avère assez têtu. J'ai essayé:
var localStorage[names] = new Array();
localStorage.names[0] = Prompt("New member name?");
Où vais-je mal?
localStorage
ne prend en charge que les chaînes. Utilisez JSON.stringify()
et JSON.parse()
.
var names = [];
names[0] = Prompt("New member name?");
localStorage.setItem("names", JSON.stringify(names));
//...
var storedNames = JSON.parse(localStorage.getItem("names"));
Les variables localStorage
et sessionStorage
ne peuvent gérer que des chaînes. Vous pouvez étendre les objets de stockage par défaut pour gérer les tableaux et les objets. Incluez simplement ce script et utilisez les nouvelles méthodes:
Storage.prototype.setObj = function(key, obj) {
return this.setItem(key, JSON.stringify(obj))
}
Storage.prototype.getObj = function(key) {
return JSON.parse(this.getItem(key))
}
Utilisez localStorage.setObj(key, value)
pour enregistrer un tableau ou un objet et localStorage.getObj(key)
pour le récupérer. Les mêmes méthodes fonctionnent avec l'objet sessionStorage
.
Si vous utilisez uniquement les nouvelles méthodes pour accéder au stockage, chaque valeur sera convertie en chaîne JSON avant l'enregistrement et analysée avant d'être renvoyée par le getter.
Source: http://www.acetous.de/p/152
Utilisez JSON.stringify()
et JSON.parse()
comme suggéré par no! Cela évite le problème, peut-être rare mais possible, d'un nom de membre qui inclut le délimiteur (par exemple, nom de membre three|||bars
).
Je viens de créer ceci:
https://Gist.github.com/3854049
//Setter
Storage.setObj('users.albums.sexPistols',"blah");
Storage.setObj('users.albums.sexPistols',{ sid : "My Way", nancy : "Bitch" });
Storage.setObj('users.albums.sexPistols.sid',"Other songs");
//Getters
Storage.getObj('users');
Storage.getObj('users.albums');
Storage.getObj('users.albums.sexPistols');
Storage.getObj('users.albums.sexPistols.sid');
Storage.getObj('users.albums.sexPistols.nancy');
L’approche JSON fonctionne, c’est-à-dire que vous avez besoin de json2.js, il fonctionne parfaitement et malgré le commentaire qui dit sinon il y a un stockage local sur celui-ci. il semble vraiment que la meilleure solution avec le moins de tracas. Bien sûr, on pourrait écrire des scripts pour faire essentiellement la même chose que json2 mais cela n’a guère d’intérêt.
au moins avec la chaîne de version suivante, il y a localStorage, mais comme indiqué, vous devez inclure json2.js car le navigateur lui-même ne l'inclut pas: 4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2 ; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; BRI/2; NP06; .NET4.0C; .NET4.0E; Zune 4.7) (J'aurais fait ceci un commentaire sur la réponse, mais ne peut pas).
Une autre solution serait d’écrire un wrapper qui stocke le tableau comme ceci:
localStorage.setItem('names_length', names.length);
localStorage.setItem('names_0', names[0]);
localStorage.setItem('names_1', names[1]);
localStorage.setItem('names_' + n, names[n]);
Supprime la surcharge liée à la conversion en JSON, mais serait gênant si vous devez supprimer des éléments, car vous devrez réindexer le tableau :)