如果我不需要localStorage,我的代码将如下所示:
var names=new Array();
names[0]=prompt("New member name?");
这是可行的。然而,我需要将这个变量存储在localStorage中,事实证明它非常顽固。我尝试过:
var localStorage[names] = new Array();
localStorage.names[0] = prompt("New member name?");
我哪里出错了?
如果我不需要localStorage,我的代码将如下所示:
var names=new Array();
names[0]=prompt("New member name?");
这是可行的。然而,我需要将这个变量存储在localStorage中,事实证明它非常顽固。我尝试过:
var localStorage[names] = new Array();
localStorage.names[0] = prompt("New member name?");
我哪里出错了?
当前回答
另一种解决方案是编写一个包装器来存储数组,如下所示:
localStorage.setItem('names_length', names.length);
localStorage.setItem('names_0', names[0]);
localStorage.setItem('names_1', names[1]);
localStorage.setItem('names_' + n, names[n]);
消除了转换为JSON的开销,但如果需要删除元素,则会很麻烦,因为您必须重新索引数组:)
其他回答
localStorage和sessionStorage只能处理字符串。您可以扩展默认存储对象以处理阵列和对象。只需包含此脚本并使用新方法:
Storage.prototype.setObj = function(key, obj) {
return this.setItem(key, JSON.stringify(obj))
}
Storage.prototype.getObj = function(key) {
return JSON.parse(this.getItem(key))
}
使用localStorage.setObj(key,value)保存数组或对象,使用localStorage.getObj(key)检索它。同样的方法也适用于sessionStorage对象。
如果您只是使用新方法访问存储,那么在保存之前,每个值都将转换为JSON字符串,并在getter返回之前进行解析。
localStorage仅支持字符串。使用JSON.stringify()和JSON.parse()。
var names = [];
names[0] = prompt("New member name?");
localStorage.setItem("names", JSON.stringify(names));
//...
var storedNames = JSON.parse(localStorage.getItem("names"));
您还可以使用直接访问来设置/获取项目:
localStorage.names = JSON.stringify(names);
var storedNames = JSON.parse(localStorage.names);
JSON方法是有效的,在ie 7上,你需要json2.js,有了它,它可以完美地工作,尽管有一条评论说它上面有localStorage。它看起来真的是最简单的解决方案。当然,可以编写脚本来做与json2基本相同的事情,但这没有什么意义。
至少在下面的版本字符串中有localStorage,但正如前面所说,您需要包含json2.js,因为浏览器本身不包含它:4.0(兼容;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;.NET 4.0C;.NET 4.0E;Zune 4.7)(我本想对回复发表评论,但不能)。
按照no!这可以防止包含分隔符的成员名称(例如,成员名称三个|||条)出现可能罕见但可能出现的问题。
另一种解决方案是编写一个包装器来存储数组,如下所示:
localStorage.setItem('names_length', names.length);
localStorage.setItem('names_0', names[0]);
localStorage.setItem('names_1', names[1]);
localStorage.setItem('names_' + n, names[n]);
消除了转换为JSON的开销,但如果需要删除元素,则会很麻烦,因为您必须重新索引数组:)