con un po' di elasticità per la formattazione errata del forum, utilizza questo codice.
grazie a Jarno
FILE: cookies.js
/*
CookieLeggi
OUTPUT: restituisce il valore, se il cookie non c'è restituisce "null"; se ne sono presenti più di 1 mostra il primo, ovvero quello più specifico; es: var AAA = CookieLeggi(nome) || "anonimo";
INPUT: ('Nome del Cookie')
CookieScrivi
OUTPUT: restituisce TRUE o FALSE a seconda che sia avvenuta o no correttamente la scrittura; la scrittura ha un ordine: dal più specifico al più generico "/"; es: if (!CookieScrivi(document.cok.ckNome.value,document.cok.ckDato.value,document.cok.exSimb.value,document.cok.exDato.value,document.cok.ckPat.value,document.cok.ckDom.value,document.cok.ckSec.value)) alert('Scrittura non riuscita');
INPUT: ('Nome del Cookie', 'Valore', 'UdM: anni/mesi/giorni/ore/minuti/secondi/GMT', 'tempo', 'path: "\" per tutto "" per attuale e figli', 'Domain', 'Secure: per criptare basta "1" o "secure" mentre vuoto o altro per lasciare così')
CookieCancella
OUTPUT: restituisce TRUE o FALSE a seconda che sia avvenuta o no correttamente la cancellazione; restituire FALSE quando rimane cmq un cookie con quel nome e ciò può essere perchè le proprietà non coincidono o perchè ce ne erano più di uno con lo stesso nome; es: if (!CookieCancella(document.cok.ckNome.value)) alert('Cancellazione non riuscita')
INPUT: ('Nome del Cookie', 'Path: "\" per tutto "" per attuale e figli', 'Domain')
*/
function CookieLeggi(CookieNome)
{
if (CookieNome.length==0) return null;
var PosizioneIniziale = document.cookie.indexOf(CookieNome+"=");
if (PosizioneIniziale == -1) return null;
PosizioneIniziale += CookieNome.length+1; // restituisce la posizione del primo carattere del valore della variabile-cookie
var PosizioneFinale = document.cookie.indexOf(";",PosizioneIniziale);
if (PosizioneFinale == -1) PosizioneFinale = document.cookie.length; // serve perchè se il cookie è l'ultimo non avrà ";"
return unescape(document.cookie.substring(PosizioneIniziale,PosizioneFinale));
}
function CookieScrivi(name,value,expiresUdM,expires,path,domain,secure)
{
if (!name || !value) { return false } // se uno dei 2 valori è vuoto evita la scrittura, perchè, mentre in NN esiste il cookie vuoto "nome=;", in IE viene scritto "nome;" e quindi al check non risulta e inoltre occupa spazio
if ((expiresUdM && expires) && (expiresUdM!='GMT')) {
var ExpiresMillisec = ExpiresDate = Oggi = new Date();
switch (expiresUdM) { // calcola i JS-millisecondi del momento di scadenza
case "anni": ExpiresMillisec=Oggi.getTime()+expires*365*24*60*60*1000; break;
case "mesi": ExpiresMillisec=Oggi.getTime()+expires*31*24*60*60*1000; break;
case "giorni": ExpiresMillisec=Oggi.getTime()+expires*24*60*60*1000; break;
case "ore": ExpiresMillisec=Oggi.getTime()+expires*60*60*1000; break;
case "minuti": ExpiresMillisec=Oggi.getTime()+expires*60*1000; break;
case "secondi": ExpiresMillisec=Oggi.getTime()+expires*1000; break;
default: ExpiresMillisec=Oggi.getTime()+expires; // ha poco senso ma qlcs ci andava messo
}
ExpiresDate.setTime(ExpiresMillisec); // converte JS-millisecondi in Date
expires = ExpiresDate.toGMTString(); } // converte Date in GMT-stringa
secure = (secure=="1" || secure==1 || secure=="secure") ? 1 : "";
document.cookie = name + "=" +escape(value) +
( (expiresUdM && expires) ? "; expires=" + expires : "") +
( (path) ? "; path=" + path : "") +
( (domain) ? "; domain=" + domain : "") +
( (secure) ? "; secure" : "");
if (CookieLeggi(name)==null && secure!=1) { return false } else { return true }
}
function CookieCancella(CookieNome,CookiePath,CookieDomain)
{
var DoveSiTrovaPrima = document.cookie.indexOf(CookieNome);
if(DoveSiTrovaPrima==-1) { // se non c'è si taglia corto
return true;
} else {
if( CookiePath && CookieDomain)
{ CookieScrivi(CookieNome,'cancellato','anni',-1,CookiePath,CookieDomain); }
if( CookiePath && !CookieDomain)
{ CookieScrivi(CookieNome,'cancellato','anni',-1,CookiePath); }
if(!CookiePath && CookieDomain)
{ CookieScrivi(CookieNome,'cancellato','anni',-1,'',CookieDomain); }
if(!CookiePath && !CookieDomain)
{ CookieScrivi(CookieNome,'cancellato','anni',-1); }
var DoveSiTrovaDopo = document.cookie.indexOf(CookieNome);
if(DoveSiTrovaPrima!=DoveSiTrovaDopo) { return true } else { return false } // se Prima<>Dopo vuol dire che qualcosa è stato fatto; si guarda a questo e non alla semplice verifica di lettura perchè in presenza di 2 cookie omonimi la verifica fallirebbe
} }
// i browser cancellano i cookie nel momento preciso in cui vengono scritti con un qls "expires" scaduto
// o nel momento in cui recuperano i cookies con "document.cookie" e trovano che "expires" è scaduto o non esiste
// nb: c'è chi per cancellare scrive la scadenza "Thu, 01 Jan 1970 00:00:01 GMT" ma se qualcosa è errato, mentre NN ricoscosce abbastanza tutto, IE no e quindi questo invece che cancellare un cookie ne scrive uno che non scade mai
// nb: non è vero che IE cancella i cookie se si inserisce in contenuto vuoto, è solo un'apparenza, poichè tale contenuto è salvato come "nome;" che quindi nella lettura non viene trovato perchè si cerca "nome=;" quindi sembra cancellato invece c'è, occupa spazio, ed è inutilizzato
function CookieVisualizza(CookieNome)
{
// conta il numero di cloni
if(CookieNome) {
var i = cloni = 0;
while ( i!=-1 ) {
i = document.cookie.indexOf(CookieNome,i+1);
if (i!=-1) cloni++; }
} else {
var cloni = ''; }
// elabora il testo di output
var valore = (CookieLeggi(CookieNome)!=null) ? CookieLeggi(CookieNome) : '';
var testo= 'STRINGA COOKIES\nContenuto= \"'+unescape(document.cookie)+'\"\n\nSINGOLO COOKIE\nNome= \"'+CookieNome+'\"\nValore= \"'+ valore +'\"\nRipetizioni= '+cloni;
alert(testo);
}
// non è possibile leggere le singole proprietà: expires, path, domain , secure
FILE: cookies.html
<HTML>
<HEAD>
<TITLE>Javascript - Cookies - prova</TITLE>
<SCRIPT language='JavaScript' src="cookies.js" type=text/JavaScript></SCRIPT>
<SCRIPT type="text/javascript" language="JavaScript">
// eseguo subito le operazioni d'utilità generale
function StampaCookie(nome)
{
document.getElementById('tes').innerHTML = unescape(document.cookie);
document.getElementById('nom').innerHTML = nome;
document.getElementById('con').innerHTML = CookieLeggi(nome);
}
</SCRIPT>
</HEAD>
<BODY>
<form name="cok">
<TABLE border=1>
<TR><TD>**VARIABILE</TD><TD>**INPUT</TD><TD>**OUTPUT</TD></TR>
<TR><TD>TESTO INTERO</TD><TD></TD><TD id="tes"></TD></TR>
<TR><TD>NOME</TD><TD><input type="text" name="ckNome" size=15></TD><TD id="nom"></TD></TR>
<TR><TD>CONTENUTO</TD><TD><input type="text" name="ckDato" size=15></TD><TD id="con"></TD></TR>
<TR><TD>EXPIRES</TD><TD><input type="text" name="exSimb" size=2><input type="text" name="exDato" size=11>
anni, mesi, giorni, ore, minuti, secondi, GTM</TD><TD id="exp"></TD></TR>
<TR><TD>PATH</TD><TD><input type="text" name="ckPat" size=15>
"/"per tutto il dominio, [vuoto] per il path specifico e figli</TD><TD id="pat"></TD></TR>
<TR><TD>DOMINIO</TD><TD><input type="text" name="ckDom" size=15>
[ vuoto ] per l'attuale dominio, altrimenti va spicificato ".dominio.it"</TD><TD id="dom"></TD></TR>
<TR><TD>SECURE</TD><TD><input type="text" name="ckSec" size=15>
1=cripta; altro=non criptato</TD><TD id="sec"></TD></TR>
</TABLE>
<input type="button" value="SCRIVI" onclick="if (!CookieScrivi(document.cok.ckNome.value,document.cok.ckDato.value,document.cok.exSimb.value,document.cok.exDato.value,document.cok.ckPat.value,document.cok.ckDom.value,document.cok.ckSec.value)) alert('Scrittura non riuscita');">
<input type="button" value="LEGGI" onclick="StampaCookie(document.cok.ckNome.value)">
<input type="button" value="CANCELLA" onclick="if (!CookieCancella(document.cok.ckNome.value,document.cok.ckPat.value,document.cok.ckDom.value)) alert('Cancellazione non riuscita: forse ce ne sono più di uno o le proprietà non coincidono');">
<input type="button" value="ALERT" onclick="CookieVisualizza(document.cok.ckNome.value)">
</form>
</BODY>
</HTML>