javascript中cookie的使用与解析

在最近开发的两个项目中,实现登录界面中的记住密码功能,使用到了cookie,回顾发现使用的cookie方式不太一样:

          第一种是自己编写封装的方法。

          第二种使用的是jQuery支持的cookie。

     接下来分别对这两种方式进行对比和比较。

1、通过JavaScript操作DOM的document的cookie,代码如下:

function setCookie(name, value)//两个参数,一个是cookie的名子,一个是值 
{
	var Days = 30;
	//此 cookie 将被保存 30 天     
	var exp = new Date();
	exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
	document.cookie = name + "=" + encodeURIComponent(value) + ";expires="
			+ exp.toGMTString();
}
function getCookie(name)//取cookies函数        
{
	var arr = document.cookie
			.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
	if (arr != null)
		return decodeURIComponent(arr[2]);
	return null;
}
function delCookie(name)//删除cookie
{
	var exp = new Date();
	exp.setTime(exp.getTime() - 1);//删除cookie将时间设置为过去的时间,判断为已失效将cookie清除
	var cval = getCookie(name);
	if (cval != null)
		document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}
以上代码有以下几个主要重点:

a:给document.cookie添加参数的形式为key(参数名)=value(值);expires=date(GMT格式日期),key和value不用多说,主要expires的值可能不太清楚,expires的值是很重要的,它代表着你传入的key和value保存在cookie中的时间,假如没有给它赋值那么它将会在浏览器关闭的时候存入的key、value将会被清除,设置了时间,时间到了也将清除,但是赋值的expires并不会出现在document.cookie中即你设置值为name=patrick;expires="Mon, 21 Sep 2015 12:50:49 GMT"最后获取的只是name=patrick。

b:encodeURIComponent和decodeURIComponent函数的使用,例如name=j/k经过处理encode处理后为"name%3Dj%2Fk"这样做能减少特殊符号带来的影响。

c:new RegExp("(^| )" + name + "=([^;]*)(;|$)")正则的使用,以key为name为例最后正则为/(^| )name=([^;]*)(;|$)/,大家可以试试/(^| )name=([^;]*)(;|$)/.test('name=patrick'),正则表达式内容太多,在这不细讲了。

d:(String).match()方法的使用,它的定义为可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,再通过以下结果:

"name=patrick; password=123456".match(/(^| )name=([^;]*)(;|$)/)处理为["name=patrick;", "", "patrick", ";"],这就是为什么获取cookie的值得时候为arr[2],感兴趣的话可对其他值得获取深究下。

2、为Jquery封装的cookie,jquery.cookie.min.js,处理格式后的代码如下:

(function(a) {
	if (typeof define === "function" && define.amd) {
		define(["jquery"], a)
	} else {
		a(jQuery)
	}
}(function(e) {
	var a = /\+/g;

	function d(g) {
		return g
	}

	function b(g) {
		return decodeURIComponent(g.replace(a, " "))
	}

	function f(g) {
		if (g.indexOf('"') === 0) {
			g = g.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, "\\")
		}
		try {
			return c.json ? JSON.parse(g) : g
		} catch (h) {}
	}
	var c = e.cookie = function(p, o, u) {
		if (o !== undefined) {
			u = e.extend({}, c.defaults, u);
			if (typeof u.expires === "number") {
				var q = u.expires,
					s = u.expires = new Date();
				s.setDate(s.getDate() + q)
			}
			o = c.json ? JSON.stringify(o) : String(o);
			return (document.cookie = [c.raw ? p : encodeURIComponent(p), "=", c.raw ? o : encodeURIComponent(o), u.expires ? "; expires=" + u.expires.toUTCString() : "", u.path ? "; path=" + u.path : "", u.domain ? "; domain=" + u.domain : "", u.secure ? "; secure" : ""].join(""))
		}
		var g = c.raw ? d : b;
		var r = document.cookie.split("; ");
		var v = p ? undefined : {};
		for (var n = 0, k = r.length; n < k; n++) {
			var m = r[n].split("=");
			var h = g(m.shift());
			var j = g(m.join("="));
			if (p && p === h) {
				v = f(j);
				break
			}
			if (!p) {
				v[h] = f(j)
			}
		}
		return v
	};
	c.defaults = {};
	e.removeCookie = function(h, g) {
		if (e.cookie(h) !== undefined) {
			e.cookie(h, "", e.extend({}, g, {
				expires: -1
			}));
			return true
		}
		return false
	}
}));
以上代码虽然很庞大,但是实际操作效果还是一样的,但是jQuery的封装效果好,不会污染变量名,第一种方式对 setCookie、 getCookie、 delCookie名称进行了占用,可能在使用cookie时造成的影响不大,但是jQuery的代码中的思想还是很值的学习的。

在JavaScript学习当中难免会碰到大段而生涩的代码,那么先抓住代码中的核心内容尤为关键,能让我们在工作中快速解决问题,相关的编码思想需要一个慢慢理解的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值