博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js里cookie操作
阅读量:7040 次
发布时间:2019-06-28

本文共 3881 字,大约阅读时间需要 12 分钟。

原生js操作cookie

创建和存储 cookie

在这个例子中我们要创建一个存储访问者名字的 cookie。当访问者首次访问网站时,他们会被要求填写姓名。名字会存储于 cookie 中。当访问者再次访问网站时,他们就会收到欢迎词。

首先,我们会创建一个可在 cookie 变量中存储访问者姓名的函数:

function setCookie(c_name,value,expiredays){var exdate=new Date();exdate.setTime(exdate.getTime()+expiredays);document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());}

上面这个函数中的参数存有 cookie 的名称、值以及过期天数。

setTime() 方法以毫秒设置 Date 对象,时间戳13位。这里如果要设置为30天,则expiredays为30*24*60*60*1000;也可以使用exdate.setDate(exdate.getDate()+expiredays),expiredays直接使用天数。

在上面的函数中,我们首先将天数转换为有效的日期,然后,我们将 cookie 名称、值及其过期日期存入 document.cookie 对象。

注意,如果执行setCookie('test', 123)之后,默认的cookie状态是:

name:testvalue: 123domain: www.cnblogs.compath: /52fhy/p/expires: Session(即关闭当前会话cookie就失效了)size:6

所以实际情况下,我们还得设置domain,path,expires。文章后面提供优化方法。

获取cookie

之后,我们要创建另一个函数来检查是否已设置 cookie。

function getCookie(c_name){if (document.cookie.length>0)  {  c_start=document.cookie.indexOf(c_name + "=");  if (c_start!=-1){     c_start=c_start + c_name.length+1;     c_end=document.cookie.indexOf(";",c_start);    if (c_end==-1) c_end=document.cookie.length;    return unescape(document.cookie.substring(c_start,c_end));    }   }return ""}

上面的函数首先会检查 document.cookie 对象中是否存有 cookie。假如 document.cookie 对象存有某些 cookie,那么会继续检查我们指定的 cookie 是否已储存。如果找到了我们要的 cookie,就返回值,否则返回空字符串。

获取所有cookie

console.log(document.cookie);

删除cookie

function delCookie(name){var exp = new Date();exp.setTime(exp.getTime() - 1);var cval=getCookie(name);if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();}

指定可访问cookie的路径

默认情况下,如果在某个页面创建了一个cookie,那么该页面所在目录中的其他页面也可以访问该cookie。如果这个目录下还有子目录,则在子 目录中也可以访问。例如在www.xxxx.com/html/a.html中所创建的cookie,可以被www.xxxx.com/html /b.html或www.xxx.com/ html/ some/c.html所访问,但不能被www.xxxx.com/d.html访问。

为了控制cookie可以访问的目录,需要使用path参数设置cookie,语法如下:

document.cookie="name=value; path=cookieDir";

其中cookieDir表示可访问cookie的目录。例如:

document.cookie="userId=320; path=/shop";

就表示当前cookie仅能在shop目录下使用。

如果要使cookie在整个网站下可用,可以将cookie_dir指定为根目录,例如:

代码如下:

document.cookie="userId=320; path=/";

指定可访问cookie的主机名

和路径类似,主机名是指同一个域下的不同主机,例如:www.google.com和gmail.google.com就是两个不同的主机名。默认 情况下,一个主机中创建的cookie在另一个主机下是不能被访问的,但可以通过domain参数来实现对其的控制,其语法格式为:

document.cookie="name=value; domain=cookieDomain";

以google为例,要实现跨主机访问,可以写为:

document.cookie="name=value;domain=.google.com";

这样,所有google.com下的主机都可以访问该cookie。

domain的设置,有几点要注意:

1.在setcookie中省略domain参数,那么domain默认为当前域名。

2.domain参数可以设置父域名以及自身,但不能设置其它域名,包括子域名,否则cookie不起作用。

那么cookie的作用域:

cookie的作用域是domain本身以及domain下的所有子域名。

cookie作用域必须有效,js里包括localhost,错误的不生效。php里cookie作用域不能是localhost,设置为空或者false。

总结

cookie的处理过程比较复杂,并具有一定的相似性。因此可以定义几个函数来完成cookie的通用操作,从而实现代码的复用。

例如设置cookie,这里针对上面的进行优化:

function setCookie(c_name,value,expiredays,path, domain){    var exdate=new Date();    exdate.setTime(exdate.getTime()+expiredays);    var expiredays = (expiredays==null) ? "" : ";expires="+exdate.toGMTString();    var path = (path == null) ? ";path=/" : ";path="+path;    var domain = (domain == null) ? "" : ";domain=."+domain;    document.cookie=c_name+ "=" +escape(value)+expiredays + path + domain;}

我们再次执行setCookie('test2',123,1*24*3600*1000, '/', 'cnblogs.com')之后,默认的cookie状态是:

name:test2value: 123domain: .cnblogs.compath: /expires: 不再是Session,而是具体的失效时间size:8

当然,我们也可以使用第三方库处理。

使用第三方库操作cookie

zepto:

jquery:

zepto版本的修改来自jquery版本。所以用法两者类似。

用法

格式: $.fn.cookie(key, value, options);key (string), 键名.value (string), 键值.options (object), 设置expires, path, or domain等.

示例

$.fn.cookie('foo', 'bar'); //设置cookie$.fn.cookie('foo'); //获取cookie$.fn.cookie('foo', 'bar', { expires: 7 }); //设置cookie,有效期7天

可选项

{ expires : 7 } //有效期天数,若为空则设置缺省,即仅当前会话有效{ path: '/foo' }//存储路径,若为空则设置缺省,即当前路径{ domain: 'example.com' } //域名,若为空则设置缺省,即当前域名{ secure: true } //Whether the cookie requries a secure connection (https). Defaults to false.{ raw: true } //Whether or not to URI encode the cookie value. Defaults to false.
你可能感兴趣的文章
“智能厨电+渠道精耕”,华帝迈出“关键一步”
查看>>
Scrapy爬虫(2)爬取新浪旅游图片
查看>>
Nginx反向代理以及负载均衡配置
查看>>
巨头抢滩视频云 金山云稳坐头把交椅
查看>>
索尼富士康领投,AR显示技术厂商Digilens获得2200万美元融资
查看>>
Qt5 GUI 开发的应用易受远程代码执行漏洞的影响
查看>>
搞懂Java动态代理
查看>>
「镁客·请讲」NXROBO林天麟:我们分三步走,首先要做的就是打通机器人行业的产业链...
查看>>
Zcan无线扫描鼠标,滑哪扫哪
查看>>
NTKO使用说明
查看>>
django实现目录上传(最简单的方法)
查看>>
数组是同类型值的集合
查看>>
看透 : 解密身体语言隐藏的密码
查看>>
单例和原型模式-创建型
查看>>
还在吐槽VR的缺点?这些科技公司已经开始打脸了
查看>>
分布式消息队列中间件系列研究之阿堂教程(进阶篇)
查看>>
Linux常用快捷键
查看>>
无损音乐资源
查看>>
Foxmail配置IMAP账号
查看>>
linux下查看一个进程的启动时间和运行时间
查看>>