Les cookies et javascript

Description

Comme la propriété cookie de l'objet document de l'objet window (window.document.cookie) est assez complexe a mettre en place et à exploiter, je vous propose cet objet. (compatible IE, FF, Opera, Google chrome)

Source / Exemple :


function Cookie(sName, sFormat, sValue)
{
	var argc = Cookie.arguments.length;
	
	/*attributes*/
	if(sFormat != "GET" && sFormat != "get")
	{
		this.name = sName;
		this.format = sFormat;
		this.value = (argc > 2) ? (sValue) : ("");
		date_exp = new Date();
		date_exp.setTime(date_exp.getTime()+((argc > 2) ? (iExpiration) : (365*24*3600)));
		this.expiration = date_exp;
		if(this.format == "JSON"){this.value = this.name+'={anonymousAttribute:""};';}
		if(argc > 1){this.saveCookie();}
	}
	if(sFormat == "GET" || sFormat == "get")
	{
		this.name = sName;
		this.value = this.getCookie(sName);
		date_exp = new Date();
		date_exp.setTime(date_exp.getTime()+((argc > 2) ? (iExpiration) : (365*24*3600)));
		this.expiration = date_exp;
		this.format = (/=\{.+\};/i.test(this.value)==true) ? "JSON" : "STR";

	}
}

/* Methodes */
Cookie.prototype.getCookieVal = function(offset) 
{
	var endstr=document.cookie.indexOf (";", offset);
	if (endstr==-1)
	endstr=document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
};
Cookie.prototype.getCookie = function (name)
{
	var arg=name+"=";
	var alen=arg.length;
	var clen=document.cookie.length;
	var i=0;
	while (i<clen) 
	{
		var j=i+alen;
		if (document.cookie.substring(i, j)==arg)
		{
			return Cookie.prototype.getCookieVal (j);
		}
		i=document.cookie.indexOf(" ",i)+1;
		if (i==0){break;}
	}
		return null;
};
Cookie.prototype.saveCookie = function ()
{
	var expires= this.expiration;
	document.cookie=this.name+"="+escape(this.value)+((expires==null) ? "" : ("; expires="+expires.toGMTString()))+""+""+"";
	if(this.format == "JSON")
	{
		eval("this.attributes="+(this.value.substring(this.value.lastIndexOf("{"),this.value.lastIndexOf(";")))+";");
	}
};
Cookie.prototype.setValue = function (newValue, bContinue)
{
	if(this.format == "STR")
	{
		this.value = (bContinue == false) ? newValue : this.value+newValue;
		Cookie.prototype.saveCookie();
		return true;
	}
	else
	{
		this.value = newValue;
		Cookie.prototype.saveCookie();
		return true;
	}
};
Cookie.prototype.setExpire = function (iExpire, sUnity)
{
	var eArgv = this.setExpire.arguments;
	var eArgc = this.setExpire.arguments.length;
	if(eArgc >= 1 && sUnity != "until"){FoU = "for";}
	if(eArgc > 1 && sUnity == "until"){FoU = "until";}
	if(FoU == "for")
	{
		if(sUnity == "secondes" || sUnity == "s" || sUnity == undefined || sUnity == "sec")
		{
			date_exp.setTime(date_exp.getTime()+(iExpire));
			this.expiration = date_exp;
		}
		if(sUnity == "heures" || sUnity == "h" || sUnity == "hours")
		{
			date_exp.setTime(date_exp.getTime()+(iExpire*3600));
			this.expiration = date_exp;
		}			
		if(sUnity == "jours" || sUnity == "j" || sUnity == "d" || sUnity == "days")
		{
			date_exp.setTime(date_exp.getTime()+(iExpire*3600*24));
			this.expiration = date_exp;
		}	
		if(sUnity == "semaines" || sUnity == "sem" || sUnity == "weeks" || sUnity == "w")
		{
			date_exp.setTime(date_exp.getTime()+(iExpire*3600*24*7));
			this.expiration = date_exp;
		}	
		if(sUnity == "mois" || sUnity == "m" || sUnity == "month")
		{
			date_exp.setTime(date_exp.getTime()+(iExpire*3600*24*30));
			this.expiration = date_exp;
		}	
		if(sUnity == "annees" || sUnity == "a" || sUnity == "years" || sUnity == "y" || sUnity == "années")
		{
			date_exp.setTime(date_exp.getTime()+(iExpire*3600*24*365));
			this.expiration = date_exp;
		}	
	}
	if(FoU == "until")
	{
		jour = iExpire.split(/\//)[0];
		mois = iExpire.split(/\//)[1];
		annee = iExpire.split(/\//)[2];
		timeStamp = ((parseInt(annee)-1970)*365*24*3600)+(parseInt(mois)*31*24*3600)+(parseInt(jour)*24*3600);
		date_exp.setTime(timeStamp);
		this.expiration = date_exp;
	}
	Cookie.prototype.saveCookie();
};
Cookie.prototype.cookieEnabled = function()
{
	return navigator.cookieEnabled;
};
Cookie.prototype.removeCookie = function(name) 
{
	var exp = new Date();
	exp.setTime(exp.getTime() - 100000);
	var cValue  = Cookie.prototype.getCookie(name);
	document.cookie = name+"="+cValue+"; expires="+exp.toGMTString();
};
Cookie.prototype.addAttribute = function(sAttribute, sValue)
{
	if(this.format == "JSON")
	{
		this.value = this.value.substring(0, this.value.lastIndexOf("};"));
		this.value += ","+sAttribute+':"'+sValue+'"';
		this.value += "};";
		Cookie.prototype.saveCookie();
		return true;
	}
	else
	{
		return false;
	}
};
Cookie.prototype.resetCookie = function()
{
	if(this.format == "STR")
	{
		this.value = "";
	}
	if(this.format == "JSON")
	{
		this.name+'={anonymousAttribute:""};';
	}
	Cookie.prototype.saveCookie();
	return true;
};
Cookie.prototype.deleteAttribute = function(sAttributeName)
{
	if(this.format == "JSON")
	{
		eval(this.value)
		eval('sAttribute = '+this.name+'[sAttributeName];');
		var reg = new RegExp(','+sAttributeName+':"'+sAttribute+'"');
		this.value = this.value.replace(reg, "");
		Cookie.prototype.saveCookie();
		return true;
	}
	else
	{
		return false;
	}
};
Cookie.prototype.editAttribute = function(sAttributeName, sNewValue)
{
	if(this.format == "JSON")
	{
		Cookie.prototype.deleteAttribute(sAttributeName);
		Cookie.prototype.addAttribute(sAttributeName, sNewValue);
		return true;
	}
	else
	{
		return false;
	}
};
Cookie.prototype.setFormat = function(sFormat)
{
	if(sFormat == "STR" || Sformat == "JSON")
	{
		this.format = sFormat;
		return true;
	}
	else
	{
		return false;
	}
};

/* Exemple d'utilisation */
cookie1 = new Cookie("cook1", "STR", "okay");
alert(cookie1.value);

cookie2 = new Cookie("cook2", "JSON")
cookie2.addAttribute("cookie1", cookie2.getAttribute("cook1"));
alert(cookie2.attributes.cookie1);

Conclusion :


Méthodes et attributs de la class pour l'utilisateur:

Méthodes:
- setValue([string] sValue, [boleen] bContinue):
Modifie la valeur du cookie,
l'argument bContinue indique s'il on écrit à la suite du cookie ou si on efface tout pour réécrire par dessu

- saveCookie():
Sauvegarde votre cookie, cette méthode est appelée à chaque fois que une modification est apportée

- setExpire([string] sExpire, [string] sUnity):
Modifie le délai du cookie,
la chaine de caractères sExpire est la valeur et sUnity est l'unitée utilisée (secondes, jour, mois)

- getCookie(name):
retourne la valeur du cookie voulu

- removeCookie(name):
efface un cookie.

- resetCookie():
reinitialise le cookie sans qu'il perde son format, utile au format JSON sinon il suffit de réinitialiser la value.

- addAttribute(sAttribute, sValue):
(dans un cookie au format JSON), ajoute un attribut au cookie

- deleteAttribute(sAttributeName):
suprime l'attribut dont le nom est passé en argument

- editAttribute(sAttributeName, sNewValue)
modifie la valeur de l'attribut dont le nom est passé en argument

- setFormat(sFormat):
configure le format.
retourne false si le format passé en argument est erroné


Attributs:

name: nom du cookie
value: valeur du cookie
format: format du cookie /!\ changer avec précotion
attributes: Sous objet contenant les attributs du cookie (ex: attributes.anonumousAttribute) /!\ immodifiable, juste pour info

/!\ Attention si vous modifiez ces valeur sans passer par des accesseur (methodes) utiliser la methode saveCookie() pour sauvegarder.

/!\ NE vous préocuper des autres méthodes, sauf si vous voulez améliorer ce code.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.