2019年7月18日 星期四

(27) 使用 Cookies 下篇

讀取Cookies
在一個Cookie檔案內可以包含多個Cookies資訊,所以,當我們要讀取某個Cookies資訊時可就累了,必須要在Cookie檔案內進行搜尋。同時,一個Cookies資訊裡還包含Cookies的名稱及它所代表的資料值,我們還得分解名稱與資料值,假設在我們Cookie檔案內的內容如下:
  1. myname=charles; age=30
在這個Cookie檔案內有兩個Cookies:一個是「myname」,它的值為「charles」;另一個是「myname」,它的值為「30」,而兩個Cookies之間是使用一個分號及一個空白(space)來區隔。那如果我要取「myname」這個Cookies的值「charles」該如何處理?

位置搜尋法
我們來建立一個擷取Cookies值的函式,假設這個擷取函式的名稱為getValue(),當我們想要得知某個Cookies的值時,只要呼叫getValue()函式,同時在呼叫時傳遞一個Cookies的名稱給getValue()函式,getValue()函式就會取得此Cookies的值:
Cookies擷取函式

  1. function getValue(cookiesname)
  2. {
  3. cookiesname = cookiesname + “=”
  4. if (document.cookie.length > 0)
  5. }
  6. position = document.cookie.indexOf(cookiesname)
  7. if (position != -1)
  8. {
  9. position = position + cookiesname.length
  10. endposition = document.cookie.indexOf(“;” , position)
  11. if (endposition == -1)
  12. {
  13. endposition = document.cookie.length
  14. }
  15. return unescape(document.cookie.substring(position,endposition))
  16. }
  17. }
  18. return null
  19. }
  • 程式碼第3行,將我們要尋找的Cookies名稱再加上一個等號「=」,因為等號之後的內容才是Cookies的值。
  • 在搜尋與擷取Cookies的值之前,我們先判斷Cookie檔案中是否存在Cookies資訊,當Cookie檔案長度大於0,代表檔案內有Cookies存在,才開始執行搜尋與擷取Cookies的動作(程式碼第4行)。
  • 程式碼第5行,接著利用indexOf()函式開始搜尋Cookies的位置,並將搜尋後的Cookies名稱位置設定給變數position。
  • 程式碼第6行,先判斷搜尋Cookies名稱的結果,如果變數position不等於-1,代表我們要搜尋的Cookies存在,此時才開始進行Cookies值的擷取工作。
  • 程式碼第8行,為何要將position變數值加上Cookies名稱(現在是:Cookies名=)的長度?因為等號之後的內容才是Cookies的值,position變數值加上Cookies名稱的長度,才是擷取Cookies值的起始位置!
  • 程式碼第9行,決定擷取Cookies值的終止位置,因為每個Cookies的尾端都會有一個分號「;」作為結束點,所以,我們只要由Cookies值的起始位置往後找到分號,就可得到Cookies值的終止位置。
  • 程式碼第10到13行,這是預防我們要找的Cookies剛好是全部Cookies中的最後一個,如果是最後一個,那麼Cookies值的尾端就不會有一個分號「;」,所以Cookies值的終止位置就剛好是Cookie檔案的長度。
  • 程式碼第14行,擷取Cookies值起始位置至Cookies值終止位置的Cookies值。

實例學習:
將寫入的瀏覽者姓名擷取出來。
  1. <HTML>
  2. <HEAD>
  3. <TITLE>擷取Cookies</TITLE>
  4. </HEAD>
  5. <BODY>
  6. <SCRIPT Language="JavaScript">
  7. //Cookies值擷取函式
  8. function getValue(cookiesname)
  9. {
  10. cookiesname = cookiesname + "="
  11. if (document.cookie.length > 0)
  12. {
  13. position = document.cookie.indexOf(cookiesname)
  14. if (position != -1)
  15. {
  16. position = position + cookiesname.length
  17. endposition = document.cookie.indexOf(";" , position)
  18. if (endposition == -1)
  19. {
  20. endposition = document.cookie.length
  21. }
  22. return unescape(document.cookie.substring(position,endposition))
  23. }
  24. }
  25. return null
  26. }

  27. //呼叫Cookies值擷取函式
  28. name=getValue("username")
  29. //將取出的Cookies顯示出來
  30. alert ("你的名字是:" + name)

  31. </SCRIPT>
  32. </BODY>
  33. </HTML>
       提示!!
Escape函式會將特殊字元或符號以對應的escape字串替代,若我們要還原這些特殊字元或符號則可以使用unscape函式將其還原。


刪除Cookies
要將Cookies刪除方法很簡單,只要將Cookies的到期日設定為「過去的日期」即可,所謂的「過去的日期」就是比你目前系統時間還早的日期啦!但是,你所要更新的Cookies名稱必須與你要刪除的Cookies名稱相同!

假設你的機器裡有一個Cookies它的名稱是testCookies,現在你要把它刪除了:
  1. cookiesname=”testCookies”
  2. deltime=”Thu, 29 Sep 1990 00:00:01 GMT”
  3. document.cookie = cookiesname + ”=; expires=” + deltime
注意喔!deltime變數內的日期是格林威治格式,而且是要比你系統時間更早的日期。

如果你覺得每次刪除Cookies都要寫一長串的日期很煩,那就把刪除Cookies的敘述寫成一個函式吧!當你要刪除Cookies的時候,就呼叫函式並傳給函式一個Cookies名稱就可以將該Cookies刪除了,如下面這個clear()函式:
  1. function clear(cookiesname)
  2. {
  3. document.cookie = cookiesname + ”=; expires= Thu, 29 Sep 1990 00:00:01 GMT”
  4. }
clear()函式只是將你想刪除的Cookies值清除,並把到期日設定為以前的時間而已,你不要以為這樣Cookies就不見了呦!還要等你將瀏覽器關閉之後,它才會真正的消失。

沒有留言:

張貼留言