[JavaScript]cookie 详解

什么是cookie?

cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。

cookie操作

 1 var cookies = {  
 2         //读取cookie:字符串截取方法  
 3         getCookieByStr:function (c_name){  
 4             if (document.cookie.length>0){  
 5                 c_start=document.cookie.indexOf(c_name + "=");//检测是否存在对于的键值  
 6                 if(c_start!=-1){   
 7                     c_start=c_start + c_name.length+1; //返回等号后面一个字符索引,及对应字符开始位置  
 8                     c_end=document.cookie.indexOf(";",c_start);//从c_start位置开始搜索字符";",返回字符的位置索引  
 9                     if (c_end==-1) {c_end=document.cookie.length;}//如果找不到字符";",即只有一个cookie值  
10                     return unescape(document.cookie.substring(c_start,c_end)); //通过前后位置截取对于的cookie值,并解码  
11                 }   
12             }  
13             return ""; //不存在则返回空  
14         },  
15         //设置cookie--名称/值/过期天数  
16         setCookie:function(c_name,value,expiredays){  
17             var exdate=new Date();  
18             exdate.setDate(exdate.getDate()+expiredays);//设置日期  
19             document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());  
20         },  
21         //删除cookie  
22         delCookie:function(c_name){  
23             var exdate = new Date();  
24             exdate.setDate(exdate.getDate()-1);//昨天日期  
25             document.cookie = c_name+"=;expires="+exdate.toGMTString();  
26         }  
27     };  

完整DEMO:

<!DOCTYPE html>  
<html lang="zh-CN">  
<head>  
    <meta charset="UTF-8">  
    <title>Cookies</title>  
</head>  
<body>  
    <label for="key">cokie:<input type="text" name="key" id="cookieStr"></label>  
    <input type="button" id="add" value = "添加cookie" >  
    <input type="button" id="del" value = "删除cookie" >  
    <script type="text/javascript">  
    var cookies = {  
        //读取cookie:字符串截取方法  
        getCookieByStr:function (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);//从c_start位置开始搜索字符";",返回字符的位置索引  
                    if (c_end==-1) {c_end=document.cookie.length;}//如果找不到字符";",即只有一个cookie值  
                    return unescape(document.cookie.substring(c_start,c_end)); //通过前后位置截取对于的cookie值,并解码  
                }   
            }  
            return ""; //不存在则返回空  
        },  
        //设置cookie--名称/值/过期天数  
        setCookie:function(c_name,value,expiredays){  
            var exdate=new Date();  
            exdate.setDate(exdate.getDate()+expiredays);//设置日期  
            document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());  
        },  
        //删除cookie  
        delCookie:function(c_name){  
            var exdate = new Date();  
            exdate.setDate(exdate.getDate()-1);//昨天日期  
            document.cookie = c_name+"=;expires="+exdate.toGMTString();  
        }  
    };  
  
    window.onload = function(){  
        document.getElementById(add).onclick = function(){  
            var value = document.getElementById(cookieStr).value;  
            if(value){  
                cookies.setCookie(cookie,value,10);  
            }  
            document.getElementById(cookieStr).value="";  
            alert(document.cookie);  
        };  
        document.getElementById(del).onclick = function(){  
            cookies.delCookie(cookie);  
            alert("cookie已删除:cookie="+document.cookie);  
        }  
    }  
    </script>  
</body>  
</html> 

编码和解码
escape() 函数

----可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。

unescape()

---- 函数可对通过 escape() 编码的字符串进行解码。

扩展:

小型框架---完整cookies读写,完全支持Unicode

var docCookies = {  
  getItem: function (sKey) {  
    if (!sKey) { return null; }  
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;  
  },  
  setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {  
    if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }  
    var sExpires = "";  
    if (vEnd) {  
      switch (vEnd.constructor) {  
        case Number:  
          sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd;  
          break;  
        case String:  
          sExpires = "; expires=" + vEnd;  
          break;  
        case Date:  
          sExpires = "; expires=" + vEnd.toUTCString();  
          break;  
      }  
    }  
    document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");  
    return true;  
  },  
  removeItem: function (sKey, sPath, sDomain) {  
    if (!this.hasItem(sKey)) { return false; }  
    document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "");  
    return true;  
  },  
  hasItem: function (sKey) {  
    if (!sKey) { return false; }  
    return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);  
  },  
  keys: function () {  
    var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);  
    for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }  
    return aKeys;  
  }  
};  

参考:

MDN:

https://developer.mozilla.org/en-US/docs/Web/API/document.cookie?redirectlocale=en-US&redirectslug=DOM%2Fdocument.cookie#Removing_a_cookie

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。