用js操纵cookie是通过document对象下的cookie对象Q其实document.cookie是字符Ԍ
所以我们用它?yu)像使用字符串一P可以使用字符串的所有方法,只不q这个字W串需要有个格?key=value),讄cookie的示例代码如?/p>
document.cookie="key=escape(value)";
cookie的g能用分P;Q、逗号Q?Q、等P=Q以?qing)空根{在cookie的名中做到这点很Ҏ(gu)Q但要保存的值是不确定的。如何来存储q些值呢Q方 法是用escape()函数q行~码Q它能将一些特D符号用十六进制表C,例如I格会(x)~码?#8220;20%”Q从而可以存储于cookiegQ而且使用?U方案还可以避免中文q的出现。value上用了escapeҎ(gu)。在取值的时候需要unescape(value)对value再进行{码即可?/p>
如果惌|多个cookie需要多ơ用这L(fng)Ҏ(gu)。正的讄Ҏ(gu)是:(x)
document.cookie="key=escape(value)";
document.cookie="key1=escape(value1)"
而不?br />
document.cookie="key=escape(value);key1=escape(value1)";
如果惛_出cookie的|可以直接调用document.cookie获得Q如果有多个|多个值用分号(;)分隔Q每个值用{号(=)分隔Q我们可以对cookie先按照分?;)q行分隔(split)Q然后再按等?=)分隔(split)。然后@环比较key的|如果key相等Q则取出value。需要注意一点,如果有多个|W二个值的key值前面多一个空|需要去除。下面我l出获取cookie的示例代?/p>
function getCookie(key){
var aCookie = document.cookie.split(";");
for (var i=0; i < aCookie.length; i++){
var aCrumb = aCookie[i].split("=");
if (key === aCrumb[0].replace(/^\s*|\s*$/,"")){
return unescape(aCrumb[1]);
}
}
}
l过前面的示例代码在一个页面设|cookie后在q个面也能取到Q但是cookie存在哪里了。通常情况下,cookie?x)存攑֜C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files目录下。但是我们删除了q个文g夹下的所有文件后Q再获得cookie,q能够访问到。关闭浏览器后,再次打开览器后q能获得到cookie。那cookie的默认生存期是多久呢。怎么才能清除cookie呢。非常抱歉,我也不知道存哪了Q但是只要注销或重启之后,讄的cookie销毁。我个h认ؓ(f)q是设计js的cookie的一个bug.因ؓ(f)用户不能够通过一U方式及(qing)时清除cookie是非怸友好的。我们可以通过讄cookie时可以传递一个属性expiresQ该属性的作用是设|cookie的生存期。设|cookie的生存期的示例代码如下:(x)
var liveDate = new Date();
liveDate.setTime(liveDate.getTime() + 3*24*60*60*1000);
document.cookie="name=test;expires=" + liveDate.toGMTString();
上面代码讄cookie的name的存?gu)zL间ؓ(f)3天。删除cookie的值就是设|expires一个过期的旉卛_Q示例代码如?br />
var liveDate = new Date();
liveDate.setTime(liveDate.getTime() - 10000);
document.cookie = "name=test;expires=" + date.toGMTString();
但是有趣的是Q设|了expires属性后Q我们在C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files目录下发现有存储cookie的文件。此时我们删除该文g后,发现讄的cookie实销毁了。这正符合我们的要求。所以徏议用js讄cookie的时候一定要讄expires属性,正常来说我们要用到cookie的时候就应该Ҏ(gu)需求明设计cookie存活多久?/p>
下面我们再说一下js操作cookie的作用域。默认情况下js操作cookie的作用域是目录的,也就是在当前目录下设|的cookieQ当前目录及(qing)该目录下的所有子目录下的所有文仉能够讉K该cookie,例如?a target="_blank" eventslistuid="e3">http://localhost:8090/APPTest/aaa/testCookie.html中设|的cookie,?a target="_blank" eventslistuid="e4">http://localhost:8090/APPTest/aaa/目录下的所有文件和http://localhost:8090/APPTest/aaa/bbb/下的所有文仉能够讉K到这个cookie,而在http://localhost:8090/APPTest/目录下的文g׃能够讉K该cookie。设|cookie时有一个path属性能够改变cookie的有效访问\径。但是目前path只能讄一个参数即"/",代表是根路径。示例代码如下:(x)
document.cookie="key=escape(value);path=/";
如果讄了path="/"Q则不管讄cookie在哪个\径,?a target="_blank" eventslistuid="e7">http://localhost:8090/APPTest/
下及(qing)所有目录及(qing)子目录下都能够访问到q个cookie.理论上如果设|path="\aaa",该cookie的作用域应该是aaa目录下及(qing)aaa目录下的所有子目录下都能够讉K到这个cookie,但实际上q没有实现这L(fng)功能Q我认ؓ(f)q也是js实现cookie的一个bug。这里有两个问题需要注意,一是如果设|两个同名的cookie,?a target="_blank" eventslistuid="e8">http://localhost:8090/APPTest/aaa/下设|了两个cookie,一个设|了path?/"Q另一个cookie不带path参数,那么?a target="_blank" eventslistuid="e9">http://localhost:8090/APPTest/aaa/?x)访问到两个同名的cookie|而在路径?a target="_blank" eventslistuid="e10">http://localhost:8090/APPTest/只能讉K到全局的cookie倹{但是我们没有办法通过路径d分。第二个需要注意的是删除cookie,如果讄cookie时带path属性,那么在删除的时候一定要加上path属性,否则删除的是当前目录下设|的cookie倹{?/p>
另外在设|cookie时还能够讄两个属性,分别是domain和secureQdomain代表讄cookie的访问域Q下面我l出domain基本理论?br />
例如Q?a target="_blank" eventslistuid="e11">www.google.com和gmail.google.com是两个不同的主机名。默认情况下Q一个主Z创徏的cookie在另一个主Z是不能被讉K的,但可以通过domain参数来实现对其的控制Q其语法格式为:(x)
document.cookie="name=value;domain=cookieDomain";
以googleZQ要实现跨主问,可以写ؓ(f)Q?
document.cookie="name=value;domain=.google.com";
q样Q所有google.com下的L都可以访问该cookie?因ؓ(f)q个参数我没有测试过也没有用q,所以如果当用到q个参数Q可以参考上面的理论部分?/p>
secure代表该cookie是否是安全的。如果设|了该属性,只有使用https协议才能够访问到
该cookie.
下面l出cookie的完整格?br />
name=<value>[; expires=<date>][; domain=<domain>][; path=<path>][; secure]
名称=<?gt;[; expires=<日期>][; domain=<?gt;][; path=<路径>][; 安全]