Effacer tous les cookies avec JavaScript
Comment supprimer tous les cookies pour le domaine courant en utilisant JavaScript?
17 réponses
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";
}
}
notez que ce code a deux limitations:
- il ne supprimera pas les cookies avec le drapeau
HttpOnly
, car le drapeauHttpOnly
empêche Javascript d'accéder au cookie. - il ne supprimera pas les cookies qui ont été paramétrés avec une valeur
Path
. (Ceci est en dépit du fait que ces cookies apparaîtront dansdocument.cookie
, mais vous ne pouvez pas le supprimer sans spécifier la même valeurPath
avec laquelle il a été défini.)
One liner
au cas où vous voulez le coller rapidement...
document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); });
et le code pour un bookmarklet :
javascript:(function(){document.cookie.split(";").forEach(function(c) { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); }); })();
après un peu de frustration avec cela, j'ai moi-même assemblé cette fonction qui va tenter d'effacer un cookie nommé de tous les chemins. Il suffit d'appeler cela pour chacun de vos cookies et vous devriez être plus proche de supprimer chaque cookie que vous étiez avant.
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 + ';';
}
}
Comme toujours différents navigateurs ont des comportements différents, mais cela a fonctionné pour moi. Profiter.
et en voici un pour effacer tous les cookies dans tous les chemins et toutes les variantes du domaine (www.mydomain.com, mydomain.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();
}
}
})();
autant que je sache, il n'y a aucun moyen de faire une suppression générale d'un cookie sur le domaine. Vous pouvez effacer un cookie si vous connaissez le nom et si le script est sur le même domaine que le cookie.
vous pouvez définir la valeur à vide et la date d'expiration à quelque part dans le passé:
var mydate = new Date();
mydate.setTime(mydate.getTime() - 1);
document.cookie = "username=; expires=" + mydate.toGMTString();
il y a un excellent article ici sur la manipulation des cookies en utilisant javascript.
plus simple. Plus rapide.
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";
}
Une réponse à la fois inspiré par seconde réponse ici et W3Schools
document.cookie.split(';').forEach(function(c) {
document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;';
});
semble fonctionner
edit: wow presque exactement le même que zach's intéressant comment le débordement de la pile les a mis à côté les uns des autres.
edit: nvm qui est temporaire apparemment
a pensé que je partagerais cette méthode pour effacer les cookies. Peut-être pourrait-elle être utile à quelqu'un d'autre à un moment donné.
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;';
}
vous pouvez obtenir une liste en regardant dans le document.cookie variable. Les éliminer tous n'est qu'une question de les passer en boucle et de les éliminer un par un.
voici un code simple pour supprimer tous les 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);
}
exécutez la fonction deleteAllCookies()
pour effacer tous les cookies.
approche fonctionnelle + 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}`;
}, "");
}
Note: ne gère pas les chemins
Je ne sais pas pourquoi la première réponse votée ne fonctionne pas pour moi.
Comme cette réponse , a déclaré:
il n'y a 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" nom "clé, mais aussi par leur" domaine "et leur"chemin".
sans connaître le "domaine" et le" chemin " d'un cookie, vous ne pouvez pas de manière fiable le supprimer. Cette information n'est pas disponible dans le document de JavaScript.cookie. Il n'est pas non plus disponible via L'en-tête du Cookie HTTP!
donc mon idée est d'ajouter un contrôle de version de Cookie avec l'ensemble complet de réglage, obtention, suppression des 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;';
}
//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=;';
}
}
après avoir testé presque toujours la méthode listée dans plusieurs styles de navigateurs sur plusieurs styles de cookies, j'ai trouvé presque rien ici fonctionne même 50%.
s'il vous plaît aidez à corriger au besoin, mais je vais jeter mes 2 cents ici. La méthode suivante décompose tout et construit essentiellement la chaîne de valeur du cookie basée à la fois sur les pièces de réglages et en incluant une construction étape par étape de la chaîne de chemin, en commençant par /
bien sûr.
espérons que cela aide les autres et j'espère que toute critique pourra venir sous la forme de perfectionner cette méthode. Au début, j'ai voulu un simple 1-liner comme certains d'autres ont cherché, mais les cookies JS sont l'une de ces choses pas si faciles à traiter.
;(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);
}
vanilla 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
}
j'ai trouvé un problème dans IE et Edge. Les navigateurs Webkit (Chrome, safari) semblent plus indulgents. Lors de la configuration des cookies, définissez toujours le "chemin" vers quelque chose, car la page par défaut sera la page qui définira le cookie. Donc, si vous essayez d'expirer sur une autre page sans préciser le "chemin", la trajectoire ne correspond pas et il n'expirera pas. La valeur document.cookie
n'indique pas le chemin ou l'expiration d'un cookie, donc vous ne pouvez pas déterminer où le cookie a été défini en regardant la valeur.
si vous avez besoin d'expirer les cookies de différentes pages, enregistrez le chemin de la page de configuration dans la valeur du cookie pour que vous puissiez le retirer plus tard ou toujours ajouter "; path=/;"
à la valeur du cookie. Alors il expirera de n'importe quelle page.