在前端开发过程中,会用到本地缓存,但是由于浏览器对不同规范支持的程度不一样,每次进行使用都要为兼容行花费不少时间。我整理了一个本地存储的组件。
    组件特点:
  • 可以配置使用localStorage、sessionStorage、cookie、Object,IE低版本支持userData
  • 统一的使用接口set、get、remove
  • 使用方便,直接引入JS,进行初始化即可
    下面是源码:

(function() {
var ua = navigator.userAgent.toLowerCase();
var t = ua.match(/msie ([\d.]+)/);
var ie = t && t[1];
var useUserData = ie ==6 || ie == 7; var encodeVal = function(value) {
return encodeURIComponent(value);
}; var decodeVal = function(value) {
return decodeURIComponent(value);
}; var isCookieEnabled = function() {
if(window.navigator.cookieEnabled) {
return window.navigator.cookieEnabled;
}
var key = 'test_cookie_enable',
value = 'test' + Math.random(),
result = _cookieStorage.set(key, value);
if (!result) {
return false;
}
var value2 = _cookieStorage.get(key);
_cookieStorage.remove(key);
return value == value2;
}; var _sessionStorage = {
get : function(key) {
return sessionStorage.getItem(key) || null;
}, set : function(key, value) {
sessionStorage.setItem(key, value);
}, remove : function(key) {
sessionStorage.removeItem(key);
}
}; var _localStorage = {
get : function(key) {
return decodeVal(localStorage.getItem(key)) || null;
}, set : function(key, value) {
value = encodeVal(value);
localStorage.setItem(key, value);
}, remove : function(key) {
localStorage.removeItem(key);
}
}; var _userDataStorage = {
init: function(maxage) {
var memory = document.createElement('input');
this.memory = memory;
memory.style.display = "none";
memory.style.behavior = "url('#default#userData')";
document.body.appendChild(memory); if(maxage) {
var now = +new Date();
var expires = now + maxage * 1000;
memory.expires = new Date(expires).toUTCString();
} memory.load('UserDataStorage');
}, get : function (key) {
return decodeVal(this.memory.getAttribute(key)) || null;
}, set : function(key, value) {
value = encodeVal(value);
this.memory.setAttribute(key, value);
this.memory.save('UserDataStorage');
}, remove : function(key) {
this.memory.removeAttribute(key);
this.memory.save('_userDataStorage');
}
}; var _cookieStorage = {
init: function(maxage, path) {
this.maxage = maxage;
this.path = path;
},
set : function(key, value) {
var cookie = key + '=' + encodeVal(value);
if(this.maxage) cookie += '; max-age=' + this.maxage;
if(this.path) cookie += '; path=' + this.path;
document.cookie = cookie;
}, get : function(key) {
var cookies = document.cookie;
var reg = new RegExp('(?:^ |)(' + key + ')=([^;]+)');
var value = cookies.match(reg);
if(value) {
return decodeVal(value[2]);
}
return null
}, remove : function(key) {
this.init(0, '/');
this.set(key, '');
}
}; var _objectStorage = {
init : function() {
this.data = {};
},
set : function(key, value) {
value = encodeVal(value);
this.data[key] = value;
},
get : function (key) {
return decodeVal(this.data[key]) || null;
},
remove : function(key) {
delete this.data[key];
}
}; /**
* 本地存储
* @param {String} type 存储类型 [local,session,cookie,page]
* @param {Number} maxage cookie到期时间 单位秒
* @param {String} path 路径
* @return {Object} 具有set、get、remove方法
*/
function Storage(type, maxage, path) {
var storage;
maxage = maxage || '';
path = path || '/';
type = type || 'local'; switch (type) {
case 'local' :
try { // 禁用cookie、localStorage时访问会报错
storage = window.localStorage ? _localStorage : useUserData ? _userDataStorage : Object;
} catch (e) {
storage = _objectStorage;
}
break;
case 'session' :
try { // 禁用cookie、_localStorage时访问会报错
storage = window.sessionStorage ? _sessionStorage : _objectStorage;
} catch (e) {
storage = _objectStorage;
}
break;
case 'cookie' :
storage = isCookieEnabled() ? _cookieStorage : _objectStorage;
break;
case 'page' :
storage = _objectStorage;
}
storage.init && storage.init(maxage, path);
return storage;
} window.Storage = Storage;
})();
 
    

  使用例子:

  

var storage = new Storage('local');
storage.set('name', '中国人');
var name = storage.get('name');
alert(name);
storage.remove('name');
var name = storage.get('name');
alert(name);
  如果觉得有用可以推荐一下,那里实现的有问题,也希望指正。

本地存储组件--兼容IE低版本的更多相关文章

  1. AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器

    AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的 ...

  2. position:fixed 兼容浏览器低版本

    项目中遇到的坑,写篇博客做个笔记纪念下,position: fixed一般来说都兼容各个浏览器,但是要兼容浏览低版本问题,就得用-webkit-transform: translateZ(0);这段代 ...

  3. 使用socket.io client 开发时兼容IE低版本的办法

    使用socket.io client 开发时兼容IE低版本的办法 socket.io提供了针对各个版本浏览器的‘socket’功能的封转:websocket,长连接,流,flash什么的.给你格式化下 ...

  4. WebSocket兼容到低版本浏览器

    就目前而言,WebSocket是最好的Web通信解决方案了.但是IE从10才开始兼容它,对于目前大量IE8存在的市场,原生的WebSocket显然不太实用,我们需要低版本兼容的解决方案.于是我模拟We ...

  5. 如何解决vux不兼容安卓低版本问题

    最近做移动端H5页面用VUX来写UI组件这块.ios测试的时候没啥大问题,不过在4.4版本的华为手机上测试就崩了.接下来详细记述下崩的几个点. 第一:vux自带的提示框,在低版本安卓系统上全不是居中显 ...

  6. 轮播图采用js、jquery实现无缝滚动和非无缝滚动的四种案例实现,兼容ie低版本浏览器

    项目源代码下载地址:轮播图 以下为项目实现效果:(由于gif太大,所以只上传一张图片,但效果完全能实现,经测试,在ie各版本浏览器及chrome,firefox等浏览器中均能实现效果,可以实现点击切换 ...

  7. js实现抛物线运动 兼容IE低版本(转)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. 探讨兼容IE低版本的PC端响应式布局

    http://www.jiangweishan.com/article/lowIeResposive.html 响应式布局,oh my god!!有点醉了,感觉是老生常谈的话题了.虽然已经谈过很多了, ...

  9. JS nodeList转数组,兼容IE低版本

    一.前言 nodeList转数组貌似很少会这样去操作,但我在做图片懒加载时,我获取了所有需要做懒加载的img元素,也就是一个NodeList对象,打个比方: 对这些元素进行src修改后,我想将此项从N ...

随机推荐

  1. Trie树(字典树) 最热门的前N个搜索关键词

    方法介绍 1.1.什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优 ...

  2. HLS直播和时移项目上线

    兄弟姐妹们: 天翼视讯的高清HLS直播和时移项目上线,测试观看地址为:http://118.85.192.228/live/,同时支持移动终端和pc终端.移动终端支持ios client和androi ...

  3. Hadoop动态加入/删除节点(datanode和tacktracker)

    大体,正确的做法是首选的配置文件,然后开始详细机对应的进程/停止操作. 网上一些资料说在调整配置文件的时候,优先使用主机名而不是IP进行配置. 总的来说加入/删除DataNode和TaskTracke ...

  4. Hexo博客搭建图文教程

    准备 你需要准备好以下软件: Node.js环境 Git Windows 配置Node.js环境 下载Node.js安装文件: Windows Installer 32-bit Windows Ins ...

  5. tomcat配置数据源

    1.修改conf下的context.xml,在<context>标签中添加: <Resource name="jdbc/soa" auth="Conta ...

  6. Power Designer - 反向获取数据库物理模型时Unable to list the users 异常

    解决方案: 菜单栏 -> Database -> Change Current DBMS ,给DBMS选择Oracle Version 9i2.

  7. VS2010不能打开预编译的网站源码的原因是什么?(转之csdn)

    原问题: 今天将写好的一个网站源码目录拷贝到另一台电脑上,但打开时提示:    你要打开一个预编译的网站,你可以查看该站点,但对它进行更改可能会造成该网站停止运行,若要修改站点,建议先编辑原始网站中的 ...

  8. js获取上传文件扩展名

    File_box.value.substring(File_box.value.lastIndexOf(".") + 1);

  9. PowerDesigner与UML建模应用

    一.   PD简介 PowerDesigner 是一个集所有现代建模技术于一身的完整工具,它集成了强有力的业务建模技术.传统的数据库分析和实现,以及UML对象建模.通过了元数据的管理.冲突分析和真正的 ...

  10. Invalid content was found starting with element 'taglib'”

    今天在使用struts-menu制作菜单,在web.xml中写入 <taglib>      <taglib-uri>/WEB-INF/struts-menu.tld</ ...