HTML5   发布时间:2022-04-25  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了HTML5上localStorage键值赋值与更新兼容性探讨大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

  去年年末上线的系统,有个非正常使用问题,困扰技术人员一年了。现象是这样的:在同一个终端IE浏览器上,使用不同帐号处理流程业务时,这是可能发生串帐号的问题,也就是说流程处理人不对了,而Chrome浏览器无此问题。

  今天下午,又陪技术人员分析代码,给出建议是针对IE浏览器强制清空localStorage。下班时,技术人员告诉我可以解决问题。晚上,我通过VPN网络访问SVN,查看代码修改情况,通过SVN代码版本对比,解决是如此简单,如下图所示。

HTML5上localStorage键值赋值与更新兼容性探讨

  对登录页login.html仅增加了三行JS代码,在每次进行登录操作时,首先清除localStorage缓存,如下所示:

//使用COrdys自带的SSO插件进行登录
    if(window.localStorage.currentUserid){
        window.localStorage.clear();
    }
    if (!CordysRoot.sso) {
            if (!(CordysRoot.application && CordysRoot.sso)) {
                if (window.count < 11)
                    setTimeout(function () {
                        window.count++;
                        doLogin();
                    },333);
                else
                    alert('网络不给力,请重试');
                return;
            }
        CordysRoot.application.addType(CordysRoot,"wcp.library.system.SSO");
    }

  不过,我就此又深入分析自行开发代码“rgdb.utils.js”中关于localStorage键值处理,代码片段如下所示:

/** * 在当前域名下加载租户账号信息,认为@L_772_20@出租户账号信息的第一条 */
    $.cordyS.Utils.getUserDetail().done(function () {
        var _flag = true;
        if (!window.localStorage.currentUserOrgaccid) {
            $.each($.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount']),function (index,value) {
                if (value['tenantcode'] === $.cordyS.Utils.getCurrentTenantAbsolutePath().slice(6,-1) && _flag) {
                    window.localStorage.currentUserOrgaccid = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['orgaccid'];
                    window.localStorage.currentUserOrgid = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['orgid'];
                    window.localStorage.currentUserOrgcode = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['orgcode'];
                    window.localStorage.currentUserOrgname = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['orgname'];
                    window.localStorage.currentUserTenantid = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['tenantid'];
                    window.localStorage.currentUserTenantcode = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['tenantcode'];
                    window.localStorage.currentUserTenantname = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['tenantname'];
                    window.localStorage.currentUserTenantdn = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['tenantdn'];
                    window.localStorage.currentUserTenantaccount = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['tenantaccount'];
                    window.localStorage.currentUserUserdn = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['userdn'];
                    window.localStorage.currentUserCompanyId = $.cordyS.Utils.formatCustomObject(window.userDetail['tenantaccounts']['tenantaccount'])[index]['CompanyId'];
                    window.localStorage.currentUserid = $.cordyS.Utils.formatCustomObject(window.userDetail['userid']);
                    _flag = false;
                }
            });
        }

  代码中currentUserid 键值赋值直接使用“=”,没有使用setItem(key,value) 模式。

  代码中 window.localStorage.currentUserid = 方式,在IE中只能新增键值,无法实现更新操作?(技术人员解释是只要键值存在,IE就不做验证更新了)

  如果代码中,用法更新为: window.localStorage.setItem(currentUserid,$.cordyS.Utils.formatCustomObject(window.userDetail[‘userid’])) 是否可行呢?

  关于localStorage参如下[1]:

  在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的是5M大小,这个在不同的浏览器中localStorage会有所不同。

localStorage的优势

  1、localStorage拓展了cookie的4K限制

  2、localStorage会可以将第一次请求的数据直接存储到本地,这个相当一个5M大小的针对于前端页面数据库,相比于cookie可以节约带宽,但是这个却是只有在高版本的浏览器中才支持

localStorage的局限

  1、浏览器的大小不统一,并且在IE8以上的IE版本才支持localStorage这个属性

  2、目前所有的浏览器中都会把localStorage的值类型限定为String类型,这个在对我们日常比较常见的JSON对象类型需要一些转换

  3、localStorage在浏览器的隐私模式下面是不可读取的

  4、localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡

  5、localStorage不能被爬虫抓取到

localStorage兼容性分析

HTML5上localStorage键值赋值与更新兼容性探讨

localStorage的写入有三种方法

if(!window.localStoragE){
            alert("浏览器支持localstorage");
            return false;
        }else{
            var storage=window.localStorage;
            //写入a字段
            storage["a"]=1;
            //写入b字段
            storage.a=1;
            //写入c字段
            storage.setItem("c",3);
            console.log(typeof storage["a"]);
            console.log(typeof storage["b"]);
            console.log(typeof storage["c"]);
        }

  这里面是三种对localStorage的读取,其中官方推荐的是getItem\setItem这两种方法对其进行存取,不要问我这个为什么,因为这个我也不知道。

storage一些属性方法 [@L_403_1@]

clear():清除存储的键值对数据; 
getItem(<key>):通过key获取value值; 
key(<index>):通过索引获取key值; 
length:返回键值对的个数; 
removeItem(<key>):通过key移出指定数据; 
setItem(<key>,<value>):添加一个键值对,当指定key的键值对存在,则实现更新操作; 
[<key>]:通过数组下标的方式,使用key获取指定value值。

  明日,建议技术人员按官方推荐方法试试,看效果

[1]. localStorage使用总结 谢灿勇 2016-06-26

[2]. html5指南-5.使用web storage存储键值对的数据

[3]. Internet Explorer 升级到IE11遇到问题案例分析 肖永威 2016-02-27

大佬总结

以上是大佬教程为你收集整理的HTML5上localStorage键值赋值与更新兼容性探讨全部内容,希望文章能够帮你解决HTML5上localStorage键值赋值与更新兼容性探讨所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。