J'avais espéré trouver une propriété qui me dit éventuellement si le navigateur accepte les cookies, genre "navigator.enabledPlugin" ou autre "navigator.properties", mais bon, pour le moment je n'ai rien trouvé, alors il va falloir s'en passer et travailler comme un cochon.
Ensuite pour essayer de lire le cookie il faut utiliser l'objet.propriété "document.cookie" qui malheureusement pointe sur une liste de cookies et pas sur un simple élément, il va encore falloir parcourir cette liste à la recherche du bon.
Pour ça on va créer une routine du genre:
function donnecookie(nom)
{
var recherche=nom+'='; // pour recherche nom dans la liste
if (document.cookie.length>0) // si il existe des cookies
{
position=document.cookie.indexOf(recherche); // donne la position du nom
if (position!=-1) // si une position existe
{
position=position+recherche.length; // on passe après nom=
fin=document.cookie.indexOf(';',position); // on cherche la fin (";")
if (fin==-1) // si le ";" n'existe pas
{
fin=document.cookie.length; // alors le cookie va jusqu'au bout
}
return unescape(document.cookie.substring(position,fin));// donne texte
}
else {return '';} // retourne du 'vide'
}
else {return '';} // retourne du 'vide'
}
Cette routine fournit juste le texte du cookie de nom donné (et pas sa date d'expiration) ou rien du tout si il n'est pas trouvé. Notez l'utilisation de la fonction unescape() qui vous permet entre autre d'utiliser le point virgule, les espaces et tous les autres caractères spéciaux dans vos cookies sans vous casser la tête (pour une fois).
Notez aussi que le test de position se fait avec -1, vu que la position 0 est parfaitement valide et correspond à la première position dans la chaîne de caractères, car comme pour les tableaux, la numérotation de position part de zéro.
Attention ! La routine donnecookie() n'est pas assez intelligente telle-quelle pour faire la différence entre "texte=" et "contexte=" si vous cherchez le mot "texte" le premier cookie entré contenant cette fin de chaîne de caractères sera fournit en retour, prenez donc garde au nom de vos cookies ou perfectionnez vous-même cette routine.
Bon, on à lu le cookie, ou on ne l'a pas lu et il va falloir l'écrire (éventuellement après avoir demandé quelques infos au visiteur dans un bête formulaire, avec ou sans validation, c'est vos oignons), pour faire ça, je me suis encore retroussé les manches et il ne vous reste plus qu'à utiliser cette autre belle fonction, fournie gratuitement par votre serviteur:
function ecritcookie(nom,texte,jours) // les beaux paramètres
{
var datecourante=new Date(); // lit la date
var expires=new Date();
expires.setTime(datecourante.getTime()+1000*60*60*24*jours);
document.cookie=nom+'='+escape(texte)+'; expires='+expires.toGMTString();
}
Plusieurs remarques me semblent indispensables avant les explications que vous êtes en droit d'attendre pour cette routine.
- On peut facilement mettre le foutoir dans le fichier cookie en ajoutant ou pas un ou plusieurs ";" sans encoder.
- Personne n'est là pour vous obliger à respecter le format ci-dessus, mais heureusement, si l'on veut que le navigateur enregistre le cookie, il faut une date d'expiration correcte et bien délimitée selon les règles ci-dessus.
- Si vous vous plantez en écrivant un cookie et en faisant vos tests, vous pouvez le réécrire avec une date dépassée, arrêter et relancer le navigateur, voire dans les cas extrêmes effacer le fichier cookie.txt.
- Si le nom de votre cookie est "toto", pas de problème, il n'y aura pas de conflit avec un toto à une autre adresse, ou même dans une autre page, ce sont les cookies du document que vous lisez et écrivez, pas ceux de l'ensemble des pages visitées par le navigateur, l'avantage c'est que vous n'êtes pas limité à un cookie par page, mais toutes les autres limitations restent valables, et l'inconvénient grâve, c'est que vous ne pourrez pas vous servir des cookies pour passer des valeurs d'une page à l'autre (c'est pas moi qui fait les règles, désolé).
- Ce qui est réellement rajouté au fichier cookie c'est "toto=ce_que_vous_avez_mis_dans_le_texte", les informations de provenance et de date sont encodées et illisibles.
Et maintenant la routine:
- On lit la date courante que l'on met dans datecourante (original non ?).
- On crée une autre variable qui contiendra la date d'expiration.
- On change ensuite la valeur de la date d'expiration (expire.setTime()) en lui ajoutant la valeur de la date courante (datecourante.getTime()) plus un nombre de jours de validité, le format de la date étant en millisecondes (millièmes de seconde), on le multiplie par 1000 pour avoir des secondes, puis par 60 pour avoir des minutes, puis par 60 pour avoir des heures, puis par 24 pour avoir des jours, puis par 365 pour avoir des années, heu non, les jours ça suffit (vous pouvez directement utiliser *86400000 maintenant que vous avez compris), et enfin par le nombre de jours de validité désirés. Si vous ne souhaitez pas que votre cookie soit enregistré, donnez-lui une date de validité expirée avec "-1" jours en paramètre.
- Et on écrit le cookie au format correct et en le "codant" avec escape() pour éviter les ennuis.
Pour utiliser les deux routines:
var taille='';
taille=donnecookie('tailledelafenetrepage1');
if (taille=='') {ecritcookie('tailledelafenetrepage1','640x480',365);}
Attention au nom du cookie qui n'est pas codé et qui ne peut pas contenir de point virgule, d'espace ni d'autres symboles bizzaroïdes, le "texte" lui, peut bien sur contenir des tas de chose (puisqu'il est codé dans ce cas précis), comme des listes séparées par des virgules ou des réglages comme "bgcolor='#000000',color='#FFFFFF',sound='coincoin.mid', etc...", faites en bon usage.
Si vous avez besoin des 4000 caractères disponibles et que vous ne mettez que des chiffres et des lettres sans espace, n'encodez (et ne décodez) pas le cookie, en effet cette fonction utilise 3 caractères pour le prix d'un.
Voilà, vous savez tout sur les cookies...
|