Hypothèses
Basé sur la question, je pense que certaines hypothèses / exigences requises pour cette fonction sont:
- Il sera utilisé comme une fonction de la bibliothèque, et donc destinés à être déposés dans toute la base de code;
- En tant que tel, il sera nécessaire de travailler dans de nombreux environnements différents, c'est à dire travailler avec l'héritage du code JS, des Sgc de différents niveaux de qualité, etc.;
- À inter-opérer avec le code écrit par d'autres personnes et/ou le code que vous n'avez pas le contrôle, la fonction ne devrait pas faire d'hypothèses sur la façon dont les noms de biscuit ou les valeurs sont codées. L'appel de la fonction avec une chaîne de caractères
"foo:bar[0]"
doit retourner un cookie (littéralement) nommé "foo:bar[0]";
-
De nouveaux cookies peuvent être écrites et/ou les cookies existants modifiés à tout moment pendant la durée de vie de la page.
Sous ces hypothèses, il est clair qu' encodeURIComponent
/ decodeURIComponent
ne doit pas être utilisé; cela suppose que le code que définir le cookie également codée à l'aide de ces fonctions.
L'expression régulière approche devient problématique si le nom du cookie peut contenir des caractères spéciaux. jQuery.cookie contourne ce problème en codant le nom de cookie (en fait à la fois le nom et la valeur) lorsque le stockage d'un cookie, et le décodage du nom lors de la récupération d'un cookie. Une expression régulière solution est ci-dessous.
Sauf si vous êtes seulement de lire les cookies que vous avez complètement le contrôle, il serait également souhaitable de lire les témoins de document.cookie
directement et de ne pas mettre en cache les résultats, car il n'y a aucun moyen de savoir si le cache n'est pas valide sans la lecture d' document.cookie
de nouveau.
(Alors que l'accès et l'analyse document.cookies
sera légèrement plus lent que d'utiliser un cache, il ne serait pas aussi lente que la lecture d'autres parties du DOM, car les cookies ne jouent pas un rôle dans les DOM / rendu des arbres.)
Boucle de fonction
Voici le Code de Golf de réponse, basée sur PPK (boucle) fonction:
function readCookie(name) {
name += '=';
for (var ca = document.cookie.split(/;\s*/), i = ca.length - 1; i >= 0; i--)
if (!ca[i].indexOf(name))
return ca[i].replace(name, '');
}
qui quand minifiés, vient à 128 caractères (sans compter le nom de la fonction):
function readCookie(n){n+='=';for(var a=document.cookie.split(/;\s*/),i=a.length-1;i>=0;i--)if(!a[i].indexOf(n))return a[i].replace(n,'');}
Expression régulière fonction
Mise à jour: Si vous voulez vraiment une expression régulière solution:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
Cela échappe les caractères spéciaux dans le nom du cookie avant la construction de l'objet RegExp. Minifiés, cela revient à 134 caractères (sans compter le nom de la fonction):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
Comme Rudu et cwolves l'avons souligné dans les commentaires, l'expression régulière d'échappement des regex peut être raccourcie de quelques caractères. Je pense qu'il serait bon de garder la trajectoire de la regex cohérente (vous pouvez l'utiliser ailleurs), mais leurs suggestions sont à envisager.
Notes
Ces deux fonctions, de ne pas manipuler null
ou undefined
, c'est à dire si il y a un cookie nommé "null", readCookie(null)
sera de retour à sa valeur. Si vous avez besoin pour gérer ce cas, d'adapter le code en conséquence.