ipotesi
Sulla base della domanda, credo che alcuni presupposti / requisiti per questa funzione includano:
- Verrà utilizzato come una funzione di libreria e quindi destinato a essere rilasciato in qualsiasi base di codice;
- Come tale, dovrà funzionare in molti ambienti diversi , ovvero lavorare con codice JS legacy, CMS di vari livelli di qualità, ecc .;
- Per interagire con il codice scritto da altre persone e / o codice che non si controlla, la funzione non dovrebbe fare ipotesi su come vengono codificati i nomi o i valori dei cookie . Chiamare la funzione con una stringa
"foo:bar[0]"
dovrebbe restituire un cookie (letteralmente) chiamato "foo: bar [0]";
- Nuovi cookie possono essere scritti e / o cookie esistenti modificati in qualsiasi momento durante la vita della pagina.
Sotto questi presupposti, è chiaro che encodeURIComponent
/ decodeURIComponent
non dovrebbe essere usato ; in tal modo si presuppone che il codice che ha impostato il cookie lo abbia anche codificato utilizzando queste funzioni.
L'approccio all'espressione regolare diventa problematico se il nome del cookie può contenere caratteri speciali. jQuery.cookie risolve questo problema codificando il nome del cookie (in realtà sia nome che valore) durante la memorizzazione di un cookie e decodificando il nome durante il recupero di un cookie. Una soluzione di espressione regolare è di seguito.
A meno che tu non stia leggendo solo i cookie che controlli completamente, sarebbe anche consigliabile leggere i cookie document.cookie
direttamente e non memorizzare nella cache i risultati, poiché non è possibile sapere se la cache non è valida senza rileggerla document.cookie
.
(Mentre l'accesso e l'analisi document.cookies
saranno leggermente più lenti rispetto all'utilizzo di una cache, non sarebbe così lento come la lettura di altre parti del DOM, poiché i cookie non svolgono un ruolo negli alberi DOM / render.)
Funzione basata su loop
Ecco la risposta di Code Golf, basata sulla funzione (basata su loop) di 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, '');
}
che una volta minimizzato, arriva a 128 caratteri (senza contare il nome della funzione):
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,'');}
Funzione basata su espressioni regolari
Aggiornamento: se vuoi davvero una soluzione di espressione regolare:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
Ciò sfugge a tutti i caratteri speciali nel nome del cookie prima di costruire l'oggetto RegExp. Minimizzato, arriva a 134 caratteri (senza contare il nome della funzione):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
Come Rudu e i lupi hanno sottolineato nei commenti, la regex che sfugge all'espressione regolare può essere abbreviata da alcuni caratteri. Penso che sarebbe bene mantenere coerente la regex in fuga (potresti usarla altrove), ma vale la pena prendere in considerazione i loro suggerimenti.
Appunti
Entrambe queste funzioni non verranno gestite null
o undefined
, ovvero se è presente un cookie denominato "null", readCookie(null)
restituirà il suo valore. Se è necessario gestire questo caso, adattare il codice di conseguenza.