如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點這里
1、cookie的作用:
我們在瀏覽器中,經(jīng)常涉及到數(shù)據(jù)的交換,比如你登錄郵箱,登錄一個頁面。我們經(jīng)常會在此時設(shè)置30天內(nèi)記住我,或者自動登錄選項。那么它們是怎么記錄信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服務(wù)器設(shè)置的,保存在瀏覽器中,但HTTP協(xié)議是一種無狀態(tài)協(xié)議,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接。就像我們?nèi)コ匈I東西,沒有積分卡的情況下,我們買完東西之后,超市沒有我們的任何消費信息,但我們辦了積分卡之后,超市就有了我們的消費信息。cookie就像是積分卡,可以保存積分,商品就是我們的信息,超市的系統(tǒng)就像服務(wù)器后臺,http協(xié)議就是交易的過程。
2、機制的區(qū)別:
session機制采用的是在服務(wù)器端保持狀態(tài)的方案,而cookie機制則是在客戶端保持狀態(tài)的方案,cookie又叫會話跟蹤機制。打開一次瀏覽器到關(guān)閉瀏覽器算是一次會話。說到這里,講下HTTP協(xié)議,前面提到,HTTP協(xié)議是一種無狀態(tài)協(xié)議,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接。此時,服務(wù)器無法從鏈接上跟蹤會話。cookie可以跟蹤會話,彌補HTTP無狀態(tài)協(xié)議的不足。
3、cookie的分類:
cookie分為會話cookie和持久cookie,會話cookie是指在不設(shè)定它的生命周期expires時的狀態(tài),前面說了,瀏覽器的開啟到關(guān)閉就是一次會話,當(dāng)關(guān)閉瀏覽器時,會話cookie就會跟隨瀏覽器而銷毀。當(dāng)關(guān)閉一個頁面時,不影響會話cookie的銷毀。會話cookie就像我們沒有辦理積分卡時,單一的買賣過程,離開之后,信息則銷毀。
持久cookie則是設(shè)定了它的生命周期expires,此時,cookie像商品一樣,有個保質(zhì)期,關(guān)閉瀏覽器之后,它不會銷毀,直到設(shè)定的過期時間。對于持久cookie,可以在同一個瀏覽器中傳遞數(shù)據(jù),比如,你在打開一個淘寶頁面登陸后,你在點開一個商品頁面,依然是登錄狀態(tài),即便你關(guān)閉了瀏覽器,再次開啟瀏覽器,依然會是登錄狀態(tài)。這就是因為cookie自動將數(shù)據(jù)傳送到服務(wù)器端,在反饋回來的結(jié)果。持久cookie就像是我們辦理了一張積分卡,即便離開,信息一直保留,直到時間到期,信息銷毀。
4、簡單的使用cookie的代碼
cookie的幾種常見屬性:document.cookie="key=value;expires=失效時間;path=路徑;domain=域名;secure;(secure表安全級別),
cookie以字符串的形式保存在瀏覽器中。下面貼段代碼出來,是一個類似購物網(wǎng)站的將商品添加到購物車,再從購物車還原商品信息的過程,是自己用原生JS封裝的函數(shù)。
封裝的cookie的存入,讀取以及刪除的函數(shù):(這里是將信息以對象的形式存放到cookie中的,會用到JSON的知識)
-
-
-
-
-
-
-
-
-
-
function cookie(key, value, options) {
-
-
-
if (typeof value === "undefined") {
-
-
var cookies = document.cookie.split("; ");
-
-
for (var i = 0, len = cookies.length; i < len; i++) {
-
-
-
-
var cookie = cookies[i].split("=");
-
-
if (decodeURIComponent(cookie[0]) === key) {
-
return decodeURIComponent(cookie[1]);
-
}
-
}
-
-
return null;
-
}
-
-
-
-
options = options || {};
-
-
var cookie = encodeURIComponent(key) + "=" + encodeURIComponent(value);
-
-
if ((typeof options.expires) !== "undefined") {
-
if (typeof options.expires === "number") {
-
var days = options.expires,
-
t = options.expires = new Date();
-
t.setDate(t.getDate() + days);
-
}
-
cookie += ";expires=" + options.expires.toUTCString();
-
}
-
-
if (typeof options.path !== "undefined")
-
cookie += ";path=" + options.path;
-
-
if (typeof options.domain !== "undefined")
-
cookie += ";domain=" + options.domain;
-
-
if (options.secure)
-
cookie += ";secure";
-
-
-
document.cookie = cookie;
-
}
-
-
-
function removeCookie(key, options) {
-
options = options || {};
-
options.expires = -1;
-
cookie(key, "", options);
-
}
下面是商品詳情頁的JS代碼
-
-
var links = $("a", $("#tab"));
-
-
for (var i = 0, len = links.length; i < len; i++) {
-
links[i].onclick = function(){
-
-
var _cells = this.parentNode.parentNode.cells;
-
-
var _id = _cells[0].innerHTML,
-
_name = _cells[1].innerHTML,
-
_price = _cells[2].innerHTML;
-
-
var product = {
-
id : _id,
-
name : _name,
-
price : _price,
-
amount : 1
-
};
-
-
-
-
var _products = cookie("products");
-
if (_products === null)
-
_products = [];
-
else
-
_products = JSON.parse(_products);
-
-
-
_products.push(product);
-
-
cookie("products", JSON.stringify(_products), {expires:7});
-
}
-
}
html代碼,css代碼大家可以自己寫
-
<table id="tab">
-
<tr>
-
<td>序號</td>
-
<td>名稱</td>
-
<td>價格</td>
-
<td>操作</td>
-
</tr>
-
<tr>
-
<td>1</td>
-
<td>空調(diào)</td>
-
<td>3999</td>
-
<td><a href="javascript:void(0);">添加到購物車</a></td>
-
</tr>
-
<tr>
-
<td>2</td>
-
<td>風(fēng)扇</td>
-
<td>288</td>
-
<td><a href="javascript:void(0);">添加到購物車</a></td>
-
</tr>
-
</table>
-
<a href="cart_購物車.html" target="_blank">查看購物車</a>
購物車還原商品信息:
-
-
var _products = cookie("products");
-
-
if (_products === null || (_products = JSON.parse(_products)).length === 0)
-
return;
-
-
-
$(".result")[0].innerHTML = "";
-
for (var i = 0, len = _products.length; i < len; i++) {
-
-
var prod = _products[i];
-
-
var _row = $(".row")[0].cloneNode(true);
-
-
$(".index", _row)[0].innerHTML = prod.id;
-
$(".name", _row)[0].innerHTML = prod.name;
-
$(".price", _row)[0].innerHTML = prod.price;
-
$(".amount", _row)[0].innerHTML = prod.amount;
-
$(".oper", _row)[0].innerHTML = "<a href='javascript:void(0);'>刪除</a>"
-
-
-
$(".result")[0].appendChild(_row);
-
};
-
-
-
var links = $("a", $("#container"));
-
for (var i = 0, len = links.length; i < len; i++) {
-
-
links[i].product = _products[i];
-
links[i].onclick = function(){
-
-
var index = inArray(this.product, _products);
-
-
if (index !== -1) {
-
_products.splice(index, 1);
-
}
-
-
cookie("products", JSON.stringify(_products), {expires:7});
-
-
-
var _row = this.parentNode.parentNode;
-
_row.parentNode.removeChild(_row);
-
};
-
}
這里的$(' ')函數(shù)是自己封裝的函數(shù),用于獲取到DOM節(jié)點,可以看下我關(guān)于getElementsByClassName的兼容那篇文章。
藍藍設(shè)計( www.teruid.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 、平面設(shè)計服務(wù)