最近看了試卷題目發現自己會的十分的匱乏,
第一題就把自己難住了,知道有這個東西,但是實際上沒有操作過。
=========================================
cookie是瀏覽器提供的一種機制,它將document 對象的cookie屬性提供給JavaScript。可以由JavaScript對其進行控制,而並不是JavaScript本身的性質。cookie是存於用戶硬盤的一個文件,這個文件通常對應於一個域名,當瀏覽器再次訪問這個域名時,便使這個cookie可用。因此,cookie可以跨越一個域名下的多個網頁,但不能跨越多個域名使用。
不同的瀏覽器對cookie的實現也不一樣,但其性質是相同的。例如在Windows 2000以及Windows xp中,cookie文件存儲於documents and settings\userName\cookie\文件夾下。通常的命名格式為:userName@domain.txt。
cookie機制將信息存儲於用戶硬盤,因此可以作為全局變量,這是它最大的一個優點。它可以用於以下幾種場合。
(1)保存用戶登錄狀態。例如將用戶id存儲於一個cookie內,這樣當用戶下次訪問該頁面時就不需要重新登錄了,現在很多論壇和社區都提供這樣的功能。 cookie還可以設置過期時間,當超過時間期限后,cookie就會自動消失。因此,系統往往可以提示用戶保持登錄狀態的時間:常見選項有一個月、三個 月、一年等。
(2)跟蹤用戶行為。例如一個天氣預報網站,能夠根據用戶選擇的地區顯示當地的天氣情況。如果每次都需要選擇所在地是煩瑣的,當利用了 cookie后就會顯得很人性化了,系統能夠記住上一次訪問的地區,當下次再打開該頁面時,它就會自動顯示上次用戶所在地區的天氣情況。因為一切都是在后 台完成,所以這樣的頁面就像為某個用戶所定制的一樣,使用起來非常方便。
(3)定制頁面。如果網站提供了換膚或更換布局的功能,那么可以使用cookie來記錄用戶的選項,例如:背景色、分辨率等。當用戶下次訪問時,仍然可以保存上一次訪問的界面風格。
(4)創建購物車。正如在前面的例子中使用cookie來記錄用戶需要購買的商品一樣,在結賬的時候可以統一提交。例如淘寶網就使用cookie記錄了用戶曾經瀏覽過的商品,方便隨時進行比較。
當然,上述應用僅僅是cookie能完成的部分應用,還有更多的功能需要全局變量。cookie的缺點主要集中於安全性和隱私保護。主要包括以下幾種:
(1)cookie可能被禁用。當用戶非常注重個人隱私保護時,他很可能禁用瀏覽器的cookie功能;
(2)cookie是與瀏覽器相關的。這意味着即使訪問的是同一個頁面,不同瀏覽器之間所保存的cookie也是不能互相訪問的;
(3)cookie可能被刪除。因為每個cookie都是硬盤上的一個文件,因此很有可能被用戶刪除;
(4)cookie安全性不夠高。所有的cookie都是以純文本的形式記錄於文件中,因此如果要保存用戶名密碼等信息時,最好事先經過加密處理。
這個例子中我們要創建一個存儲訪問者名字的 cookie。當訪問者首次訪問網站時,他們會被要求填寫姓名。名字會存儲於 cookie 中。當訪問者再次訪問網站時,他們就會收到歡迎詞。
首先,我們會創建一個可在 cookie 變量中存儲訪問者姓名的函數:
| 代碼如下 |
復制代碼 |
| function Setcookie (name, value) { //設置名稱為name,值為value的Cookie var expdate = new Date(); //初始化時間 expdate.setTime(expdate.getTime() + 30 * 60 * 1000); //時間 document.cookie = name+"="+value+";expires="+expdate.toGMTString()+";path=/"; //即document.cookie= name+"="+value+";path=/"; 時間可以不要,但路徑(path)必須要填寫,因為JS的默認路徑是當前頁,如果不填,此cookie只在當前頁面生效!~ } |
上面這個函數中的參數存有 cookie 的名稱、值以及過期天數。
在上面的函數中,我們首先將天數轉換為有效的日期,然后,我們將 cookie 名稱、值及其過期日期存入 document.cookie 對象。
之后,我們要創建另一個函數來檢查是否已設置 cookie:
| 代碼如下 |
復制代碼 |
| function getCookie(c_name) { if (document.cookie.length>0) { c_start=document.cookie.indexOf(c_name + "=") if (c_start!=-1) { c_start=c_start + c_name.length+1 c_end=document.cookie.indexOf(";",c_start) if (c_end==-1) c_end=document.cookie.length return unescape(document.cookie.substring(c_start,c_end)) } } return "" } |
上面的函數首先會檢查 document.cookie 對象中是否存有 cookie。假如 document.cookie 對象存有某些 cookie,那么會繼續檢查我們指定的 cookie 是否已儲存。如果找到了我們要的 cookie,就返回值,否則返回空字符串。
最后,我們要創建一個函數,這個函數的作用是:如果 cookie 已設置,則顯示歡迎詞,否則顯示提示框來要求用戶輸入名字。
| 代碼如下 |
復制代碼 |
| function checkCookie() { username=getCookie('username') if (username!=null && username!="") {alert('Welcome again '+username+'!')} else { username=prompt('Please enter your name:',"") if (username!=null && username!="") { setCookie('username',username,365) } } } |
一個完整實例
| 代碼如下 |
復制代碼 |
| <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title>無標題文檔</title> <script type=”text/javascript”> function getCookie(c_name) { if (document.cookie.length>0) { c_start=document.cookie.indexOf(c_name + “=”) if (c_start!=-1) { c_start=c_start + c_name.length+1 c_end=document.cookie.indexOf(“;”,c_start) if (c_end==-1) c_end=document.cookie.length return unescape(document.cookie.substring(c_start,c_end)) } } return “” } function setCookie(c_name,value,expiredays) { var exdate=new Date() exdate.setDate(exdate.getDate()+expiredays) document.cookie=c_name+ “=” +escape(value)+ ((expiredays==null) ? “” : “;expires=”+exdate.toGMTString()) } function checkCookie() { username=getCookie(‘username’) if (username!=null && username!=”") {alert(‘Welcome again ‘+username+’!')} else { username=prompt(‘Please enter your name:’,”") if (username!=null && username!=”") { setCookie(‘username’,username,365) } } } </script> </head> <body onLoad=”checkCookie()”> </body> </html> |
上面講到了cookie的創建我們現在來看一個利用cookie保存瀏覽記錄實例
瀏覽記錄的顯示是從cookie里讀出來,然后解析成json,生成html元素。因為用戶可能會同時打開好幾個頁面,這幾個頁面上可能都有瀏覽記錄,為了使即使顯示瀏覽記錄,每秒中刷新一次。
要用到2個js文件,history.js,關鍵的聊天記錄保存和讀取代碼。json.js,對json進行處理。
history.js
| 代碼如下 |
復制代碼 |
| var addHistory=function(num,id){ stringCookie=getCookie('history'); var stringHistory=""!=stringCookie?stringCookie:"{history:[]}"; var json=new JSON(stringHistory); var e="{num:"+num+",id:"+id+"}"; json['history'].push(e);//添加一個新的記錄 setCookie('history',json.toString(),30); } //顯示歷史記錄 var DisplayHistory=function(){ var p_ele=document.getElementById('history'); while (p_ele.firstChild) { p_ele.removeChild(p_ele.firstChild); } var historyJSON=getCookie('history'); var json=new JSON(historyJSON); var displayNum=6; for(i=json['history'].length-1;i>0;i--){ addLi(json['history'][i]['num'],json['history'][i]['id'],"history"); displayNum--; if(displayNum==0){break;} } } //添加一個li元素 var addLi=function(num,id,pid){ var a=document.createElement('a'); var href='product.action?pid='+id; a.setAttribute('href',href); var t=document.createTextNode(num); a.appendChild(t); var li=document.createElement('li'); li.appendChild(a); document.getElementById(pid).appendChild(li); } //添加cookie var setCookie=function(c_name,value,expiredays) { var exdate=new Date() exdate.setDate(exdate.getDate()+expiredays) cookieVal=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString()); // alert(cookieVal); document.cookie=cookieVal; } //獲取cookie function getCookie(c_name) { if (document.cookie.length>0) { c_start=document.cookie.indexOf(c_name + "=") if (c_start!=-1) { c_start=c_start + c_name.length+1 c_end=document.cookie.indexOf(";",c_start) if (c_end==-1) c_end=document.cookie.length // document.write(document.cookie.substring(c_start,c_end)+"<br>"); return unescape(document.cookie.substring(c_start,c_end)) } } return "" } |
json文件
| 代碼如下 |
復制代碼 |
| json.js var JSON = function(sJSON){ this.objType = (typeof sJSON); this.self = []; (function(s,o){for(var i in o){o.hasOwnProperty(i)&&(s[i]=o[i],s.self[i]=o[i])};})(this,(this.objType=='string')?eval('0,'+sJSON):sJSON); } JSON.prototype = { toString:function(){ return this.getString(); }, valueOf:function(){ return this.getString(); }, getString:function(){ var sA = []; (function(o){ var oo = null; sA.push('{'); for(var i in o){ if(o.hasOwnProperty(i) && i!='prototype'){ oo = o[i]; if(oo instanceof Array){ sA.push(i+':['); for(var b in oo){ if(oo.hasOwnProperty(b) && b!='prototype'){ sA.push(oo[b]+','); if(typeof oo[b]=='object') arguments.callee(oo[b]); } } sA.push('],'); continue; }else{ sA.push(i+':'+oo+','); } if(typeof oo=='object') arguments.callee(oo); } } sA.push('},'); })(this.self); return sA.slice(0).join('').replace(/[object object],/ig,'').replace(/,}/g,'}').replace(/,]/g,']').slice(0,-1); }, push:function(sName,sValue){ this.self[sName] = sValue; this[sName] = sValue; } } |
html文檔
| 代碼如下 |
復制代碼 |
| 示例程序 <script type="text/javascript" src="../js/json.js"></script> <script type="text/javascript" src="../js/history.js"></script> <ul id="history"> </ul> <script> addHistory(15810782304,2); addHistory(64654665,2); addHistory(6843212,2); addHistory(84984432521,2); setInterval("DisplayHistory()",1000); </script> |