一:cookie:javascript
1. 什麼是cookie?css
Cookie是在客戶端用於存儲會話信息的,用戶請求頁面在web服務器與瀏覽器之間傳遞。每當同一臺計算機經過瀏覽器請求某個頁面時,就會發送這個 cookie。html
2. cookie的限制?java
1. Cookie的數據大小限制只能爲4kb數據,若是數據長度超過4kb數據,超事後的數據將返回空字符串。web
2. Cookie是以文件形式存儲在客戶端計算機中,查看和修改cookie很方便,可是安全性方面很差,所以重要的數據不要使用cookie來存儲。數據庫
3. Cookie是有 有效期概念的,若是想要cookie存儲多長時間,能夠設置cookie的時間,通常的狀況下,cookie的生命週期是在遊覽器關閉的時候失效。跨域
4. Cookie是有域的概念的,在不一樣的域下,cookie不能互相使用,cookie對於那個域是有效的,全部向該域發送的請求中都會包含這個cookie 的信息的,這個值能夠包含子域(subdomain 如www.zuixiandao.cn) ,也能夠不包含它(如.zuixiandao.cn, 對於全部的zuixiandao.cn的全部子域都有效). 若是沒有明確的指定,那麼這個域會被認做來自設置cookie的那個域。瀏覽器
5. Cookie路徑的概念:對於指定域中的那個路徑,應該向服務器發送cookie,好比咱們能夠指定cookie只有從http://www.zuixiandao.cn/books/中才能訪問,那麼http://www.zuixiandao.cn的頁面就不會發送cookie信息。安全
6. Cookie失效時間的概念:表示cookie什麼時候應該被刪除,默認狀況下,瀏覽器會話結束時即將刪除全部的cookie,不過也能夠本身設置刪除時間的。這個值是個GMT格式的日期(Wdy DD-Mon-YYYY HH:MM:SS GMT),用於指定應該刪除cookie的準確時間,所以,cookie可在瀏覽器關閉後依然保存在用戶的機器上(同一個瀏覽器,不一樣的瀏覽器不能保存),若是設置的日期是過時的日期,那麼cookie馬上刪掉。服務器
7. Cookie安全標誌 指定後,cookie只有在使用SSL鏈接的時候才發送到服務器。好比:cookie信息只能發送給https://www.zuixiandao.cn, 而http://www.zuixiandao.cn的請求則不能發送cookie。
二: javascript中的cookie
document.cookie = "isg=E5AA5F2CEE8AA93BB351D1601F7B218E; thw=cn; _med=dw:1920&dh:1080&pw:1920&ph:1080&ist:0; v=0; t=1292efa78d867ff6275e6c5cb971bed7";
2. 設置cookie的超時。
expires; // 設置cookie的過時的時間
如下設置 cookie 在 365天后超時;
var date = new Date();
date.setTime(date.getTime()+365*24*3600*1000);
document.cookie = ‘key:value;expires =' + date.toGMTString();
下面是設置cookie, 刪除cookie,及 獲取cookie的封裝代碼以下:
// 獲取全部的cookies function getCookies() { var allCookies = document.cookie; return decodeURIComponent(allCookies); } // 獲取指定的cookie function getOneCookie(name) { var allCookies = document.cookie.split(";"); for(var i = 0, ilen = allCookies.length; i < ilen; i++) { var temp = allCookies[i].split("="); if($.trim(decodeURIComponent(temp[0])) == name) { return decodeURIComponent(temp[1]); } } return -1; } // 添加cookie 有效期是一年 function addCookie(name,value,expires,path,domain,secure) { var curCookie = encodeURIComponent(name) + '=' + encodeURIComponent(value); if(expires instanceof Date) { curCookie += ';expires =' + expires.toGMTString(); }else { var date = new Date();
date.setTime(date.getTime()+365*24*3600*1000); curCookie += ';expires =' + date.toGMTString(); } if(path) { curCookie += "; path=" + path; } if(domain) { curCookie += "; domain=" +domain; } if(secure) { curCookie += "; secure"; } document.cookie = curCookie; } // 刪除cookie function removeCookie(name,path,domain,secure) { addCookie(name,"",new Date(0),path,domain,secure); }
Demo實踐:
下面咱們來作一個小需求,好比一個登錄頁面,有 有戶名,密碼,記住密碼,及顯示cookie和刪除cookie按鈕。當我點擊記住密碼的時候,那麼當我第重啓開頁面時候,只要輸入用戶名,密碼會自動填充,固然咱們也能夠點擊刪除cookie按鈕進行刪除,以下代碼:
HTML代碼:
<h2>cookie介紹</h2> <p> <label>用戶名:</label> <input type="text" class="userName" id="userName"/> </p> <p> <label>密碼:</label> <input type="password" id="password"> </p> <p> <label>記住密碼:</label> <input type="checkbox" id="remember"/> </p> <input value="刪除" type="button" id="delCookie"> <input type="button" value="顯示cookie" id="showpassword">
JS代碼以下:
<script> // 獲取全部的cookies function getCookies() { var allCookies = document.cookie; return allCookies; } // 獲取指定的cookie function getOneCookie(name) { var allCookies = document.cookie.split(";"); for(var i = 0, ilen = allCookies.length; i < ilen; i++) { var temp = allCookies[i].split("="); if(temp[0] == decodeURIComponent(name)) { return decodeURIComponent(temp[1]); } } return -1; } // 添加cookie 有效期是一年 function addCookie(name,value,expires,path,domain,secure) { var curCookie = encodeURIComponent(name) + '=' + encodeURIComponent(value); if(expires instanceof Date) { curCookie += ';expires =' + expires.toGMTString(); }else { var date = new Date(); date.setTime(date.getTime()+365*24*3600*1000); curCookie += ';expires =' + date.toGMTString(); } if(path) { curCookie += "; path=" + path; } if(domain) { curCookie += "; domain=" +domain; } if(secure) { curCookie += "; secure"; } document.cookie = curCookie; } // 刪除cookie function removeCookie(name,path,domain,secure) { addCookie(name,"",new Date(0),path,domain,secure); } $("#userName").unbind('blur').bind('blur',function(){ var val = $(this).val(); if(val) { var curCookie = getOneCookie(val); if(curCookie != -1) { $("#password").val(curCookie); } } }); // 記住密碼 $("#remember").unbind('click').bind('click',function(){ if(document.getElementById("remember").checked) { if($("#userName").val() && $("#password").val()) { addCookie($("#userName").val(),$("#password").val()); alert("Saved!"); } } }); // 刪除cookie $("#delCookie").unbind('click').bind('click',function() { if($("#userName").val()) { removeCookie($("#userName").val()); alert(getCookies()); }else { alert("用戶名爲空"); } }); // 顯示cookie $("#showpassword").unbind('click').bind('click',function(){ if($("#userName").val()) { var curCookie = getOneCookie($("#userName").val()); if(curCookie != -1) { alert(curCookie); }else { alert("沒有cookie"); } }else { alert("沒有cookie"); } }); </script>
效果以下:
三:IE用戶數據;
在IE5.0中,微軟經過一個自定義行爲引入了持久化用戶數據的概念,用戶數據容許每一個文檔最多128kb的數據,每一個域名最多1MB的數據,要使用持久化數據,首先必須以下所示,使用css在某個元素上指定userData行爲:
<div style="behavior:url(#default#userData)" id="dataStore">IE用戶數據</div>
針對IE有以下使用方法:
1. getAttribute(「key」) 獲取指定的屬性值。
2. load(object) 從 userData 存儲區載入存儲的對象數據。
3. removeAttribute(「key」) 移除對象的指定屬性。
4. save(object) 將對象數據存儲到一個 userData 存儲區。
5. setAttribute(「key」,」value」) 設置指定的屬性值。
咱們繼續作一個demo來演示下在IE瀏覽器下的存儲的demo。
HTML代碼以下:
<div style="behavior:url(#default#userData)" id="dataStore">IE用戶數據</div>
<input value="IE下保存數據" type="button" id="IESave"> <input type="button" value="IE下獲取數據" id="IEGet"> <input type="button" value="IE下刪除數據" id="IERemove">
JS代碼以下:
var dataStore = document.getElementById("dataStore"); $("#IESave").click(function(e){ dataStore.setAttribute("name","tugenhua"); dataStore.setAttribute("book",'111111'); dataStore.save("bookInfo"); }); // IE下獲取數據 $("#IEGet").click(function(){ dataStore.load("bookInfo"); alert(dataStore.getAttribute("name")); alert(dataStore.getAttribute("book")); }); // IE下刪除數據 $("#IERemove").click(function(){ dataStore.removeAttribute("name"); dataStore.removeAttribute("book"); dataStore.save("bookInfo"); });
IE瀏覽器下的demo以下:
四:sessionStorage 和 localStorage
Html5新增了兩個本地存儲數據,分別是sessionStorage 和 localStorage.
瀏覽器支持程度以下:
注意:IE8 及 以上都支持 web storage。
sessionStorage: 將數據保存在session對象中,所謂session,指用戶瀏覽某個網站時,從進入網站到瀏覽器關閉的這段時間,也就是用戶瀏覽這個網站所花費的時間。
生命週期:指只在當前的窗口有效,打開一個新的同源窗口,或者說重啓瀏覽器都失效。
數據大小:能夠保存5MB甚至更多。
localStorage: 將數據保存在客戶端本地的硬件設備(一般是指硬盤,但也能夠是其餘硬件設備),即便瀏覽器被關閉了,該數據依然存在,下次打開瀏覽器訪問網站時仍然能夠繼續使用。可是,數據保存是按不一樣的瀏覽器分別進行的,也就是說,若是打開別的瀏覽器,是讀取不到在這個瀏覽器中保存的數據的。
生命週期:數據一直保存在硬盤中。持久性保存(可是不一樣的瀏覽器保存的數據,是不能通用的)。
數據大小:能夠保存5MB甚至更多的數據。
1. cookie 與 sessionStorage 及 localStorage的區別;
共同點:都是在客戶端存儲數據,且是同源的。
區別:
SessionStorage與LocalStorage他們都擁有相同的方法;
1. setItem存儲value
用法:.setItem( key, value),代碼以下:
localStorage.setItem(key,value):將value存儲到key字段
用法:.getItem(key) 代碼以下:
localStorage.getItem(key):獲取指定key本地存儲的值
用法:.removeItem(key),代碼以下:
localStorage.removeItem(key):刪除指定key本地存儲的值
用法:.clear(),代碼以下:
localStorage.clear(); 清除全部的數據(firefox除外)
它將刪除全部同源的本地存儲的localStorage數據
而對於Session Storage,它只清空當前會話存儲的數據。
sessionStorage也有上面同樣的方法;
下面咱們來使用sessionStorage及 localStorage 來練習下,來作個demo。以下:
HTML代碼以下:
<h1>web Storage實列</h1> <p id="msg"></p> <input type="text" id="input" /> <input type="button" value="保存數據" id="saveData"/> <input type="button" value="讀取數據" id="readData"/> <input type="button" value="刪除數據" id="removeData"/> <input type="button" value="清除全部的數據" id="clearData"/>
頁面上一個input輸入框,當我點擊 保存數據 按鈕後 分別使用sessionStorage和localStorage 把值保存起來,當我點擊 讀取數據 按鈕後 讀取數據,分別在不一樣的瀏覽器或者新的同源窗口 或者關閉瀏覽器窗口 從新打開新窗口 來分別看看之間的區別,區別上面已經總結了,下面咱們來看看JS代碼以下:
<script> // sessionStorage demo $("#saveData").unbind('click').bind('click',function(){ var inputVal = $("#input").val(); sessionStorage.setItem("message",inputVal); //localStorage.setItem("message",inputVal); }); $("#readData").unbind("click").bind('click',function(){ var msg = sessionStorage.getItem("message"); //var msg = localStorage.getItem("message"); $("#msg").html(msg); }); $("#removeData").unbind('click').bind('click',function(){ sessionStorage.removeItem("message"); //localStorage.removeItem("message"); }); $("#clearData").unbind('click').bind('click',function(){ sessionStorage.clear(); //localStorage.clear(); }); </script>
如上的代碼,咱們如今繼續來看看效果以下:
咱們還能夠作一點複雜的應用,好比以下一個表格有一些字段,好比姓名,email,tel,及備註字段,咱們先保存到本地去,而後根據姓名這個字段進行搜索就能夠搜索到數據到,咱們能夠稱爲這是簡單的本地數據庫,以下代碼:
HTML:
<table> <tr> <td>姓名:</td> <td> <input type="text" id="name"/> </td> </tr> <tr> <td>EMALL:</td> <td> <input type="text" id="email"/> </td> </tr> <tr> <td>電話號碼:</td> <td> <input type="text" id="tel"/> </td> </tr> <tr> <td>備註:</td> <td> <input type="text" id="memo"/> </td> </tr> <tr> <td>保存</td> <td> <input type="button" id="save" value="保存"/> </td> </tr> </table> <p> 檢索:<input type="text" id="file"/> <input type="button" id="find" value="檢索"/> </p> <p id="msg"></p>
JS代碼以下:
// 保存數據 $("#save").unbind('click').bind('click',function(){ var data = new Object; data.name = $("#name").val(); data.email = $("#email").val(); data.tel = $("#tel").val(); data.memo = $("#memo").val(); var str = JSON.stringify(data); localStorage.setItem(data.name,str); alert("數據已經保存"); }); // 檢索數據 $("#find").unbind('click').bind('click',function(){ var find = $("#file").val(); var str = localStorage.getItem(find); var data = JSON.parse(str); var result = "姓名:" + data.name + "</br>"; result += "Email: " + data.email + "</br>"; result += "tel:" + data.tel + "</br>"; result += "備註:" + data.memo + "</br>"; $("#msg").html(result); });
demo以下效果:
五:window.name 實現跨域數據傳輸。
Window.name 中的name值在不一樣的頁面(甚至不一樣的域名)加載後依舊存在,而且數據量能夠達到2MB。
Window.name 數據傳輸的基本原理:
好比咱們在同域下abc.example.com下 有2個頁面 app.html 和 data.html
App.html頁面代碼嵌套一個iframe data.html頁面,代碼以下:
<iframe src="http://abc.example.com/demo/tugenhua0707/storage/data.html" id="iframe"></iframe>
其中data.html 頁面 使用一個window.name = 「111」;來保存數據。
如今咱們接下來在app.html頁面 如何來調用同域下的data.html下的window.name的數據,首先咱們先要獲取到這個iframe,而後判斷iframe是否加載完,加載完後就獲取這個iframe中的window.name,
App.html JS的代碼以下:
function iframeIsLoad(iframe,callback){ if(iframe.attachEvent) { iframe.attachEvent('onload',function(){ callback && callback(); }); }else { iframe.onload = function(){ callback && callback(); } } } var iframe = document.getElementById("iframe"); // 同域下 iframeIsLoad(iframe,function(){ var data = iframe.contentWindow.name; alert(data); });
2. 跨域下:
如今咱們使用hosts文件來綁定2個IP 來演示下跨域的狀況,在hosts文件綁定以下:
127.0.0.1 abc.example.com 和 127.0.0.1 def.example.com
咱們如今在 abc.example.com 新建一個app.html頁面 裏面仍是嵌套一個 def.example.com域下的 data.html頁面,代碼以下:
App.html代碼以下:
<iframe src="http://def.example.com/demo/tugenhua0707/storage/data.html" id="iframe"></iframe>
若是咱們仍是和上面的方式取數據的話 明顯報錯跨域了,如今咱們是使用window.name解決跨域下數據的傳輸,那麼咱們可使用一個同域abc.example.com下的代理頁面proxy.html來作處理,經過在def.example.com域下的data.html頁面加載一個與abc.example.com同域下的proxy.html頁面, 將該目標頁面設置iframe的name屬性,由於app.html 與 proxy.html是在同一個域下,因此咱們能夠獲取到。
在app.html頁面 JS代碼以下:
function iframeIsLoad(iframe,callback){ if(iframe.attachEvent) { iframe.attachEvent('onload',function(){ callback && callback(); }); }else { iframe.onload = function(){ callback && callback(); } } } var iframe = document.getElementById("iframe"); var state = 0; // 跨域下
iframeIsLoad(iframe,function(){ if (state === 1) { var data = iframe.contentWindow.name; // 讀取數據 alert(data); //彈出111 } else if (state === 0) { state = 1; iframe.contentWindow.location = "http://abc.example.com/demo/tugenhua0707/storage/proxy.html"; // 設置的代理文件 } });
固然如上:咱們若是name數據已經拿到了的話,之後不須要的話,咱們能夠銷燬掉,清空等操做。