2009
08 20

JavaScript存取Cookie範例,寫個CookieHelper吧

18:32:00   閱讀數 ( 1351 )   回應數 ( 0 )
網站程式常需要儲存些資料,當然Cache、Session等Server端物件固然好用,
但可以儲存小量資料、方便快速操作的Cookie也是不可或缺的好幫手。

Cookie簡介
我們知道一般Cookie是依附瀏覽器的,故若將該功能關掉,Cookie也就等同失效。

大概的介紹一下Cookie的幾個要點..
  • Cookie為可自行指定的鍵/值型態的組合(key/Value)
  • Cookie儲存在瀏覽器中,會隨著Http Header傳送(Http標頭)
  • Cookie中有Domain(網域)屬性,每個網域約能儲存20組Cookie.
  • Cookie中又有Path(路徑)屬性,可以限定每個Cookie的執行路徑
  • 現今我們常用的瀏覽器約能儲存共300組Cookie(各瀏覽器不盡相同)
  • 每組Cookie最多可以儲存4KB(4096 byte)的資料
現今一般使用UTF-8編碼居多,假設每個字元佔4byte(UTF-8不一定佔滿4byte)
那麼每組Cookie約可以放1024個元字,雖然聽起來容量不算太小,
不過Random不習慣放太多資料在Cookie中,畢竟Cookie原本就是以輕便、快速為主要目的。


JavaScript Cookie的寫法
有寫過伺服端語言的都知道,Cookie使用很簡單,(asp/php)
類似這樣的語法就可以存取Cookie的值..

ASP範例(by VBSCript):
'設定Cookie的值
Response.Cookies("userName") = "RazgrizLee"
Response.Cookies("userMail") = "Developer@RazgrizLee.net"

'取得Cookie值,以Response.Write顯示
Response.Write( "目前的會員名稱為:" & Request.Cookies("userName") )

可惜的是在JavaScript中比較麻煩一些,
JavaScript的Cookie存放在 document.cookie 中,但…它是字串類型,
沒錯,所以你要自已拆開Cookie去對應,才知道是哪一組Cookie。

指定Cookie的方式則是以固定格式指定到 document.cookie
格式為:值=鍵;expires=過期時間;path=路徑;domain=網域;


寫一個存取Cookie的輔助類別吧!
程式設計師如不懶,就寫不出好東西了,
為了讓我們寫程式能夠更懶一點,Raz寫了一個輔助類別來用


Random有一個比較不好的習慣,就是寫什麼都喜歡亂命名
例如為了讓操作直覺一點,Random用Asp.Net的HttpCookie來當這個JS的類別名.
// 首先定義HttpCookie類別
var HttpCookie = function( name, value, expires, path, domain )
{
	if( name ) this.Name = name;
	if( value ) this.Value = value;
	if( expires ) this.Expires = expires;
	if( path ) this.Path = path;
	if( domain ) this.Domain = domain;
};
// 這邊是HttpCookie的屬性及Function
HttpCookie.prototype = 
{
	Name:'', Value:'', Expires:'', Path:'/', Domain:'',
	toCookie: function()
	{
		var NewCookie = this.Name + '=' + this.Value;
		if( this.Expires )	NewCookie += (';expires=' + this.Expires);
		if( this.Path )		NewCookie += (';path=' + this.Path);
		if( this.Domain )	NewCookie += (';domain=' + this.Domain);
		return NewCookie;
	}
}


OK, 再來就是定義輔助類別, 直覺一點, 就叫CookieHelper吧,
這類的Class,Random較喜歡用Static Method..
所以首先就是...全域的一個空function
var CookieHelper = function(){};

再來是拿來轉換時間的Method..
因為Random習慣以小時為Cookie下定義, 所以這邊會把輸入的小時數轉換成毫秒。
// 將時間轉換成Millisecond, 再轉換為UTC String
CookieHelper.ConvertToUTCString = function( hourNumber )
{
	var Timestamp = ( !hourNumber || hourNumber == 0 ) ? (0) : (new Date().getTime() + (hourNumber * 1000 * 60 * 60));
	return new Date(Timestamp).toUTCString();
};

接下來就是主要的Method了..
// 設定Cookie ( 名稱, 值, 保存小時數, 路徑, 網域 )
CookieHelper.Set = function( cookieName, cookieValue, expireHour, path, domain )
{
	//新增一個HttpCookie, 指定鍵、值,
	var HC = 
	new HttpCookie
	(
		cookieName,
		escape(cookieValue), //(這邊用escape做值的編碼)
		CookieHelper.ConvertToUTCString(expireHour), //將小時數轉換為Milliseconds
		path,
		domain
	);	
	
	//利用我們自定HttpCookie的toCookie方法取得字串並設定給Cookie
	document.cookie = HC.toCookie();
};

// 取得Cookie ( 名稱 )
CookieHelper.Get = function( cookieName )
{
	// 因為document.cookie是一連串的字串(所有Cookie都在這邊)
	// 所以Raz用正則表達式來取得我們要的值
	var regex = new RegExp( ("(^| )" + cookieName + "=([^;]*)(;|$)") );
	var Matchs = document.cookie.match( regex );
	if( Matchs ) return unescape( Matchs[2] ); //最後unescape
	return null; //若沒有值則回傳null
};

// 刪除Cookie ( 名稱, 路徑, 網域 )
CookieHelper.Delete = function( cookieName, path, domain )
{
	// 測試若無法取得值就不動作
	if( !CookieHelper.Get(cookieName) ) return;
	
	// 新增一個HttpCookie, 不同的是值為空, 並且時間為0
	var HC =
	new HttpCookie
	(
		cookieName,
		null,
		CookieHelper.ConvertToUTCString(0)
	);
	
	document.cookie = HC.toCookie();
};


Random已經將說明寫在Code註解裡了,所以就不再多說明囉,
使用的方式則是..
//設定, 指定Cookie24小時後失效
CookieHelper.Set('UserName','RazgrizLee.Net程式道',24);

//取得UserName
CookieHelper.get('UserName');

//刪除UserName
CookieHelper.Delete('UserName');

如何,很直覺吧,寫程式就是要懶才行...呵呵,Enjoy!
2009-08-20 18:32:00 By RazgrizHsu       1351 Visits

關於站長 About

RazgrizHsu 的大頭照o.o RazgrizHsu
程式設計之偉大航道
其中的一個小設計師
致力於開發技術研究
願能與各位一同成長!

大家來噗浪 Plurk

免責聲明 Disclaimer

  • 本站所轉載或引用之資料,其版權和知識產權屬於原始所有者。
  • 本站雖力求資料準確,但無法保證或擔保全數資料均準確無誤,許多資料具有時效或環境上的不同,在使用本站資料前應先行初步判斷,若是發現問題,歡迎您通知本站。
  • 在任何情況下,因本站所造成的直接、間接、偶然或其他衍生問題,本站不承擔任何責任。
RandomART程式道-88x31連結用Logo
Copyright © Runart.net 暴走的藝術 since 2009 - 2011
Design By Razgriz Hsu, Asp.net MVC 3 & SqlServer 2008R2.