document.ready中的localstorage在某些设备上加载失败

时间:2014-04-12 15:19:16

标签: javascript local-storage web-storage

在我的webapp(嵌入在android webview中)中,我有一个登录页面:

$( document ).ready(function() {

   if (db.isset("rememberMe") && db.get("rememberMe") == '1' && db.isset("passwordHash") && db.isset("email")) {      
       login(db.get("email"), db.get("passwordHash"));
   }
});

//verify that there are some authentication info in the localstorage
function authenticateUser() {
    if (!db.isset("userID") || !db.isset("token"))  {
        window.location.href ='login.html';
        return false;
        } else return true;
    }

db对象只是一个localstorage函数包装器。 在页面中有一个简单的登录表单,有3个输入字段:电子邮件,密码和"记住我"复选框。 login函数只是向服务器发出一个ajax请求,而不是调用一个回调函数,该函数只是在本地存储中设置userID,token和其他一些信息,然后重定向到主页面:

function loginOK(data) {
          hideLoading();
          data = JSON.parse(data);
          if (data.header.responseCode == "000") {
            if ($("#rememberMeButton").is(':checked')) {
              db.set("rememberMe", "1");
              db.set("passwordHash", data.body.passwordHash);
              }
            else db.set("rememberMe", "0");

            db.set("email", data.body.email);
            db.set("userID", data.body.userID);
            db.set("token", data.body.token);

            if(authenticateUser()) window.location.href="lists.html";

lists.html 页面中,第一个操作是对未登录访问的控件:

$( document ).ready(function() {
      if (!authenticateUser()) return; //IMPORTANT!
      getLists(); //get user's lists infos
});

一切看起来都很简单,实际上这个代码几乎可以在我测试过的所有移动设备上运行良好,但在其他一些设备上却失败了。在这些设备上,如果用户成功登录,则重定向到lists.html页面,但由于某种原因,他被重定向回登录(authenticateUser函数返回false)。另外,如果他设置了“记住我”复选框,则会生成无限循环!!!

我们可以扣除3次: 1)如果用户被重定向到列表页面,则意味着authenticateUser func在登录页面上返回true,因此信息存储在localstorage中。 2)如果authenticationUsers在列表页面中失败,则表示在localStorage中找不到此类信息 3)当重定向回登录页面时,如果用户之前设置了“记住我”选项,则会触发自动登录,并且由于服务器返回成功。这意味着重定向后,登录页面中再次提供三个数据(rememberMe值,userID和令牌)。

怎么可能? 我发现有些人在处理文档中的本地存储时遇到了问题。处理器功能,但我还没有找到任何官方解释,这是错误的用法。而且,说实话,我不认为这应该是错的。

那么,问题在哪里?

更新:db对象定义:

function memoryManager() {
            //set an item
            this.set=set;
            function set(name, value) {
                if (value == undefined || value === undefined || value === null ) { return false; }
                //if is an object json-encode it!
                if (typeof value === "object") value = JSON.stringify(value);
                localStorage.setItem(name, value);
                return true;
            }

        //get an item
        this.get = get;
        function get(name) {
            if (localStorage.getItem(name) === null) return null;
            value = localStorage.getItem(name);
            //check if it is an json encoded object or a simple value
            try { JSON.parse(value); }
                catch (e) { return value; }
            return JSON.parse(value);
        }
        //is set an item?
        this.isset = isset;
        function isset(name) {
            if (localStorage.getItem(name) === null) return false;
            else return true;
        }

    }
    //create instance:
    var db = new memoryManager();

0 个答案:

没有答案