2019/4/12 8:18:11
我們已經知道,在 document 對象中有(yǒu)一個(gè) cookie 屬性。但(dàn)是 Cookie 又(yòu)是什(shén)麽?“某些 Web 站點在您的(de)硬盤上(shàng)用(yòng)很小(xiǎo)的(de)文(wén)本文(wén)件(jiàn)存儲了一些信息,這些文(wén)件(jiàn)就稱爲 Cookie。”—— MSIE 幫助。一般來說,Cookies 是 CGI 或類似,比 HTML 高(gāo)級的(de)文(wén)件(jiàn)、程序等創建的(de),但(dàn)是 javascript 也(yě)提供了對 Cookies 的(de)很全面的(de)訪問權利。
我們先要學一學 Cookie 的(de)基本知識。
每個(gè) Cookie 都(dōu)是這樣的(de):<cookie名>=<值>
<cookie名>的(de)限制(zhì)與 javascript 的(de)命名限制(zhì)大(dà)同小(xiǎo)異,少(shǎo)了“不能(néng)用(yòng) javascript 關鍵字”,多了“隻能(néng)用(yòng)可(kě)以用(yòng)在 URL 編碼中的(de)字符”。後者比較難懂,但(dàn)是隻要你(nǐ)隻用(yòng)字母和(hé)數字命名,就完全沒有(yǒu)問題了。<值>的(de)要求也(yě)是“隻能(néng)用(yòng)可(kě)以用(yòng)在 URL 編碼中的(de)字符”。
每個(gè) Cookie 都(dōu)有(yǒu)失效日期,一旦電腦(nǎo)的(de)時鍾過了失效日期,這個(gè) Cookie 就會(huì)被删掉。我們不能(néng)直接删掉一個(gè) Cookie,但(dàn)是可(kě)以用(yòng)設定失效日期早于現在時刻的(de)方法來間接删掉它。
每個(gè)網頁,或者說每個(gè)站點,都(dōu)有(yǒu)它自己的(de) Cookies,這些 Cookies 隻能(néng)由這個(gè)站點下的(de)網頁來訪問,來自其他(tā)站點或同一站點下未經授權的(de)區域的(de)網頁,是不能(néng)訪問的(de)。每一“組”Cookies 有(yǒu)規定的(de)總大(dà)小(xiǎo)(大(dà)約 2KB 每“組”),一超過最大(dà)總大(dà)小(xiǎo),則最早失效的(de) Cookie 先被删除,來讓新的(de) Cookie“安家”。
現在我們來學習(xí)使用(yòng) documents.cookie 屬性。
如(rú)果直接使用(yòng) documents.cookie 屬性,或者說,用(yòng)某種方法,例如(rú)給變量賦值,來獲得 documents.cookie 的(de)值,我們就可(kě)以知道在現在的(de)文(wén)檔中有(yǒu)多少(shǎo)個(gè) Cookies,每個(gè) Cookies 的(de)名字,和(hé)它的(de)值。例如(rú),在某文(wén)檔中添加“document.write(documents.cookie)”,結果顯示
name=kevin; email=kevin@kevin.compagelist.html
這意味著(zhe),文(wén)檔包含 3 個(gè) Cookies:name, email 和(hé) lastvisited,它們的(de)值分(fēn)别是 kevin, kevin@kevin.com 和(hé) index.html。可(kě)以看到(dào),兩個(gè) Cookies 之間是用(yòng)分(fēn)号和(hé)空格隔開(kāi)的(de),于是我們可(kě)以用(yòng) cookieString.split('; ') 方法得到(dào)每個(gè) Cookie 分(fēn)開(kāi)的(de)一個(gè)數組(先用(yòng) var cookieString = documents.cookie)。
設定一個(gè) Cookie 的(de)方法是對 documents.cookie 賦值。與其它情況下的(de)賦值不同,向 documents.cookie 賦值不會(huì)删除掉原有(yǒu)的(de) Cookies,而隻會(huì)增添 Cookies 或更改原有(yǒu) Cookie。賦值的(de)格式:
documents.cookie = 'cookieName=' + escape('cookievalue')
+ ';expires=' + expirATIonDateObj.toGMTString();
是不是看到(dào)頭暈了呢?cookieName 表示 Cookie 的(de)名稱,cookievalue 表示 Cookie 的(de)值,expirATIonDateObj 表示儲存著(zhe)失效日期的(de)日期對象名,如(rú)果不需要指定失效日期,則不需要第二行(xíng)。不指定失效日期,則浏覽器(qì)默認是在關閉浏覽器(qì)(也(yě)就是關閉所有(yǒu)窗口)之後過期。
首先 escape() 方法:爲什(shén)麽一定要用(yòng)?因爲 Cookie 的(de)值的(de)要求是“隻能(néng)用(yòng)可(kě)以用(yòng)在 URL 編碼中的(de)字符”。我們知道“escape()”方法是把字符串按 URL 編碼方法來編碼的(de),那我們隻需要用(yòng)一個(gè)“escape()”方法來處理(lǐ)輸出到(dào) Cookie 的(de)值,用(yòng)“unescape()”來處理(lǐ)從 Cookie 接收過來的(de)值就萬無一失了。而且這兩個(gè)方法的(de)最常用(yòng)途就是處理(lǐ) Cookies。其實設定一個(gè) Cookie 隻是“documents.cookie = 'cookieName=cookievalue'”這麽簡單,但(dàn)是爲了避免在 cookievalue 中出現 URL 裏不準出現的(de)字符,還是用(yòng)一個(gè) escape() 好。
然後“expires”前面的(de)分(fēn)号:注意到(dào)就行(xíng)了。是分(fēn)号而不是其他(tā)。
最後 toGMTString() 方法:設定 Cookie 的(de)時效日期都(dōu)是用(yòng) GMT 格式的(de)時間的(de),其它格式的(de)時間是沒有(yǒu)作用(yòng)的(de)。
現在我們來實戰一下。設定一個(gè)“name=rose”的(de) Cookie,在 3 個(gè)月(yuè)後過期。
var expires = new Date();
expires.setTime(expires.getTime() + 3 * 30 * 24 * 60 * 60 * 1000);
/* 三個(gè)月(yuè) x 一個(gè)月(yuè)當作 30 天 x 一天 24 小(xiǎo)時
x 一小(xiǎo)時 60 分(fēn) x 一分(fēn) 60 秒 x 一秒 1000 毫秒 */
documents.cookie = 'name=rose;expires=' + expires.toGMTString();
爲什(shén)麽沒有(yǒu)用(yòng) escape() 方法?這是因爲我們知道 rose 是一個(gè)合法的(de) URL 編碼字符串,也(yě)就是說,'rose' == escape('rose')。一般來說,如(rú)果設定 Cookie 時不用(yòng) escape(),那獲取 Cookie 時也(yě)不用(yòng) unescape()。
再來一次:編寫一個(gè)函數,作用(yòng)是查找指定 Cookie 的(de)值。
function getCookie(cookieName) {
var cookieString = documents.cookie;
var start = cookieString.indexOf(cookieName + '=');
// 加上(shàng)等号的(de)原因是避免在某些 Cookie 的(de)值裏有(yǒu)
// 與 cookieName 一樣的(de)字符串。
if (start == -1) // 找不到(dào)
return null;
start += cookieName.length + 1;
var end = cookieString.indexOf(';', start);
if (end == -1) return unescape(cookieString.substring(start));
return unescape(cookieString.substring(start, end));
}
這個(gè)函數用(yòng)到(dào)了字符串對象的(de)一些方法,如(rú)果你(nǐ)不記得了(你(nǐ)是不是這般沒記性啊),請快去查查。這個(gè)函數所有(yǒu)的(de) if 語句都(dōu)沒有(yǒu)帶上(shàng) else,這是因爲如(rú)果條件(jiàn)成立,程序運行(xíng)的(de)都(dōu)是 return 語句,在函數裏碰上(shàng) return,就會(huì)終止運行(xíng),所以不加 else 也(yě)沒問題。該函數在找到(dào) Cookie 時,就會(huì)返回 Cookie 的(de)值,否則返回“null”。
現在我們要删除剛才設定的(de) name=rose Cookie。
var expires = new Date();
expires.setTime(expires.getTime() - 1);
documents.cookie = 'name=rose;expires=' + expires.toGMTString();
可(kě)以看到(dào),隻需要把失效日期改成比現在日期早一點(這裏是早 1 毫秒),再用(yòng)同樣的(de)方法設定 Cookie,就可(kě)以删掉 Cookie 了。
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967