14、Cookie

一、cookie的概念

cookie 是客户端与服务器端进行通讯使用的一个能够在浏览器本地化存储的技术

PS:chrome不支持本地文件的cookie读写

二、cookie的基本设置及获取

1、设置 ==> document.cookie = ‘name = value’

每次只能设置一条cookie

2、获取 ==> document.cookie


(2.1)一次性获取到所有的cookie,是一串字符串
(2.2)获取时得到所有cookie,多个cookie之间用分号+空格("; ")来隔开

案例:七天免登陆

 1 btnSubmit.onclick = function(){
 2     // 5.表单submit按下即提交,不管满不满足条件。所以阻止默认行为
 3     e.preventDefault();
 4     // 1.获取用户名密码
 5     var _username = username.value.trim();
 6     var _password = password.value;
 7     //2.若用户名长度为0,退出函数。
 8     if(_username.length===0){
 9         alert('用户名不能为空');
10         return;
11     }
12     //3.判断是否勾选"7天内免登陆"选项。若勾选保存cookie
13     if(checkbox.checked){
14         var d = new Date();
15         d.setDate(d.getDate()+7);//d此时是一个UTC时间对象,转成字符串格式
16         document.cookie = 'username=' + _username + ';expires='+d.toUTCString();
17     }
18     //4.不管有没有勾选,点击提交,显示跳转页面
19     location.href = 'http://www.baidu.com';
20 }
21 // 6.下一次访问:判断页面是否存在cookie,是否存在username的cookie,若存在自动登录,即自动跳转到百度
22 var cookies = document.cookie;
23 //(1)判断页面是否存在cookie,即cookie长度不为0
24 if(cookies.length>0){
25     cookies = cookies.split('; ');
26     cookies.forEach(function(item){
27         var arr = item.split('=');
28         //(2)是否存在username的cookie
29         if(arr[0] === 'username'){
30             location.href = 'http://www.baidu.com';
31         }
32     });
33 }

三、cookie的组成

(一)、设置(存储)

1、document.cookie = "cname=cval[; expires=日期对象的字符串]"

参数:

(1.1)expires 设置期限
*、默认情况下,为临时存储
*、d.toUTCString() 具体日期(toUTCString()将时间d转为字符串)
(1.2) path 设置cookie的存储路径
* 默认路径为当前文件所在的文件夹
* / 根目录
例:
document.cookie = "car=aodi; expires="+d.toUTCString()+"; path=/";
2、获取:document.cookie
从当前文件夹往上找到根目录的所有cookie

案例:封装cookie的操作

 1 var Cookie = {
 2     get:function(key){
 3         // 1.先获取所有cookie,若cookie没有值,返回空字符串
 4         var cookies = document.cookie;
 5         if(cookies.length === 0){
 6             return '';
 7         }
 8         // 2.拆分每一个cookie
 9         cookies = cookies.split('; ');
10         for(var i=0;i<cookies.length;i++){
11             var arr = cookies[i].split('=');
12             if(arr[0] === key){
13                 return arr[1];
14             }
15         }
16     },
17     set:function(key,value,date,path){
18         //拼接字符串
19         var str = key + '=' + value;
20         if(date){
21             str += ';expires=' + date.toUTCString();
22         }
23         if(path){
24             str += ';path='+path;
25         }
26         document.cookie = str;
27     },
28     remove:function(key,path){
29         //获取过期的日期,重新设置cookie
30         var d = new Date();
31         d.setDate(d.getDate()-1);
32         this.set(key,'x',d,path);
33     },
34 35     // 清空cookie
36     clear:function(){
37     }
38 }

四、cookie的限制

1、数量50个(不同浏览器值不同)
2、大小2m(不同浏览器值不同)
3、只能写入字符串

五、JSON字符串'{"name":"lemon","price":98.88}';

1、格式

(2.1)属性名和字符串必须使用双引号
(2.2)不能有注释
(2.3)不能存在多余逗号

2、属性值必须为以下类型

(2.1)String
(2.2)Number
(2.3)Boolean
(2.4)Object
(2.5)Array
(2.6)Null

3、转换

(3.1)对象/数组 -> json字符串:JSON.stringify(数组||对象)
(3.2)json字符串 -> 对象/数组:JSON.parse()
备注:空字符串不能通过JSON.parse()转成对象,会报错:Unexpected end of JSON input(该内容不是json字符串)
(3.3) eval("("+json字符串+")");
它的作用是,将一个普通的json格式的字符串,转换成Json格式的对象
var list = eval("("+request.responseText+")");

保存购物车信息:思路历程:一个个存储商品信息,这样子就不清楚那几条描述的是同一个商品==>用对象存储同一个商品的信息==>用数组存储多个商品信息==> document.cookie只能存储字符串==>数组转成json字符串进行存储

案例:将商品添加到购物车列表

 1 // 3.每次刷新,拿到上一次的存放值。第一次是为空数组
 2 // * 若已经存在值,默认为JSON字符串,要转回数组
 3 var goodslist = Cookie.get('goodslist') || [];
 4 if(typeof goodslist === 'string'){
 5     goodslist = JSON.parse(goodslist);
 6 }
 7 // 1.利用事件委托实现添加到购物车的效果
 8 goods.onclick = function(e){
 9     e = e || window.event;
10     var target = e.target || e.srcElement;
11     if(target.parentNode.className === 'add2cart'){
12         // 2.若当前为按钮被点击
13         // (1)生成一个商品信息对象{guid,name,imgurl,price,qty(商品数量)}
14         // (2)推入数组,将数组添加到cookie里面
15         // (3)考虑如果商品信息已经添加过,则应该增加数组里面的该商品数量
16         //  * 第一步:判断当前的guid是否在数组存在。
17         //  * 第二步:若存在,拿到该商品信息在数组中的索引,利用索引将qty++
18         var currentLi = target.parentNode.parentNode;
19         var guid = currentLi.getAttribute('data-guid');
20         var idx;
21         var has = goodslist.some(function(g,i){
22             idx = i;
23             return g.guid === guid;
24         });
25         if(has){
26             goodslist[idx].qty++;
27         }else{
28             var goods = {
29                 guid:guid,
30                 name:currentLi.children[1].innerText,
31                 imgurl:currentLi.children[0].src,
32                 price:currentLi.children[2].innerText,
33                 // 商品数量
34                 qty:1
35             }
36             goodslist.push(goods);
37         }
38         document.cookie = 'goodslist='+ JSON.stringify(goodslist);
39     }

案例:显示购物车列表

 1 //1.获取goodslist的cookie,根据cookie数据生成html结构
 2 //2.遍历时同时计算总价给subPrice元素赋值
 3 var goodslist;
 4 render();
 5 function render(){
 6     goodslist = Cookie.getCookie('goodslist') || [];
 7     if(typeof goodslist === 'string'){
 8         goodslist = JSON.parse(goodslist);
 9     }
10     //2.遍历时,同时计算商品金额
11     var total = 0;
12     var ul = document.createElement('ul');
13     ul.innerHTML = goodslist.map(function(goods){
14         total += goods.price * goods.qty;
15         return '<li data-guid="'+goods.guid+'">' + 
16             '<img src="'+goods.imgurl+'">' + 
17             '<h4>'+goods.name+'</h4>' + 
18             '<p class="price">价格:<span>'+goods.price+'&times;'+goods.qty+'</span></p>' + 
19             '<span class="btn-close">&times;</span>' + 
20             '</li>'21     }).join('');
22     carList.innerHTML = '';
23     carList.appendChild(ul);
24     subPrice.innerHTML = total.toFixed(2);
25 }
26 // 3.点击按钮,移除cookie数据,重新渲染商品列表。同时阻止浏览器默认行为
27 btnClear.onclick = function(){
28     Cookie.remove('goodslist');
29     render();
30     return false;
31 }
32 //4.当点击某个商品的删除时
33 //(1)获取到当前商品的guid,遍历数组goodslist,根据guid值相同,找到被删除的元素在数组中的索引。
34 //(2)通过索引,删除goodslist的中的某个商品。之后推出循环
35 //(3)重新生成cookie后,渲染
36 carList.onclick = function(e){
37     e = e || window.event;
38     var target = e.target || e.srcElement;
39     if(target.className === 'btn-close'){
40         var currentLi = target.parentNode;
41         var guid = currentLi.getAttribute('data-guid');
42         for(var i=0;i<goodslist.length;i++){
43             if(goodslist[i].guid === guid){
44                 goodslist.splice(i,1);
45                 break;
46             }
47         }
48         Cookie.set('goodslist',JSON.stringify(goodslist));
49         render();
50     }
51 }
原文地址:https://www.cnblogs.com/wulongke/p/10493276.html