Annahmen
Aufgrund der Frage glaube ich, dass einige Annahmen / Anforderungen für diese Funktion Folgendes umfassen:
- Es wird als Bibliotheksfunktion verwendet und soll daher in eine beliebige Codebasis verschoben werden.
- Als solches muss es in vielen verschiedenen Umgebungen funktionieren, dh mit Legacy-JS-Code, CMS verschiedener Qualitätsstufen usw.;
- Um mit Code zu interagieren, der von anderen Personen geschrieben wurde, und / oder mit Code, den Sie nicht kontrollieren, sollte die Funktion keine Annahmen darüber treffen, wie Cookie-Namen oder -Werte codiert werden . Das Aufrufen der Funktion mit einer Zeichenfolge
"foo:bar[0]"
sollte ein Cookie (wörtlich) mit dem Namen "foo: bar [0]" zurückgeben.
- Neue Cookies können zu jedem Zeitpunkt während der Lebensdauer der Seite geschrieben und / oder vorhandene Cookies geändert werden .
Unter diesen Annahmen ist klar, dass encodeURIComponent
/ decodeURIComponent
nicht verwendet werden sollte ; Dabei wird davon ausgegangen, dass der Code, der das Cookie gesetzt hat, es auch mit diesen Funktionen codiert hat.
Der Ansatz mit regulären Ausdrücken wird problematisch, wenn der Cookie-Name Sonderzeichen enthalten kann. jQuery.cookie umgeht dieses Problem, indem es beim Speichern eines Cookies den Cookie-Namen (eigentlich Name und Wert) codiert und beim Abrufen eines Cookies den Namen decodiert.Eine Lösung für reguläre Ausdrücke finden Sie weiter unten.
Wenn Sie nicht nur Cookies lesen, die Sie vollständig kontrollieren, ist es auch ratsam, Cookies document.cookie
direkt zu lesen und die Ergebnisse nicht zwischenzuspeichern, da es keine Möglichkeit gibt, festzustellen, ob der Cache ohne Lesen ungültig istdocument.cookie
erneut .
(Während der Zugriff und das Parsen document.cookies
etwas langsamer sind als die Verwendung eines Caches, ist er nicht so langsam wie das Lesen anderer Teile des DOM, da Cookies in den DOM- / Render-Bäumen keine Rolle spielen.)
Schleifenbasierte Funktion
Hier ist die Antwort von Code Golf, basierend auf der (schleifenbasierten) Funktion von PPK:
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, '');
}
was bei Minimierung 128 Zeichen ergibt (ohne den Funktionsnamen):
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,'');}
Funktion auf der Basis regulärer Ausdrücke
Update: Wenn Sie wirklich eine Lösung für reguläre Ausdrücke wünschen:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
Dieses entgeht keine Sonderzeichen in den Cookie - Namen , bevor Sie das RegExp - Objekt zu konstruieren. Minimiert sind dies 134 Zeichen (ohne den Funktionsnamen):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
Wie Rudu und cwolves in den Kommentaren hervorgehoben haben, kann der reguläre Ausdruck, der dem regulären Ausdruck entgeht, um einige Zeichen verkürzt werden. Ich denke, es wäre gut, den entweichenden regulären Ausdruck konsistent zu halten (Sie können ihn an anderer Stelle verwenden), aber ihre Vorschläge sind eine Überlegung wert.
Anmerkungen
Diese beiden Funktionen werden nicht verarbeitet null
oder geben den Wert zurück undefined
, wenn ein Cookie mit dem Namen "null" vorhanden ist readCookie(null)
. Wenn Sie diesen Fall behandeln müssen, passen Sie den Code entsprechend an.