设为首页 加入收藏

TOP

HTML5本地存储Localstorage(一)
2015-07-16 12:56:36 来源: 作者: 【 】 浏览:20
Tags:HTML5 本地 存储 Localstorage

什么是localstorage


前几天在老项目中发现有对cookie的操作觉得很奇怪,咨询下来是要缓存一些信息,以避免在URL上面传递参数,但没有考虑过cookie会带来什么问题:


① cookie大小限制在4k左右,不适合存业务数据
② cookie每次随HTTP事务一起发送,浪费带宽


我们是做移动项目的,所以这里真实适合使用的技术是localstorage,localstorage可以说是对cookie的优化,使用它可以方便在客户端存储数据,并且不会随着HTTP传输,但也不是没有问题:


① localstorage大小限制在500万字符左右,各个浏览器不一致
② localstorage在隐私模式下不可读取
③ localstorage本质是在读写文件,数据多的话会比较卡(firefox会一次性将数据导入内存,想想就觉得吓人啊)
④ localstorage不能被爬虫爬取,不要用它完全取代URL传参


瑕不掩瑜,以上问题皆可避免,所以我们的关注点应该放在如何使用localstorage上,并且是如何正确使用。


localstorage的使用


基础知识


localstorage存储对象分为两种:


① sessionStrage: session即会话的意思,在这里的session是指用户浏览某个网站时,从进入网站到关闭网站这个时间段,session对象的有效期就只有这么长。


② localStorage: 将数据保存在客户端硬件设备上,不管它是什么,意思就是下次打开计算机时候数据还在。


两者区别就是一个作为临时保存,一个长期保存。


这里来一段简单的代码说明其基本使用:








<script type="text/java script">
? var msg = document.getElementById('msg'),
? ? ? ? ? ? text = document.getElementById('text'),
? ? ? ? ? ? type = document.getElementById('type');


? function save() {
? ? var str = text.value;
? ? var t = type.value;
? ? if (t == 'session') {
? ? ? sessionStorage.setItem('msg', str);
? ? } else {
? ? ? localStorage.setItem('msg', str);
? ? }
? }


? function load() {
? ? var t = type.value;
? ? if (t == 'session') {
? ? ? msg.innerHTML = sessionStorage.getItem('msg');
? ? } else {
? ? ? msg.innerHTML = localStorage.getItem('msg');
? ? }
? }


真实场景


实际工作中对localstorage的使用一般有以下需求:


① 缓存一般信息,如搜索页的出发城市,达到城市,非实时定位信息


② 缓存城市列表数据,这个数据往往比较大


③ 每条缓存信息需要可追踪,比如服务器通知城市数据更新,这个时候在最近一次访问的时候要自动设置过期


④ 每条信息具有过期日期状态,在过期外时间需要由服务器拉取数据


⑤ ......


define([], function () {


? var Storage = _.inherit({
? ? //默认属性
? ? propertys: function () {


? ? ? //代理对象,默认为localstorage
? ? ? this.sProxy = window.localStorage;


? ? ? //60 * 60 * 24 * 30 * 1000 ms ==30天
? ? ? this.defaultLifeTime = 2592000000;


? ? ? //本地缓存用以存放所有localstorage键值与过期日期的映射
? ? ? this.keyCache = 'SYSTEM_KEY_TIMEOUT_MAP';


? ? ? //当缓存容量已满,每次删除的缓存数
? ? ? this.removeNum = 5;


? ? },


? ? assert: function () {
? ? ? if (this.sProxy === null) {
? ? ? ? throw 'not override sProxy property';
? ? ? }
? ? },


? ? initialize: function (opts) {
? ? ? this.propertys();
? ? ? this.assert();
? ? },


? ? /*
? ? 新增localstorage
? ? 数据格式包括唯一键值,json字符串,过期日期,存入日期
? ? sign 为格式化后的请求参数,用于同一请求不同参数时候返回新数据,比如列表为北京的城市,后切换为上海,会判断tag不同而更新缓存数据,tag相当于签名
? ? 每一键值只会缓存一条信息
? ? */
? ? set: function (key, value, timeout, sign) {
? ? ? var _d = new Date();
? ? ? //存入日期
? ? ? var indate = _d.getTime();


? ? ? //最终保存的数据
? ? ? var entity = null;


? ? ? if (!timeout) {
? ? ? ? _d.setTime(_d.getTime() + this.defaultLifeTime);
? ? ? ? timeout = _d.getTime();
? ? ? }


? ? ? //
? ? ? this.setKeyCache(key, timeout);
? ? ? entity = this.buildStorageObj(value, indate, timeout, sign);


? ? ? try {
? ? ? ? this.sProxy.setItem(key, JSON.stringify(entity));
? ? ? ? return true;
? ? ? } catch (e) {
? ? ? ? //localstorage写满时,全清掉
? ? ? ? if (e.name == 'QuotaExceededError') {
? ? ? ? ? //? ? ? ? ? ? this.sProxy.clear();
? ? ? ? ? //localstorage写满时,选择离过期时间最近的数据删除,这样也会有些影响,但是感觉比全清除好些,如果缓存过多,此过程比较耗时,100ms以内
? ? ? ? ? if (!this.removeLastCache()) throw '本次数据存储量过大';
? ? ? ? ? this.set(key, value, timeout, sign);
? ? ? ? }
? ? ? ? console && console.log(e);
? ? ? }
? ? ? return false;
? ? },


? ? //删除过期缓存
? ? removeOverdueCache: function () {
? ? ? var tmpObj = null, i, len;


? ? ? var now = new Date().getTime();
? ? ? //取出键值对
? ? ? var cacheStr = this.sProxy.getItem(this.keyCache);
? ? ? var cacheMap = [];
? ? ? var newMap = [];
? ? ? if (!cacheStr) {
? ? ? ? return;
? ? ? }


? ? ? cacheMap = JSON.parse(cacheStr);


? ? ? for (i = 0, len = cacheMap.length; i < len; i++) {
? ? ? ? tmpObj = cacheMap

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python中的编码与解码 下一篇Python保留指定文件、删除目录其..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: