Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript document.ready中的localstorage在某些设备上加载失败_Javascript_Local Storage_Web Storage - Fatal编程技术网

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

Javascript document.ready中的localstorage在某些设备上加载失败,javascript,local-storage,web-storage,Javascript,Local Storage,Web Storage,在嵌入android webview的我的webapp中,我有一个登录页面: db对象只是一个localstorage函数包装器。 页面中有一个简单的登录表单,有3个输入字段:电子邮件、密码和“记住我”复选框。 登录函数只是向服务器发出一个ajax请求,而不是调用一个回调函数,该函数只是在本地存储中设置用户ID、令牌和一些其他信息,然后重定向到主页: function loginOK(data) { hideLoading(); data = JSON.p

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

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

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和token在重定向后在登录页面中再次可用

怎么可能呢? 我发现有些人在处理document.ready handler函数中的localstorage时遇到问题,但我还没有找到任何官方解释,说明这是否是一种错误用法。老实说,我不认为这是错的

那么,问题在哪里

更新:数据库对象定义:

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

您可以自己尝试一些简单的调试。如果支持localStoreage,则ifwindow.localStorage返回true。先检查一下。之后,尝试将localStoreage的全部内容转储到日志或其他内容中,然后查看存储的内容。我的五美分。但是,我想这是一个问题,因为并非所有设备都支持本地存储。顺便说一句,javascript中的身份验证根本不安全。您好,我已经进行了一些调试,并且支持本地存储。此外,如您所见,在重定向到列表页面之前,我执行了相同的authenticateUSer函数,该函数在localstorage中查找信息。最终的证明是,如果生成循环,这意味着自动登录成功,然后在2°重定向登录->列表,列表->登录否后,信息在登录页面中再次可用,我想一定有一个更棘手的问题,可能与本地存储性能和实现有关,或者从内存/磁盘读取/写入。isset是如何创建的?在文档中看不到该方法。只是用db对象定义更新了问题我意识到在webview失败的相同设备上,相同的应用程序在通过标准android浏览器加入其在线版本时工作正常!
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();