Les cookies et javascript

Soyez le premier à donner votre avis sur cette source.

Vue 7 642 fois - Téléchargée 515 fois

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

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
24 mai 2010

Tiens, bizarre, j'ai fait un petit bout de code et ça ne marche pas bien ...

Quand je ne fais pas de delete, ça me retourne undefined et quand je fais le delete, alors là il me donne bien le résultat :(

parameters = new Cookie("parameters", "JSON");
parameters.addAttribute("cook1", "test");
parameters.deleteAttribute("cook1");

alert("Valeur obtenue : " + parameters["cook1"]);

Une idée de l'origine de mon problème ? (ai-je 2 mains gauches ?)

Merci ^^
Messages postés
466
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
17 octobre 2011

De nada, ça fait plaisir !
Messages postés
2
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
24 mai 2010

Bonjour,

J'aime beaucoup, c'est bien plus complet que tout ce que l'on peut trouver sur le sujet ^^

Merci pour ce bon code bien utile
Messages postés
466
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
17 octobre 2011

C bn j'ai changer le code, mais j'ai laissé les attributs dans les closures.

Ps: le prototype est interpréter en premier:

function ClassA()
{
this.attr1 = this.attr2;
}
ClassA.prototype.attr2 = "okay";

function ClassB()
{
this.attr1 = "okay";
}
ClassB.prototype.attr2 = this.attr1;

var objA = new ClassA();
var objB = new ClassB();
alert(objA.attr1); //alerte "okay"
alert(objB.attr2); //alert undefined
Messages postés
466
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
17 octobre 2011

Enfait la la flem de tout changer, tout les this en Cookie, mais je le ferais plus tard, pour l'instant ce code a quand même le mérite d'être opérationnel.Merci Kimjoa pour m'avoir aider à l'améliorer.

Ps: j'ai créer un tit jeu de calcul mental multijoueur en Jscript sous MsgPlus, quelqu'un sait-il s'il est possible de activer/désactiver la Calculatrice Windows avec la base de registres, quel est la clef, Merci.
Afficher les 13 commentaires

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.