掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

document.cookie:客戶端操作cookie

2019/4/12 8:18:11

document.cookie:客戶端操作cookie

  我們已經知道,在 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)了&ldquo;不能(néng)用(yòng) javascript 關鍵字&rdquo;,多了&ldquo;隻能(néng)用(yòng)可(kě)以用(yòng)在 URL 編碼中的(de)字符&rdquo;。後者比較難懂,但(dàn)是隻要你(nǐ)隻用(yòng)字母和(hé)數字命名,就完全沒有(yǒu)問題了。<值>的(de)要求也(yě)是&ldquo;隻能(néng)用(yòng)可(kě)以用(yòng)在 URL 編碼中的(de)字符&rdquo;。

  每個(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)。每一&ldquo;組&rdquo;Cookies 有(yǒu)規定的(de)總大(dà)小(xiǎo)(大(dà)約 2KB 每&ldquo;組&rdquo;),一超過最大(dà)總大(dà)小(xiǎo),則最早失效的(de) Cookie 先被删除,來讓新的(de) Cookie&ldquo;安家&rdquo;。

  現在我們來學習(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)檔中添加&ldquo;document.write(documents.cookie)&rdquo;,結果顯示

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(&apos;; &apos;) 方法得到(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 = &apos;cookieName=&apos; + escape(&apos;cookievalue&apos;)
+ &apos;;expires=&apos; + 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)要求是&ldquo;隻能(néng)用(yòng)可(kě)以用(yòng)在 URL 編碼中的(de)字符&rdquo;。我們知道&ldquo;escape()&rdquo;方法是把字符串按 URL 編碼方法來編碼的(de),那我們隻需要用(yòng)一個(gè)&ldquo;escape()&rdquo;方法來處理(lǐ)輸出到(dào) Cookie 的(de)值,用(yòng)&ldquo;unescape()&rdquo;來處理(lǐ)從 Cookie 接收過來的(de)值就萬無一失了。而且這兩個(gè)方法的(de)最常用(yòng)途就是處理(lǐ) Cookies。其實設定一個(gè) Cookie 隻是&ldquo;documents.cookie = &apos;cookieName=cookievalue&apos;&rdquo;這麽簡單,但(dàn)是爲了避免在 cookievalue 中出現 URL 裏不準出現的(de)字符,還是用(yòng)一個(gè) escape() 好。

然後&ldquo;expires&rdquo;前面的(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è)&ldquo;name=rose&rdquo;的(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 = &apos;name=rose;expires=&apos; + expires.toGMTString();

  爲什(shén)麽沒有(yǒu)用(yòng) escape() 方法?這是因爲我們知道 rose 是一個(gè)合法的(de) URL 編碼字符串,也(yě)就是說,&apos;rose&apos; == escape(&apos;rose&apos;)。一般來說,如(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 + &apos;=&apos;);
// 加上(shàng)等号的(de)原因是避免在某些 Cookie 的(de)值裏有(yǒu)
// 與 cookieName 一樣的(de)字符串。
if (start == -1) // 找不到(dào)
return null;
start += cookieName.length + 1;
var end = cookieString.indexOf(&apos;;&apos;, 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)值,否則返回&ldquo;null&rdquo;。

  現在我們要删除剛才設定的(de) name=rose Cookie。

var expires = new Date();
expires.setTime(expires.getTime() - 1);
documents.cookie = &apos;name=rose;expires=&apos; + 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

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号 深圳市市场监督管理局企业主体身份公示