当前位置: 首页 > Web前端 > HTML5

cookie工具函数封装

时间:2023-04-05 13:55:45 HTML5

cookie工具函数letCookieUtil={get:function(name){letcookieName=encodeURIComponent(name)+"=",cookieStart=document.cookie.indexOf(cookieName),cookieValue=null;如果(cookieStart>-1){让cookieEnd=document.cookie.indexOf(";",cookieStart);如果(cookieEnd==-1){cookieEnd=document.cookie.length;}cookieValue=decodeURIComponent(document.cookie.substring(cookieStart+cookieName.length,cookieEnd));}返回cookie值;},set:function(name,value,expires,path,domain,secure){让cookieText=encodeURIComponent(name)+"="+encodeURIComponent(value);if(expiresinstanceofDate){cookieText+=";expires="+expires.toGMTString();}if(path){cookieText+=";path="+path;}如果(域){cookieText+=";域="+域;}如果(安全){cookieText+=";secure";}document.cookie=cookieText;},unset:function(name,path,domain,secure){this.set(name,"",newDate(0),path,domain,secure);}};CookieUtil.get()方法根据cookie的名称获取对应的值,它会在document.cookie字符串中寻找cookie名称加上等号的位置,如果找到,则使用indexOf()去查找position之后的第一个分号(表示cookie的结束位置),如果没有找到分号,则说明cookie是字符串中的最后一个,剩下的字符字符串就是cookie的值。该值使用decodeURIComponent()进行解码,最后返回。如果没有找到cookie,则返回null。CookieUtil.set()方法在页面上设置一个cookie,并接收以下参数:cookie的名称,cookie的值cookie,一个可选的Date对象,指定何时删除cookie,一个可选的cookieURL路径,一个可选的域,以及一个可选的布尔值,指示是否添加安全标志。参数按使用频率排序,只需要前两个。在此方法中,名称和值均使用encodeURIComponent()进行URL编码,并检查其他选项。如果expires参数是Date对象,那么将使用Date对象的toGMTString()方法正确格式化Date对象并将其添加到expires选项中。该方法的其余部分是构造cookie字符串并将其设置为document.cookie。没有直接的方法可以删除现有的cookie。因此,您需要用相同的路径、域和安全选项再次设置cookie,并将过期时间设置为过去。CookieUtil.unset()方法可以处理这种事情。它接收4个参数:要删除的cookie的名称、一个可选的路径参数、一个可选的域参数和一个可选的安全参数。这些参数被传递给CookieUtil.set()加上空字符串并将过期时间设置为1970年1月1日(Date对象的值初始化为0ms)。这将确保删除cookie//设置cookieCookieUtil.set("name","Nicholas");CookieUtil.set("book","专业JavaScript");//读取cookie的值alert(CookieUtil.get("name"));//“尼古拉斯”警报(CookieUtil.get(“书”));//《专业JavaScript》//删除cookieCookieUtil.unset("name");CookieUtil.unset("book");//设置cookie,包括其路径、域、有效期CookieUtil.set("name","Nicholas","/books/projs/","www.wrox.com",newDate("January1,2010"));//删除cookieCookieUtil.unset("name","/books/projs/","www.wrox.com");//设置安全cookieCookieUtil.set("name","Nicholas",null,null,null,true);为了规避浏览器对单个域名下cookies数量的限制,一些开发者使用了一个叫做子cookie(subcookie)的概念。子cookie是存储在单个cookie中的较小数据块。即使用cookie值来存储多个名值对。子cookie最常见的格式如下:name=value&name1=value1&name2=value2&name3=value3&name4=value4&name5=value5子cookie一般也采用querystring格式。然后可以使用单个cookie存储和访问这些值,而不是为每个名称-键-值对使用不同的cookie存储。最后,网站或Web应用程序可以存储更多结构化数据,而不会达到单域cookie限制。为了更好地操作子cookie,必须建立一系列新方法。根据cookie的预期用途,子cookie的解析和序列化略有不同且更为复杂。例如获取子cookie,首先和获取cookie的基本步骤相同,但是在解码cookie值之前,需要先获取子cookie的信息,如下所示。letSubCookieUtil={get:function(name,subName){letsubCookies=this.getAll(name);如果(subCookies){返回subCookies[subName];}else{返回空值;}},getAll:function(name){letcookieName=encodeURIComponent(name)+"=",cookieStart=document.cookie.indexOf(cookieName),cookieValue=null,cookieEnd,subCookies,i,parts,result={};如果(cookieStart>-1){cookieEnd=document.cookie.indexOf(";",cookieStart);如果(cookieEnd==-1){cookieEnd=document.cookie.length;}cookieValue=document.cookie.substring(cookieStart+cookieName.length,cookieEnd);如果(cookieValue.length>0){subCookies=cookieValue.split("&");对于(i=0,len=subCookies.length;i0&&subcookies.hasOwnProperty(subName)){subcookieParts.push(encodeURIComponent(subName)+"="+encodeURIComponent(subcookies[subName]));}}如果(cookieParts.length>0){cookieText+=subcookieParts.join("&");if(expiresinstanceofDate){cookieText+=";expires="+expires.toGMTString();}if(path){cookieText+=";path="+path;}if(domain){cookieText+=";domain="+domain;}if(secure){cookieText+=";secure";}}else{cookieText+=";expires="+(newDate(0)).toGMTString();}document.cookie=cookieText;},unset:function(name,subName,path,domain,secure){letsubcookies=this.getAll(name);if(subcookies){删除subcookies[subName];this.setAll(name,subcookies,null,path,domain,secure);}},unsetAll:function(name,path,domain,secure){this.setAll(name,null,newDate(0),path,domain,secure);}};get()获取单个子cookie的值,接收两个参数:cookie的名称和子cookie的名称其实就是调用getAll()获取所有的子cookie,然后只返回需要的一个(cookie不存在则返回null)。getAll()获取所有的子cookie,并将它们放入一个对象中返回。对象的属性是子cookie的名称,对应的值是子cookie对应的值。set()方法接收7个参数:cookie名称、子cookie名称、子cookie值、带有可选cookie过期日期或时间的Date对象、可选cookie路径、可选cookie域和可选布尔安全标志。所有可选参数都适用于cookie本身而不是子cookie。在该方法中,第一步是获取指定cookie名称对应的所有子cookie。逻辑或运算符“||”用于在getAll()返回null时将子cookie设置为新对象。然后,在subcookies对象上设置subcookie值并将其传递给setAll()。setAll()方法接收6个参数:cookie名称、包含所有子cookie的对象以及与set()中相同的4个可选参数。此方法使用for-in循环迭代第二个参数中的属性。为了保证确实是要保存的数据,使用hasOwnProperty()方法保证只有实例属性被序列化到子cookie中。由于可能存在属性名称为空字符串的情况,因此在将其添加到结果对象之前检查属性名称的长度。将每个子cookie的名称-值对存储在subcookieParts数组中,以便稍后使用join()方法将它们与&符号组合。其余方法与CookieUtil.set()相同。unset()方法用于删除一个cookie中的单个子cookie而不影响其他;unsetAll()方法等同于CookieUtil.unset(),用于删除整个cookie。与set()和setAll()一样,路径、域和安全标志必须与先前创建的cookie中包含的相匹配。可以在写入任何单个子cookie的同时设置整个cookie的到期日期。SubCookieUtil.getAll()方法在解析cookie值的方式上与CookieUtil.get()非常相似。不同的是cookie的值不是立即解码,而是先根据&字符划分子cookie放在数组中,然后再根据等号划分每个子??cookie,这样parts数组中的第一部分是子cookie名称,后一部分是子cookie的值。这两项都需要使用decodeURIComponent()进行解码,然后放入结果对象,最后作为方法的返回值。如果cookie不存在,则返回null。//假设document.cookie=data=name=Nicholas&book=Professional%20JavaScript//获取所有子cookiesvardata=SubCookieUtil.getAll("data");alert(data.name);//“尼古拉斯”警报(data.book);//《专业JavaScript》//获取子cookiealert(SubCookieUtil.get("data","name"));//“尼古拉斯”警报(SubCookieUtil.get(“数据”,“书”));//"ProfessionalJavaScript"//设置两个cookieSubCookieUtil.set("data","name","Nicholas");SubCookieUtil.set("data","book","ProfessionalJavaScript");//设置所有Subcookie和过期日期SubCookieUtil.setAll("data",{name:"Nicholas",book:"ProfessionalJavaScript"},newDate("January1,2010"));//修改name的值并修改cookieSubCookieUtil.set("data","name","Michael",newDate("February1,2010"));//只删除名为nameSubCookieUtil.unset("data","name");//删除整个cookieSubCookieUtil.unsetAll("data");