如何使用JavaScript删除当前域的所有cookie ?


当前回答

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

其他回答

这里有几个答案没有解决路径问题。我认为:如果你控制了网站,或者它的一部分,你应该知道所有使用的路径。所以你只需要让它删除所有路径上的cookie。 因为我的网站已经有jquery(出于懒惰),我决定使用jquery cookie,但你可以很容易地适应纯javascript的基础上的其他答案。

在这个例子中,我删除了电子商务平台正在使用的三个特定路径。

let mainURL = getMainURL().toLowerCase().replace('www.', '').replace('.com.br', '.com'); // i am a brazilian guy
let cookies = $.cookie();
for(key in cookies){
    // default remove
    $.removeCookie(key, {
        path:'/'
    });
    // remove without www
    $.removeCookie(key, {
        domain: mainURL,
        path: '/'
    });
    // remove with www
    $.removeCookie(key, {
        domain: 'www.' + mainURL,
        path: '/'
    });
};

// get-main-url.js v1
function getMainURL(url = window.location.href){
    url = url.replace(/.+?\/\//, ''); // remove protocol
    url = url.replace(/(\#|\?|\/)(.+)?/, ''); // remove parameters and paths
    // remove subdomain
    if( url.split('.').length === 3 ){
        url = url.split('.');
        url.shift();
        url = url.join('.');
    };
    return url;
};

我把。com网站改为。com.br,因为我的网站是多域和多语言的

据我所知,没有办法对域名上的任何cookie集进行全面删除。如果知道cookie的名称,并且脚本与cookie在同一个域中,则可以清除cookie。

你可以将值设置为空,过期日期设置为过去的某个时间:

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

这里有一篇关于使用javascript操作cookie的优秀文章。

你可以通过查看文档得到一个列表。饼干变量。清除它们只是一个循环遍历所有它们并一个一个地清除它们的问题。

function deleteAllCookies() {
    const cookies = document.cookie.split(";");

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

注意,这段代码有两个限制:

它不会删除设置了HttpOnly标志的cookie,因为HttpOnly标志禁止Javascript访问cookie。 它不会删除已设置为Path值的cookie。(尽管这些cookie会出现在文档中。cookie,但你不能删除它没有指定相同的路径值,它是设置。)

下面的代码将删除当前域内的所有cookie和所有尾随子域(www.some.sub.domain.example, .some.sub.domain。例如,.sub.domain。例如,等等。)

一个单行的香草JS版本(我认为这里唯一一个没有使用cookie.split()):

document.cookie.replace(/(?<=^|;).+?(?=\=|;|$)/g, name => location.hostname.split('.').reverse().reduce(domain => (domain=domain.replace(/^\.?[^.]+/, ''),document.cookie=`${name}=;max-age=0;path=/;domain=${domain}`,domain), location.hostname));

这是这一行的一个可读版本:

document.cookie.replace(
  /(?<=^|;).+?(?=\=|;|$)/g,
  name => location.hostname
    .split(/\.(?=[^\.]+\.)/)
    .reduceRight((acc, val, i, arr) => i ? arr[i]='.'+val+acc : (arr[i]='', arr), '')
    .map(domain => document.cookie=`${name}=;max-age=0;path=/;domain=${domain}`)
);