Cancellare tutti i cookie con JavaScript

Come si eliminano tutti i cookie per il dominio corrente utilizzando JavaScript?

function deleteAllCookies() { var cookies = document.cookie.split(";"); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i]; var eqPos = cookie.indexOf("="); var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; } } 

Nota che questo codice ha due limitazioni:

  • Non cancellerà i cookie con il flag HttpOnly impostato, poiché il flag HttpOnly disabilita l’accesso di Javascript al cookie.
  • Non cancellerà i cookie che sono stati impostati con un valore Path . (Questo nonostante il fatto che quei cookie appariranno in document.cookie , ma non puoi cancellarlo senza specificare lo stesso valore Path con cui è stato impostato.)

Una fodera

Nel caso in cui si desidera incollarlo in fretta …

 document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); 

E il codice per un bookmarklet:

 javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })(); 

Dopo un po ‘di frustrazione, ho messo insieme questa funzione che tenterà di cancellare un cookie con nome da tutti i percorsi. Basta chiamare questo per ciascuno dei tuoi cookie e dovresti essere più vicino all’eliminazione di ogni cookie che eri prima.

 function eraseCookieFromAllPaths(name) { // This function will attempt to remove a cookie from all paths. var pathBits = location.pathname.split('/'); var pathCurrent = ' path='; // do a simple pathless delete first. document.cookie = name + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT;'; for (var i = 0; i < pathBits.length; i++) { pathCurrent += ((pathCurrent.substr(-1) != '/') ? '/' : '') + pathBits[i]; document.cookie = name + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT;' + pathCurrent + ';'; } } 

Come sempre i diversi browser hanno un comportamento diverso ma questo ha funzionato per me. Godere.

E qui c’è uno per cancellare tutti i cookie in tutti i percorsi e tutte le varianti del dominio (www.mydomain.com, mydomain.com, ecc.):

 (function () { var cookies = document.cookie.split("; "); for (var c = 0; c < cookies.length; c++) { var d = window.location.hostname.split("."); while (d.length > 0) { var cookieBase = encodeURIComponent(cookies[c].split(";")[0].split("=")[0]) + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=' + d.join('.') + ' ;path='; var p = location.pathname.split('/'); document.cookie = cookieBase + '/'; while (p.length > 0) { document.cookie = cookieBase + p.join('/'); p.pop(); }; d.shift(); } } })(); 

Se hai accesso al plugin jquery.cookie , puoi cancellare tutti i cookie in questo modo:

 for (var it in $.cookie()) $.removeCookie(it); 

Per quanto ne so, non c’è modo di fare una cancellazione generale di qualsiasi set di cookie sul dominio. È ansible cancellare un cookie se si conosce il nome e se lo script si trova nello stesso dominio del cookie.

Puoi impostare il valore da svuotare e la data di scadenza da qualche parte nel passato:

 var mydate = new Date(); mydate.setTime(mydate.getTime() - 1); document.cookie = "username=; expires=" + mydate.toGMTString(); 

C’è un articolo eccellente qui sulla manipolazione dei cookie usando javascript.

Più semplice. Più veloce.

 function deleteAllCookies() { var c = document.cookie.split("; "); for (i in c) document.cookie =/^[^=]+/.exec(c[i])[0]+"=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; } 

Una risposta influenzata sia dalla seconda risposta qui che da W3Schools

 document.cookie.split(';').forEach(function(c) { document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;'; }); 

Sembra funzionare

edit: wow quasi esattamente lo stesso di Zach è interessante come Stack Overflow li mette l’uno accanto all’altro.

modifica: nvm apparentemente temporaneo

Ho pensato di condividere questo metodo per cancellare i cookie. Forse potrebbe essere utile per qualcun altro ad un certo punto.

 var cookie = document.cookie.split(';'); for (var i = 0; i < cookie.length; i++) { var chip = cookie[i], entry = chip.split("="), name = entry[0]; document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; } 

Puoi ottenere una lista esaminando la variabile document.cookie. Cancellarli tutti è solo questione di ricoprirli tutti e cancellarli uno ad uno.

Ecco un semplice codice per eliminare tutti i cookie in JavaScript .

 function deleteAllCookies(){ var cookies = document.cookie.split(";"); for (var i = 0; i < cookies.length; i++) deleteCookie(cookies[i].split("=")[0]); } function setCookie(name, value, expirydays) { var d = new Date(); d.setTime(d.getTime() + (expirydays*24*60*60*1000)); var expires = "expires="+ d.toUTCString(); document.cookie = name + "=" + value + "; " + expires; } function deleteCookie(name){ setCookie(name,"",-1); } 

Esegui la funzione deleteAllCookies() per cancellare tutti i cookie.

Approccio funzionale + ES6

 const cookieCleaner = () => { return document.cookie.split(";").reduce(function (acc, cookie) { const eqPos = cookie.indexOf("="); const cleanCookie = `${cookie.substr(0, eqPos)}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;`; return `${acc}${cleanCookie}`; }, ""); } 

Nota: non gestisce i percorsi

 //Delete all cookies function deleteAllCookies() { var cookies = document.cookie.split(";"); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i]; var eqPos = cookie.indexOf("="); var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; document.cookie = name + '=;' + 'expires=Thu, 01-Jan-1970 00:00:01 GMT;' + 'path=' + '/;' + 'domain=' + window.location.host + ';' + 'secure=;'; } } 

Dopo aver provato quasi sempre il metodo elencato in più stili di browser su più stili di cookie, non ho trovato quasi nulla che funzioni anche al 50%.

Per favore, correggi il problema se necessario, ma ho intenzione di buttare i miei 2 centesimi qui. Il seguente metodo spezza tutto e fondamentalmente costruisce la stringa del valore del cookie basata su entrambe le parti delle impostazioni e include una build passo passo della stringa del percorso, iniziando con / ovviamente.

Spero che questo aiuti gli altri e spero che qualsiasi critica possa venire nella forma di perfezionare questo metodo. All’inizio volevo un semplice 1-liner come altri cercavano, ma i cookie JS sono una di quelle cose che non sono così facili da gestire.

 ;(function() { if (!window['deleteAllCookies'] && document['cookie']) { window.deleteAllCookies = function(showLog) { var arrCookies = document.cookie.split(';'), arrPaths = location.pathname.replace(/^\//, '').split('/'), // remove leading '/' and split any existing paths arrTemplate = [ 'expires=Thu, 01-Jan-1970 00:00:01 GMT', 'path={path}', 'domain=' + window.location.host, 'secure=' ]; // array of cookie settings in order tested and found most useful in establishing a "delete" for (var i in arrCookies) { var strCookie = arrCookies[i]; if (typeof strCookie == 'string' && strCookie.indexOf('=') >= 0) { var strName = strCookie.split('=')[0]; // the cookie name for (var j=1;j<=arrTemplate.length;j++) { if (document.cookie.indexOf(strName) < 0) break; // if this is true, then the cookie no longer exist else { var strValue = strName + '=; ' + arrTemplate.slice(0, j).join('; ') + ';'; // made using the temp array of settings, putting it together piece by piece as loop rolls on if (j == 1) document.cookie = strValue; else { for (var k=0;k<=arrPaths.length;k++) { if (document.cookie.indexOf(strName) < 0) break; // if this is true, then the cookie no longer exist else { var strPath = arrPaths.slice(0, k).join('/') + '/'; // builds path line strValue = strValue.replace('{path}', strPath); document.cookie = strValue; } } } } } } } showLog && window['console'] && console.info && console.info("\n\tCookies Have Been Deleted!\n\tdocument.cookie = \"" + document.cookie + "\"\n"); return document.cookie; } } })(); 

jquery:

 var cookies = $.cookie(); for(var cookie in cookies) { $.removeCookie(cookie); } 

vaniglia JS

 function clearListCookies() { var cookies = document.cookie.split(";"); for (var i = 0; i < cookies.length; i++) { var spcook = cookies[i].split("="); deleteCookie(spcook[0]); } function deleteCookie(cookiename) { var d = new Date(); d.setDate(d.getDate() - 1); var expires = ";expires="+d; var name=cookiename; //alert(name); var value=""; document.cookie = name + "=" + value + expires + "; path=/acc/html"; } window.location = ""; // TO REFRESH THE PAGE } 

Non so perché la prima risposta votata non funzioni per me.

Come questa risposta ha detto:

Non esiste una soluzione al 100% per eliminare i cookie del browser.

Il problema è che i cookie sono identificati in modo univoco non solo dal loro “nome”, ma anche dal loro “dominio” e “percorso”.

Senza conoscere il “dominio” e il “percorso” di un cookie, non è ansible eliminarlo in modo affidabile. Questa informazione non è disponibile tramite il documento di JavaScript. Cookie. Non è disponibile nemmeno tramite l’intestazione HTTP Cookie!

Quindi la mia idea è di aggiungere un controllo di versione di Cookie con il set completo di impostazioni, ricezione, rimozione di cookie:

 var cookie_version_control = '---2018/5/11'; function setCookie(name,value,days) { var expires = ""; if (days) { var date = new Date(); date.setTime(date.getTime() + (days*24*60*60*1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name+cookie_version_control + "=" + (value || "") + expires + "; path=/"; } function getCookie(name) { var nameEQ = name+cookie_version_control + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } function removeCookie(name) { document.cookie = name+cookie_version_control+'=; Max-Age=-99999999;'; } 

Ho trovato un problema in IE e Edge. I browser Webkit (Chrome, Safari) sembrano essere più indulgenti. Quando si impostano i cookie, impostare sempre il “percorso” su qualcosa, poiché l’impostazione predefinita sarà la pagina che imposta il cookie. Quindi se provi a scadere su una pagina diversa senza specificare il “percorso”, il percorso non corrisponderà e non scadrà. Il valore document.cookie non mostra il percorso o la scadenza di un cookie, quindi non è ansible determinare dove è stato impostato il cookie osservando il valore.

Se è necessario scadere i cookie da pagine diverse, salvare il percorso della pagina di impostazione nel valore del cookie in modo da poterlo estrarre in un secondo momento o aggiungere sempre "; path=/;" al valore del cookie. Quindi scadrà da qualsiasi pagina.