2014-09-29 69 views
1

我已经用user_name登录做了一个localStorage,我已经将我的JSON数据(条目)的字符串解析为一个普通对象。用户:index未定义?

但是,如果我试图安慰登录entry.username让我的存储的用户还能得到“未定义”?

我怀疑是我的用户:指数代码是搞乱了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(); 
+0

你能告诉我们HTML并告诉我们你点击/键入了什么吗?也许做一个小提琴 – 2014-09-29 12:34:08

+1

也似乎索引是从本地存储中读取的字段,然后在init方法中分配一个值。您是否尝试过只读取已赋值的值?所以你的init会在第一次设置index = 1。为什么要读取可能未定义的值并将其添加1? – xDaevax 2014-09-29 12:45:01

+0

@LoganMurphy [的jsfiddle(http://jsfiddle.net/yv04x4mw/2/) – Hanshof 2014-09-29 14:07:47

回答

0

你是对的它是用户:指数造成这个问题。您可以使用以下代码修复它。

for(var i = 1; i < User.index; i++) { 
    var key = "User:" + i; 
    var entry = JSON.parse(localStorage[key]); 
    console.log("entry : ", key, entry); 
    ... 

http://jsfiddle.net/yv04x4mw/6/

我还建议不要创建帐户这种方式(除非你有一个很好的理由),还使用了JavaScript库像jQuery。

1

问题是localStorage中的数据。您的登录功能假设存储在localStorage中的所有条目都是您的User条目类型。但是当你开始存储其他东西时,你没有检查确认类型是你期望的。

这里:

 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); 
     } 

,实际上是失败的是该行:entry = JSON.parse(window.localStorage.getItem(key));,因为在循环结束时,在localStorage的类型是User:index,不User:3

如果您打算在localStorage的有更多的事情,你应该在你的循环添加一个检查,比如这个:

 for (var i = 0; i < localStorage.length; ++i) { 
      var key = localStorage.key(i); 
      var reg = new RegExp("User\:\\d+$"); 
      //Only process user entries 
      if(reg.test(key)) { 

       var value = localStorage[key]; 
       entry = JSON.parse(window.localStorage.getItem(key)); 
       console.log(entry.user_name); 
       console.log(entry); 
      } // end if 
     } 

这里是一个小提琴:http://jsfiddle.net/xDaevax/Lo63vftt/

免责声明:我改变一些其他的事情,以便它更有效地为小提琴工作,你可以忽略我做的其他改变。

+0

downvoter会照顾解释的推理,所以我可以改善答案? – xDaevax 2014-09-29 15:22:51

+0

localstorage中键的顺序可能不一定映射到循环的'i'变量,因此您可能永远不会通过'if'中的布尔测试。 – 2014-09-29 15:29:59

+0

因为键按字母顺序排列1,10,11,2,3,4,5 ...但i是数字的1,2,3,4,5和 – 2014-09-29 15:31:26