Borrar todas las cookies con JavaScript

288

¿Cómo eliminas todas las cookies para el dominio actual usando JavaScript?

oso polar
fuente

Respuestas:

318
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";
    }
}

Tenga en cuenta que este código tiene dos limitaciones:

  • No eliminará las cookies con la HttpOnlymarca establecida, ya que la HttpOnlybandera deshabilita el acceso de Javascript a la cookie.
  • No eliminará las cookies que se hayan establecido con un Pathvalor. (Esto a pesar del hecho de que esas cookies aparecerán document.cookie, pero no puede eliminarlas sin especificar el mismo Pathvalor con el que se configuró).
Robert J. Walker
fuente
55
Buena, pero después de experimentar, descubrí que un sitio solo puede tener una cookie sin =, y luego es una cookie sin nombre, realmente obtienes su valor. Entonces, si eqPos == 1, debería hacerlo en su name = ""lugar, para borrar el valor sin nombre.
PhiLho
59
¡Tener cuidado! Si sus cookies están configuradas para usar una ruta o un componente de dominio, este útil fragmento no funcionará.
Dan Fabulich
1
Cierto. El fragmento podría modificarse para solicitarle esos detalles; Pero esto funciona para la mayoría de los casos.
Robert J. Walker
77
¿Cómo se modificaría esto para incluir la ruta o la información del dominio?
VUELA
2
Al menos en Chrome, las cookies están separadas por ";", por lo que tenemos que dejar trim()espacio adicional o split('; ')(por ';') para que funcione correctamente. He propuesto una edición.
Daniel Kucal
124

Un trazador de líneas

En caso de que quiera pegarlo rápidamente ...

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

Y el código para un bookmarklet:

javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
Craig Smedley
fuente
1
Algunos sitios web persistentes hacen copias de seguridad de las cookies, por localStoragelo que también window.localStorage.clear()pueden ser útiles
Klesun
75

Y aquí hay uno para borrar todas las cookies en todas las rutas y todas las variantes del dominio (www.midominio.com, midominio.com, etc.):

(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();
        }
    }
})();
ene
fuente
10
esta debería ser la mejor respuesta
Kanan Farzali
3
Este me funciona en cromo, mientras que la respuesta aceptada no lo hace
Orny
2
¡Brillante! Después de probar varios otros que funcionaban en mi servidor de desarrollo pero no en el servidor de producción, este fue el primero en trabajar en ambos. ¡Oro puro!
Velojet
1
Esto también para mí funciona mucho mejor que la respuesta aceptada. gracias
guillaumepotier
Tuve que agregar código para el dominio con punto inicial, algunas de mis cookies lo tienen, otras no, a pesar de que no hay subdominios relevantes. Pero con esos cambios, funciona bien para mí, la implementación más completa que he probado hasta ahora.
Blauelf
67

Después de un poco de frustración con esto mismo, activé esta función que intentará eliminar una cookie con nombre de todas las rutas. Simplemente llame a esto para cada una de sus cookies y debería estar más cerca de eliminar todas las cookies que antes.

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 + ';';
    }
}

Como siempre, diferentes navegadores tienen un comportamiento diferente, pero esto funcionó para mí. Disfrutar.

AnthonyVO
fuente
@ TomHammond, esa debería ser una pregunta completamente nueva. Los problemas principales están relacionados con el dominio alojado frente al dominio de alojamiento y su capacidad para controlar la página alojada.
AnthonyVO
2
Esto aún no eliminará las cookies de httpOnly. Solo se pueden modificar a través de HTTP.
Sunny R Gupta
14

Si tiene acceso al complemento jquery.cookie , puede borrar todas las cookies de esta manera:

for (var it in $.cookie()) $.removeCookie(it);
jichi
fuente
Acabo de probarlo en mi propio sitio web, que eliminó todas las cookies. ¿Podría @Cerin sama intentar ejecutar el siguiente código en la consola antes y después de borrar las cookies? "for (var it en $ .cookie ()) console.log (it);"
jichi
jichi ¿incluiste la biblioteca jquery junto con el complemento jquery.cookie?
ko1Rn
11

Hasta donde sé, no hay forma de eliminar una cookie de cualquier conjunto de cookies en el dominio. Puede borrar una cookie si conoce el nombre y si el script está en el mismo dominio que la cookie.

Puede establecer el valor en vacío y la fecha de vencimiento en algún lugar del pasado:

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

Aquí hay un excelente artículo sobre la manipulación de cookies mediante javascript.

ConroyP
fuente
11
También puede hacerlo document.cookie="username;expires=" + new Date(0).toGMTString(), sin mucha diferencia si la cookie caduca hace 1 segundo o en 1970
matt b
¡Gracias por el artículo!
tx291
7

Más simple Más rápido.

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";    
}
Dinesh
fuente
2
No maneja caminos.
Scott Smith
6

Una respuesta influenciada por la segunda respuesta aquí y W3Schools

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

Parece estar trabajando

editar: wow, casi exactamente lo mismo que Zach es interesante cómo Stack Overflow los puso uno al lado del otro.

editar: nvm que aparentemente fue temporal

Jacob David C. Cunningham
fuente
3

Pensé que compartiría este método para borrar las cookies. Quizás pueda ser útil para otra persona en algún momento.

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;';
}
Zach Shallbetter
fuente
2

Puede obtener una lista mirando la variable document.cookie. Borrarlos a todos es solo cuestión de recorrerlos y borrarlos uno por uno.

Segundo
fuente
2

No sé por qué la primera respuesta votada no funciona para mí.

Como decía esta respuesta :

No hay una solución 100% para eliminar las cookies del navegador.

El problema es que las cookies se identifican de manera única no solo por su "nombre" clave sino también por su "dominio" y "ruta".

Sin conocer el "dominio" y la "ruta" de una cookie, no puede eliminarla de manera confiable. Esta información no está disponible a través del documento.cookie de JavaScript. ¡Tampoco está disponible a través del encabezado HTTP Cookie!

Entonces, mi idea es agregar un control de versión de Cookies con el conjunto completo de configuración, obtención y eliminación de cookies:

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;';  
}
Mashiro
fuente
Esto me ahorró horas. merece el voto a favor. `` let now = new Date (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; eliminará las cookies.
CruelEngine
2

Tengo un módulo de control de cookies más sofisticado y orientado a OOP. También contiene un deleteAllmétodo para borrar todas las cookies existentes. Tenga en cuenta que esta versión del deleteAllmétodo tiene una configuración path=/que provoca la eliminación de todas las cookies dentro del dominio actual. Si necesita eliminar las cookies solo de algún alcance, tendrá que actualizar este método agregando pathparámetros dinámicos a este método.

Hay Cookieclase principal :

import {Setter} from './Setter';

export class Cookie {
    /**
     * @param {string} key
     * @return {string|undefined}
     */
    static get(key) {
        key = key.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1');

        const regExp = new RegExp('(?:^|; )' + key + '=([^;]*)');
        const matches = document.cookie.match(regExp);

        return matches
            ? decodeURIComponent(matches[1])
            : undefined;
    }

    /**
     * @param {string} name
     */
    static delete(name) {
        this.set(name, '', { expires: -1 });
    }

    static deleteAll() {
        const cookies = document.cookie.split('; ');

        for (let cookie of cookies) {
            const index = cookie.indexOf('=');

            const name = ~index
                ? cookie.substr(0, index)
                : cookie;

            document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';
        }
    }

    /**
     * @param {string} name
     * @param {string|boolean} value
     * @param {{expires?:Date|string|number,path?:string,domain?:string,secure?:boolean}} opts
     */
    static set(name, value, opts = {}) {
        Setter.set(name, value, opts);
    }
}

El método de establecimiento de cookies ( Cookie.set) es bastante complejo, así que lo descompuse en otra clase. Hay un código de este:

export class Setter {
    /**
     * @param {string} name
     * @param {string|boolean} value
     * @param {{expires?:Date|string|number,path?:string,domain?:string,secure?:boolean}} opts
     */
    static set(name, value, opts = {}) {
        value = Setter.prepareValue(value);
        opts = Setter.prepareOpts(opts);

        let updatedCookie = name + '=' + value;

        for (let i in opts) {
            if (!opts.hasOwnProperty(i)) continue;

            updatedCookie += '; ' + i;

            const value = opts[i];

            if (value !== true)
                updatedCookie += '=' + value;
        }

        document.cookie = updatedCookie;
    }

    /**
     * @param {string} value
     * @return {string}
     * @private
     */
    static prepareValue(value) {
        return encodeURIComponent(value);
    }

    /**
     * @param {{expires?:Date|string|number,path?:string,domain?:string,secure?:boolean}} opts
     * @private
     */
    static prepareOpts(opts = {}) {
        opts = Object.assign({}, opts);

        let {expires} = opts;

        if (typeof expires == 'number' && expires) {
            const date = new Date();

            date.setTime(date.getTime() + expires * 1000);

            expires = opts.expires = date;
        }

        if (expires && expires.toUTCString)
            opts.expires = expires.toUTCString();

        return opts;
    }
}
B. Bohdan
fuente
1

Aquí hay un código simple para eliminar todas las cookies en 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);
}

Ejecute la función deleteAllCookies()para borrar todas las cookies.

Shubham Kumar
fuente
1

Enfoque funcional + 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: no maneja rutas

Stefano Saitta
fuente
0
//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=;';
    }
}
romano
fuente
0

Después de probar casi todos los métodos enumerados en varios estilos de navegadores en múltiples estilos de cookies, encontré que casi nada aquí funciona, incluso el 50%.

Por favor, ayuda a corregir según sea necesario, pero voy a tirar mis 2 centavos aquí. El siguiente método desglosa todo y básicamente construye la cadena de valor de la cookie en función de las piezas de configuración, además de incluir una compilación paso a paso de la cadena de ruta, comenzando por /supuesto.

Espero que esto ayude a otros y espero que cualquier crítica pueda venir en forma de perfeccionar este método. Al principio quería un simple 1-liner como otros buscaban, pero las cookies JS son una de esas cosas que no son tan fáciles de manejar.

;(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;
        }
    }
})();
SpYk3HH
fuente
Tampoco funciona, o al menos no para mí ... Tuve que eliminar las cookies por HTTP.
adelriosantiago
0

Jquery:

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

vainilla 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
}
sureshvignesh
fuente
3
Esto requiere el complemento jQuery Cookie. La biblioteca jQuery no tiene la función cookie ().
Ruchira
-1

Encontré un problema en IE y Edge. Los navegadores webkit (Chrome, safari) parecen ser más indulgentes. Al configurar las cookies, siempre establezca la "ruta" a algo, porque el valor predeterminado será la página que configura la cookie. Entonces, si intenta caducar en una página diferente sin especificar la "ruta", la ruta no coincidirá y no caducará. El document.cookievalor no muestra la ruta o la caducidad de una cookie, por lo que no puede deducir dónde se configuró la cookie mirando el valor.

Si necesita expirar las cookies de diferentes páginas, guarde la ruta de la página de configuración en el valor de la cookie para que pueda retirarla más tarde o siempre agregue "; path=/;"el valor de la cookie. Entonces caducará desde cualquier página.

Derek Wade
fuente