项目中遇见 cookie 值存不上,what fuck?什么情况,不知道。用$.cookie 和原生的 cookie 都不行,存上值,就被删了一样。找不见地方。考虑到项目比较大,去找得代价,还不如换种实现方式,于是就想起来用 localStorage 了。然后 localStorage 又不像 $.cookie 那样有过期时间。因此需要自己去封装一下,故而,有了这个一个博客。勿喷!

调用方式

setItem()与 $.cookie() 类似,expires 支持传入一个时间对象(object),有效时间的数值(number, 单位:毫秒 或者 天);

当 expires 值类型为 number ,且值小于等于当年的总天数时,表示的为天,否则表示毫秒;

光说,不行,看看下面:

调用方式:

var myLocalStorage = require('');
myLocalStorage.setItem("test1", "Mobro1", {expires: 1});
myLocalStorage.setItem(
"test2",
"Mobro2",
{expires: new Date(new Date().getTime() + 1000 * 60 * 60 * 24)}
);
myLocalStorage.setItem("test3", "Mobro3", {expires: 1000 * 60 * 10});

test1: 有效期为 1 天。

test2: 有效期为 1 天。

test3: 有效期为 10 分钟。

getItem() 与 $.cookie() 也是类似的,取那个 localStorage 值,只需要传入一个 key 键名就好了。若没有找到 当前 key 对应的 localStorage 值,则返回 null 对象。

removeItem() 删除一个 localStorage 值,删除成功,返回true,否则返回 false

继续往下看:

myLocalStorage.getItem("test1")  // Mobro1
myLocalStorage.removeItem("test1"); // 如果成功
myLocalStorage.getItem("test1") // null

代码纯属手敲,逻辑上一定会有什么漏洞的,还望各位大牛不吝赐教。


只与同好争高下,不与傻瓜论短长。 -- 《欢乐颂》电视剧台词。

最近看了一部日本的电影,《希望在别处》,感觉还是不错的,给推荐一下。

四川老家大雨,火车拿去压桥了;

读大学的地方兰州大雨,车子被冲跑了;

工作地北京大雨,天天上班穿拖鞋,每天丢一把伞;

哈哈哈哈

>oo<


完整源码

var myLocalStorage = {
setItem: function(key, value, exp) {
var obj = new Object(),
expires = exp.expires || null;
obj.value = value;
obj.time = new Date().getTime(); // expires 类型
if (expires === null) {
delete obj.expires;
} else if (typeof expires === "object") {
obj.expires = expires.getTime() - obj.time;
} else if (typeof expires === "number") {
if ((expires | 0) !== expires) {
throw new Error("expires must be integer number!");
} // expires 小于 365、366 则,按天算。否则按时间戳算
if (expires <= getYearDays() && expires > 0) {
obj.expires = expires * 1000 * 60 * 60 * 24;
} else if (expires > getYearDays()) {
obj.expires = expires;
} else if (expires <= 0) {
this.removeItem(key);
}
}
localStorage.setItem(key, JSON.stringify(obj));
},
getItem: function(key) {
var obj = JSON.parse(localStorage.getItem(key));
if (obj === "null" || obj === null) return null;
var expires = obj.expires,
now = new Date().getTime(),
time = obj.time; if (now - time >= expires ||
now < time) {
localStorage.removeItem(key);
return null;
} else {
return obj.value;
}
}, // 删除成功返回 true, 否则返回 false
removeItem: function(key) {
if (this.getItem(key) !== null) {
localStorage.removeItem(key); return this.getItem(key) === null ? true : false;
}
return true;
},
keys: function(key) { }
}
function getYearDays () {
return new Date().getFullYear() % 4 === 0 ? 366 : 365;
} module.exports = myLocalStorage;

自己封装myLocalStorage,使其有有效期的更多相关文章

  1. Http请求封装(对HttpClient类的进一步封装,使之调用更方便。另外,此类管理唯一的HttpClient对象,支持线程池调用,效率更高)

    package com.ad.ssp.engine.common; import java.io.IOException; import java.util.ArrayList; import jav ...

  2. 编译kubeadm使生成证书有效期为100年

    目录 问题 编译 检查结果 问题 当我使用kubeadm部署成功k8s集群时在想默认生成的证书有效期是多久,如下所示 /etc/kubernetes/pki/apiserver.crt #1年有效期 ...

  3. 探索Django验证码功能的实现 - DjangoStarter项目模板里的封装

    前言 依然是最近在做的这个项目,用Django做后端,App上提交信息的时候需要一个验证码来防止用户乱提交,正好我的「DjangoStarter」项目脚手架也有封装了验证码功能,不过我发现好像里面只是 ...

  4. 【PCB】电子元件封装大全及封装常识

    电子元件封装大全及封装常识 电子元件封装大全及封装常识 一.什么叫封装封装,就是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接.封装形式是指安装半导体集成电路芯片用的外壳.它不仅起着 ...

  5. 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  6. Java—继承、封装、抽象、多态

    类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...

  7. JS学习之DOM节点的关系属性封装、克隆节点、Dom中Style常用的一些属性等小结

    JS DOM节点: 在JS DOM中节点的关系被定义为节点的属性: 通常有以下几种节点之间的关系: (这里的关系是所有浏览器都支持的) parentNode    父节点 childNodes     ...

  8. SOP、DIP、PLCC、TQFP、PQFP、TSOP、BGA封装解释

    1. SOP封装SOP是英文Small Outline Package的缩写,即小外形封装.SOP封装技术由1968-1969年菲利浦公司开发成功,以后逐渐派生出SOJ(J型引脚小外形封装).TSOP ...

  9. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?

    既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?把SessionFactory,Session,Transcational封装成包含crud的 ...

随机推荐

  1. python中元组与数组的区别

    列表: a=['12', '3rr'] 元组: t=(21,34) 列表可以修改,而元组不可以修改,如果元组中仅有一个元素,则要在元素后加上逗号. 元组和列表的查询方式一样. 元组只可读不可修改. 如 ...

  2. Springboot的2种启动方式

    sprigboot既可以直接通过main方法启动,也可以在tomcat里启动,在main方法里启动很简单,直接run启动类的main方法就可以了. 在tomcat里启动是需要配置一下的,需要实现以下S ...

  3. VS开发入门一:VS常用快捷键大全,工欲善其事必先利其器 只看标红的吧

    1.快速using(这个的快捷键是ctrl+.)2.快速回到之前编辑的代码页面现在的项目动不动就几十个代码页面,经常需要在几个页面之间跳来跳去,这时就需要这两个快捷键:CTRL + - 向后定位,回到 ...

  4. Android开发入门经典【申明:来源于网络】

    Android开发入门经典[申明:来源于网络] 地址:http://wenku.baidu.com/view/6e7634050740be1e650e9a7b.html?re=view

  5. [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研

    如题,以下是一份简单的快速调研. TLDK: Transport Layer Development Kit 一 什么是TLDK transport layer development kit 处理t ...

  6. python之SQLAlchemy组件

    介绍 SQLAlchemy 是一个 ORM 框架,可以帮助我们使用面向对象的方式快速实现数据库操作. 组成部分: Engine,框架的引擎 Connection Pooling ,数据库连接池 Dia ...

  7. Ajax 监听

    $.ajaxSetup({ beforeSend: function (XMLHttpRequest) { alert("ajax请求之前"); } });

  8. VC++运行库 集32位/64位整合版

    运行程序时,win7/win10(x86和x64)常会遇到缺少什么缺少msvc***.dll问题 安装下面链接提供的程序,安装后,便可解决. [2016-10-10]Microsoft Visual ...

  9. Go 初体验 - 令人惊叹的语法 - defer.4 - defer 对宿主函数返回值的影响

    defer 函数可以影响宿主函数的返回值 看代码: 调用: 输出: 结果又让人意外了. coo1:因为传引用,return 时 i = 100, return 返回的也是 100,return 执行之 ...

  10. Python之多进程&异步并行

    由于python的gil,多线程不是cpu密集型最好的选择 多进程可以完全独立的进程环境中运行程序,可以充分的利用多处理器 但是进程本身的隔离带来的数据不共享也是一个问题,而且线程比进程轻量 impo ...