【发布时间】:2014-11-23 20:21:32
【问题描述】:
我已经使用用户名登录创建了一个 localStorage,并且我已经将我的 JSON 数据(条目)的字符串解析为一个普通对象。
但是,如果我尝试控制台登录 entry.username,我会得到我存储的用户,但也会得到一个“未定义”?
我怀疑是我的 User:index 代码弄乱了 entry.user_name?
var User = {
index: window.localStorage.getItem("User:index"),
$form: document.getElementById("userReg"),
$button_register: document.getElementById("registerUser"),
$button_login: document.getElementById("logIN"),
init: function() {
// initialize storage index
if (!User.index) {
window.localStorage.setItem("User:index", User.index = 1);
}
User.$form.addEventListener("submit", function(event) {
var entry = {
id: parseInt(this.id_entry.value),
user_name: this.user_name.value,
};
if (entry.id == 0) {
User.storeAdd(entry);
}
}, true);
User.$button_login.addEventListener("click", function(entry) {
for (var i = 0, len = localStorage.length; i < len; ++i) {
var key = localStorage.key(i);
var value = localStorage[key];
entry = JSON.parse(window.localStorage.getItem(key));
console.log(entry.user_name);
}
if (document.getElementById("firstName").value == entry.user_name) {
alert("You have logged in");
} else {
document.getElementById("negative").innerHTML = "Username does not match"
}
}, true);
},
storeAdd: function(entry) {
entry.id = User.index;
window.localStorage.setItem("User:index", ++User.index);
window.localStorage.setItem("User:" + entry.id, JSON.stringify(entry));
},
};
User.init();
【问题讨论】:
-
您能向我们展示 HTML 并告诉我们您点击/输入的内容吗?也许做一个小提琴
-
在您在 init 方法中分配值之前,索引似乎也是从本地存储中读取的字段。如果已分配一个值,您是否尝试过仅读取该值?因此,您的 init 将第一次设置 index = 1 。为什么要读取可能未定义的值并将其加 1?
-
@LoganMurphy JSFiddle
-
@xDaevax 不太清楚你的意思是什么我应该在 init 方法之后为索引赋值......或者你能举个例子吗?
-
经过进一步调查,您的循环似乎是问题的一部分。您的索引始终为 n+1(由于
User:index本地存储条目),但在您的循环中,您没有考虑到这一事实。给定本地存储中的 3 个元素 +User:index,您的 for 循环中的迭代器限制将为 4,在最后一个索引上给出undefined,因为 localStorage[4] 是User:index而不是用户条目,因此 JSON 解析会失败并给你未定义的。
标签: javascript json html local-storage