JavaScriptCookie與存儲css
學習要點:html
1.cookie瀏覽器
2.cookie侷限性緩存
3.其餘存儲安全
隨着Web愈來愈複雜,開發者急切的須要可以本地化存儲的腳本功能。這個時候,第一個出現的方案:cookie誕生了。cookie的意圖是:在本地的客戶端的磁盤上以很小的文件形式保存數據。服務器
一.Cookiecookie
cookie也叫HTTP Cookie,最初是客戶端與服務器端進行會話使用的。好比,會員登陸,下次回訪網站時無須登陸了;或者是購物車,購買的商品沒有及時付款,過兩天發現購物車裏還有以前的商品列表。session
HTTP Cookie要求服務器對任意HTTP請求發送Set-Cookie,所以,Cookie的處理原則上須要在服務器環境下進行。固然,如今大部分瀏覽器在客戶端也能實現Cookie的生成和獲取。(目前Chrome不能夠在客戶端操做,其餘瀏覽器都可)dom
cookie的組成函數
cookie由名/值對形式的文本組成:name=value。完整格式爲:
name=value; [expires=date]; [path=path]; [domain=somewhere.com]; [secure]
中括號是可選,name=value是必選。
向磁盤寫入cookie
使用方式:
document.cookie = 名稱
document.cookie = 名稱 = 值
完整形式:document.cookie = 'user=值;expires=失效時間;path=訪問路徑;domain=訪問域名;secure=安全的https限制通信';
若是名稱或者值有中文須要編碼和解碼
document.cookie = 'user=' + encodeURIComponent('李炎恢'); //編碼方式向磁盤寫入cookie alert(decodeURIComponent(document.cookie)); //解碼方式讀取寫入的cookie
讀取寫入的cookie
使用方式:
document.cookie
若是寫入有編碼,讀取就須要解碼
document.cookie = 'user=' + encodeURIComponent('李炎恢'); //編碼方式向磁盤寫入cookie alert(decodeURIComponent(document.cookie)); //解碼方式讀取寫入的cookie
expires=cookie有效時間
每一個瀏覽器都各自保存了cookie文件,設置有效時間,就是告訴瀏覽器這個cookie保存多久,
失效時間,若是沒有聲明,則爲瀏覽器關閉後即失效。聲明瞭失效時間,那麼時間到期後方能失效。
設置失效時間
expires=失效時間(單位Mon Dec 26 2016 15:07:40 GMT+0800)
var date = new Date(); //建立日期對象 //getDate獲取系統當前日期 //setDate將日期轉換成毫秒數 date.setDate(date.getDate() + 7); //alert(date); 返回Mon Dec 26 2016 15:07:40 GMT+0800 //向磁盤寫入一個cookie文件,名稱爲user,值爲林貴秀編碼,有效時間expires=有效日期 document.cookie = "user= " + encodeURIComponent('林貴秀') +";expires=" + date;
PS:能夠經過Firefox瀏覽器查看和驗證失效時間。若是要提早刪除cookie也很是簡單,只要從新建立cookie把時間設置當前時間以前便可:date.getDate() - 1或new Date(0)。
path=cookie訪問路徑
訪問路徑,當設置了路徑,那麼只有設置的那個路徑文件才能夠訪問cookie。
var date = new Date(); //建立日期對象 //getDate獲取系統當前日期 //setDate將日期轉換成毫秒數 date.setDate(date.getDate() + 7); //alert(date); 返回Mon Dec 26 2016 15:07:40 GMT+0800 var path = '/js/'; //表示當前工程目錄下的js文件夾下 //向磁盤寫入一個cookie文件,名稱爲user,值爲林貴秀編碼,有效時間expires=有效日期 document.cookie = "user= " + encodeURIComponent('林貴秀') +";expires=" + date + ";path=" + path;
domain=cookie訪問域名
訪問域名,用於限制只有設置的域名才能夠訪問,那麼沒有設置,會默認限制爲建立cookie的域名
var date = new Date(); //建立日期對象 //getDate獲取系統當前日期 //setDate將日期轉換成毫秒數 date.setDate(date.getDate() + 7); //alert(date); 返回Mon Dec 26 2016 15:07:40 GMT+0800 var path = '/js/'; //表示當前工程目錄下的js文件夾下 var domain = 'localhost'; //設置訪問域名 //向磁盤寫入一個cookie文件,名稱爲user,值爲林貴秀編碼,有效時間expires=有效日期 document.cookie = "user= " + encodeURIComponent('林貴秀') +";expires=" + date + ";path=" + path + ";domain=" + domain;
PS:若是定義了60.com,那麼在這個域名下的任何網頁均可訪問,若是定義了v.60.com,那麼只能在這個二級域名訪問該cookie,而主域名和其餘子域名則不能訪問。
PS:設置域名,必須在當前域名綁定的服務器上設置,若是在60.com服務器上隨意設置其餘域名,則會沒法建立cookie。
secure安全的https限制通信
安全設置,指明必須經過安全的通訊通道來傳輸(HTTPS)才能獲取cookie。僅限加密鏈接
var date = new Date(); //建立日期對象 //getDate獲取系統當前日期 //setDate將日期轉換成毫秒數 date.setDate(date.getDate() + 7); //alert(date); 返回Mon Dec 26 2016 15:07:40 GMT+0800 var path = '/js/'; //表示當前工程目錄下的js文件夾下 var domain = 'localhost'; //設置訪問域名 //向磁盤寫入一個cookie文件,名稱爲user,值爲林貴秀編碼,有效時間expires=有效日期 document.cookie = "user= " + encodeURIComponent('林貴秀') +";expires=" + date + ";path=" + path + ";domain=" + domain + ";secure";
PS:https安全通訊連接須要單獨配置。
JavaScript設置、讀取和刪除並非特別的直觀方便,咱們能夠封裝成函數來方便調用。
//建立cookie setCookie('usr1', '林閨秀1', 1); setCookie('usr2', '林閨秀2', 2); setCookie('usr3', '林閨秀3', 3); //建立cookie,建立cookie函數 //setCookie函數接收cookie,名稱,值,失效日期(天數),[訪問路徑,訪問域名,安全通信https限制] function setCookie(name, value, expires, path, domain, secure) { //將接收到的名稱和值編碼後,格式化成鍵值對 var cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value); if (typeof expires == "number" && expires > 0) { //判斷接收到的失效日期,是不是數值類型而且大於0 var date = new Date(); //建立日期對象 date.setDate(date.getDate() + expires); //獲取系統當前時間,加上接收到的失效時間等於總失效日期 cookieText += '; expires=' + date; //將失效日期累加到cookieText } if (path) { //判斷訪問路徑是否存在 cookieText += '; expires=' + path; //若是訪問路徑存在,將訪問路徑累加到cookieText } if (domain) { //判斷訪問域名是否存在 cookieText += '; domain=' + domain; //若是訪問域名存在,將訪問域名累加到cookieText } if (secure) { //判斷https通信限制是否存在 cookieText += '; secure'; //若是https通信限制存在,將https通信限制累加到cookieText } document.cookie = cookieText; //向磁盤寫入cookie文件 } //獲取cookie alert(getCookie('usr1')); alert(getCookie('usr2')); alert(getCookie('usr3')); //獲取cookie,獲取cookie函數,獲取cookie名稱的值 function getCookie(name) { //接收要獲取的cookie名稱, //將接收到的cookie名稱進行編碼後,格式化賦值給cookieName var cookieName = encodeURIComponent(name) + '='; //用編碼和格式化後的cookie名稱,在document.cookie裏查找它的索引位置 var cookieStart = document.cookie.indexOf(cookieName); //默認cookie值爲空 var cookieValue = null; if (cookieStart > -1) { //判斷若是查找cookie名稱的索引大於負一 //從cookie名稱開始搜索;的位置 var cookieEnd = document.cookie.indexOf(';', cookieStart); if (cookieEnd == -1) { //判斷若是從cookie名稱開始搜索;的位置等於負一 cookieEnd = document.cookie.length; //cookieEnd從新賦值等於document.cookie的長度 } //截取字符串,cookie名稱位置加上cookie名稱長度等於截取開始位置,從cookie名稱開始搜索;引號的位置爲結束位置 //將截取的字符串解碼 cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd)); } return cookieValue; //返回解碼後的cookie名稱值 } //刪除cookie unsetCookie('usr1'); //刪除cookie,刪除cookie函數 function unsetCookie(name) { //接收要刪除cookie名稱 //從新建立此cookie,cookie名稱等於空,過時時間設置成過去,這樣cookie就失效了 document.cookie = name + "= ; expires=" + new Date(0); }
二.cookie侷限性
cookie雖然在持久保存客戶端用戶數據提供了方便,分擔了服務器存儲的負擔。可是還有不少侷限性的。
第一:每一個特定的域名下最多生成20個cookie(根據不一樣的瀏覽器有所區別)。
1.IE6或更低版本最多20個cookie
2.IE7和以後的版本最多能夠50個cookie。IE7最初也只能20個,以後因被升級不定後增長了。
3.Firefox最多50個cookie
4.Opera最多30個cookie
5.Safari和Chrome沒有作硬性限制。
PS:爲了更好的兼容性,因此按照最低的要求來,也就是最多不得超過20個cookie。當超過指定的 cookie時,瀏覽器會清理掉早期的cookie。IE和Opera會清理近期最少使用的cookie,Firefox會隨機清理cookie。
第二:cookie的最大大約爲4096字節(4k),爲了更好的兼容性,通常不能超過4095字節便可。
第三:cookie存儲在客戶端的文本文件,因此特別重要和敏感的數據是不建議保存在cookie的。好比銀行卡號,用戶密碼等。
三.其餘存儲
userData儲存IE提供的一種存儲其實屬於css,非IE不支持,【及不推薦使用】IE10以上也不支持,爲了將移除
IE提供了一種存儲能夠持久化用戶數據,叫作userData,從IE5.0就開始支持。每一個數據最多128K,每一個域名下最多1M。這個持久化數據存放在緩存中,若是緩存沒有清理,那麼會一直存在。
//首先要在html頁面寫上cssstyle="behavior:url(#default#userData)" //<div style="behavior:url(#default#userData)" id="box"></div> addEvent(window, 'load', function () { //建立事件,等待頁面加載完畢後激發函數 //經過id獲取到標籤元素, var box = document.getElementById('box'); //給元素添加一個屬性名稱和值,若是屬性名稱和值有中文須要編碼 box.setAttribute('name', encodeURIComponent('林貴秀')); //保存文件,裏面寫名稱,至關於cookie名稱 box.save('bookinfo'); //box.removeAttribute('name'); //刪除userDate //box.save('bookinfo'); box.load('bookinfo'); //至關於加載cookie名稱,裏面接收名稱 //解碼打印出元素的屬性值 alert(decodeURIComponent(box.getAttribute('name'))); }); //跨瀏覽器添加事件,添加事件兼容 function addEvent(obj, type, fn) { //添加事件函數,接收3個參數,1事件對象,2事件名稱,3事件函數 //判斷瀏覽器若是支持w3c if (obj.addEventListener) { //就用w3c的addEventListener方法添加對象,將事件名稱和事件函數傳入添加事件 obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { //判斷若是瀏覽器是IE9如下,就用IE的方法attachEvent添加事件 //將事件名稱和事件函數傳入建立對象 obj.attachEvent('on' + type, fn); } }
Web存儲
在比較高版本的瀏覽器,JavaScript提供了sessionStorage和globalStorage。在HTML5中提供了localStorage來取代globalStorage。而瀏覽器最低版本爲:IE8+、Firefox3.5+、Chrome 4+和Opera10.5+。
PS:因爲這三個對瀏覽器版本要求較高,咱們就只簡單的在Firefox瞭解一下,有興趣的能夠經過關鍵字搜索查詢。
sessionStorage數據Web存儲
//經過方法存儲和獲取 sessionStorage.setItem('name', '李炎恢'); //存儲數據 alert(sessionStorage.getItem('name')); //獲取存儲數據 //經過屬性存儲和獲取 sessionStorage.book = '李炎恢'; //存儲數據 alert(sessionStorage.book); //獲取存儲數據 //刪除存儲 sessionStorage.removeItem('name');
因爲localStorage代替了globalStorage,因此在Firefox、Opera和Chrome目前的最新版本已不支持。
localStorage數據Web存儲
//經過方法存儲和獲取 localStorage.setItem('name', '李炎恢'); //儲存數據 alert(localStorage.getItem('name')); //讀取儲存數據 //經過屬性存儲和獲取 localStorage.book = '李炎恢'; //儲存數據 alert(localStorage.book); //讀取儲存數據 //刪除存儲 localStorage.removeItem('name');
PS:這三個對象都是永久保存的,保存在緩存裏,只有手工刪除或者清理瀏覽器緩存方可失效。在容量上也有一些限制,主要看瀏覽器的差別,Firefox3+、IE8+、Opera爲5M,,Chrome和Safari爲2.5M。