我问过一个similar question,但是很多人都很困惑,很多评论都没有意义(就像有人评论 jQuery重载...... 而且这无关用jQuery)。
所以这是我的问题,如何添加到HTML5 localStorage对象并创建一个名为addItem()的自定义函数?它可以像:
一样使用localStorage.getItem('names').addItem('Bill').getItem('names');
或
localStorage.getItem('names').addItem('Bill');
上次有人吓坏了,问为什么我会两次做getItem。第一个getItem将获取名称中的项目。名字中总会有一些东西。 addItem将添加到名称,然后,getItem将再次返回名称,但Bill会在里面。
现在,对我来说,它像第二个例子一样工作也同样有益。 getItem将返回名称,addItem会将Bill添加到名称中,然后返回所有名称,包括bill。
我可以做setItem,它是HTML5 API的一部分,但它很痛苦:
var names = JSON.parse(localStorage.getItem("names"));
names.push("Bill");
localStorage.setItem("names", JSON.stringify(names));
答案 0 :(得分:4)
Anurag的建议听起来像是最好的解决方法(Mozilla Hacks demonstrates the other option he outlines),但为了更进一步,让它可以链接,你可以做类似的事情:
var MyLocalStorage = {};
MyLocalStorage.getItem = function(key) {
return new MyItem(JSON.parse(localStorage.getItem(key)));
};
MyLocalStorage.setItem = function(key, object) {
localStorage.setItem(key, JSON.stringify(object));
return this.getItem(key);
};
function MyItem(object, key) {
this.item = object;
this.key = key;
this.addSubItem = function(subItem) {
if (typeof this.item.push == 'function') {
this.item.push(subItem);
this.save();
return this;
}
return false;
};
this.setItem = function(object) {
this.item = object;
this.save();
return this;
};
this.save = function() {
MyLocalStorage.setItem(this.key, this.item);
};
this.toString = function() {
return this.item.toString();
}
}
然后你就可以使用它:
alert(
MyLocalStorage
.setItem('names', ['john', 'paul', 'ringo'])
.addSubItem('george')
.toString()
);
BTW:几乎不可能在LocalStorage对象上找到官方文档(例如在MDC或任何其他在线JS文档库中)。
答案 1 :(得分:2)
Storage API存储一个键值对,这两个值都是字符串。所以他们需要以某种方式序列化,然后在检索时反序列化。在您的示例中,您使用JSON作为(反)序列化机制。
getItem
将始终返回您存储的字符串。在从对象中取出对象之前,必须对其进行反序列化。您可以修改本机getItem
函数并在内部执行(反)序列化,或者为localStorage
编写一个包装器来为您执行此操作。请在重新发布问题之前阅读其他答案。这就是其他答案所说的。他们没有说你必须使用jQuery 。编写包装器非常简单。
var MyLocalStorage = {};
MyLocalStorage.getItem = function(key) {
return JSON.parse(localStorage.getItem(key));
};
MyLocalStorage.setItem = function(key, object) {
localStorage.setItem(key, JSON.stringify(object));
};