75 votes

Comment puis-je supprimer tous les cookies avec JavaScript ?

J'ai écrit un code pour sauvegarder les cookies en JavaScript. Maintenant, j'ai besoin d'effacer les cookies sans tenir compte des valeurs que j'ai assignées.

Existe-t-il des modules script pour supprimer tous les cookies qui ont été générés par Javascript ?

Mon exemple de code :

document.cookie = 'ppkcookie2=another test; expires=Fri, 3 Aug 2001 20:47:11 UTC; path=/'

function createCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    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 eraseCookie(name) {
    createCookie(name,"",-1);
}

Comment pourrais-je effacer tous les cookies autrement ?

Y aura-t-il des problèmes lorsque je testerai le code sur le serveur web ?

85voto

jb. Points 4883

Il n'existe pas de solution à 100 % pour supprimer les cookies du navigateur.

Le problème est que les cookies sont identifiés de manière unique non seulement par leur clé "nom" mais aussi par leur "domaine" et leur "chemin".

Sans connaître le "domaine" et le "chemin" d'un cookie, vous ne pouvez pas le supprimer de manière fiable. Ces informations ne sont pas disponibles par le biais de JavaScript document.cookie . Il n'est pas non plus disponible via l'en-tête HTTP Cookie !

Toutefois, si vous connaissez le nom, le chemin et le domaine d'un cookie, vous pouvez l'effacer en définissant un cookie vide avec une date d'expiration passée, par exemple :

function clearCookie(name, domain, path){
    var domain = domain || document.domain;
    var path = path || "/";
    document.cookie = name + "=; expires=" + +new Date + "; domain=" + domain + "; path=" + path;
};

1 votes

Fonction cool ! Il y a cependant une petite erreur de frappe. Il ne devrait y avoir qu'un '+' entre "expires=" et la nouvelle date :)

36 votes

Andbdrew Ce n'est pas une faute de frappe. L'ajout d'un + devant une variable en JavaScript la convertit en un nombre. Sans cela, vous obtiendrez la date au format chaîne de caractères puisque la variable + est utilisé ici comme opérateur de concaténation de chaînes de caractères alors que ce que vous voulez vraiment est le timestamp Unix.

1 votes

@YiJiang génial ! Je ne le savais pas :)

69voto

Guss Points 6512

En apparence, ça a l'air bien - si vous appelez ça de la façon suivante eraseCookie() sur chaque cookie qui est lu à partir de document.cookie alors tous vos cookies auront disparu.

Essayez ça :

var cookies = document.cookie.split(";");
for (var i = 0; i < cookies.length; i++)
  eraseCookie(cookies[i].split("=")[0]);

Tout cela avec l'avertissement suivant :

  • JavaScript ne peut pas supprimer les cookies qui ont le HttpOnly activé.

2 votes

"Vous ne pouvez supprimer que les cookies créés par JavaScript - si un cookie a été créé par le serveur, alors vous ne pouvez pas le supprimer par JavaScript." En fait, vous devriez être en mesure d'effacer tous les cookies que vous pouvez voir.

0 votes

Je ne peux pas trouver la référence exacte pour le moment, mais j'ai eu quelques problèmes dans la manipulation par les clients des cookies créés par un serveur. Je crois qu'il y a quelques problèmes avec cela, au moins sur Firefox.

26 votes

C'est le drapeau "HttpOnly" qui vous rattrape. Vous POUVEZ supprimer les cookies du serveur à partir de javascript, à moins qu'ils ne soient protégés par le drapeau "HttpOnly".

9voto

antnewbee Points 353

Il s'agit d'une fonction que nous utilisons dans notre application et qui fonctionne bien.

supprimer le cookie : Aucune méthode d'argumentation

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
}

Editer : Ceci supprimera le cookie en le mettant à la date d'hier.

0 votes

Très belle touche sur la fenêtre. emplacement là.

6voto

pykiss Points 29

Pourquoi utiliser une nouvelle date au lieu d'une chaîne UTC statique ?

    function clearListCookies(){
    var cookies = document.cookie.split(";");
        for (var i = 0; i < cookies.length; i++){   
            var spcook =  cookies[i].split("=");
            document.cookie = spcook[0] + "=;expires=Thu, 21 Sep 1979 00:00:01 UTC;";                                
        }
    }

0voto

Peter Featherstone Points 1656

J'ai adapté quelques codes de personnes d'ici pour arriver à ça.

En gros, il utilise le defineGetter y defineSetter pour définir tous les cookies de la page et supprimer ceux spécifiés par l'utilisateur. Ce rôle peut bien sûr être inversé si c'est ce que vous recherchez.

J'ai testé cela avec des cookies tiers tels que Google Analytics et cela semble bien fonctionner (à l'exception de la __utmb cookie signifie que je ne suis plus repéré dans Google Analytics), peut-être pourriez-vous l'utiliser et l'adapter à vos besoins spécifiques.

J'ai inclus la partie concernant le fait que si un nom de cookie n'est pas __utmb pour votre référence, bien que vous puissiez facilement prendre ces valeurs dans un tableau et les parcourir en boucle de cette façon.

Fondamentalement, cette fonction inclura tous les cookies sauf ceux spécifiés dans la partie qui stipule que if( cookie_name.trim() != '__utmb' ) { all_cookies = all_cookies + cookies[i] + ";"; }

Vous pouvez compléter cette liste à l'aide de filtres OU ou ET, ou encore à partir d'un tableau, d'une base de données, d'une entrée utilisateur ou de tout ce que vous voulez pour exclure des éléments spécifiques (utile pour déterminer les cookies essentiels et non essentiels).

function deleteSpecificCookies() {

var cookies = document.cookie.split(";");
var all_cookies = '';

    for (var i = 0; i < cookies.length; i++) {

        var cookie_name  = cookies[i].split("=")[0];
        var cookie_value = cookies[i].split("=")[1];

        if( cookie_name.trim() != '__utmb' ) { all_cookies = all_cookies + cookies[i] + ";"; }

    }

if(!document.__defineGetter__) {

    Object.defineProperty(document, 'cookie', {
        get: function(){return all_cookies; },
        set: function(){return true},
    });

} else {

    document.__defineGetter__("cookie", function() { return all_cookies; } );
    document.__defineSetter__("cookie", function() { return true; } );

}

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X