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


当前回答

我在这里贡献是因为这个功能将允许您删除所有cookie(匹配路径,默认为no-path或\),也包括设置为包含在子域上的cookie

function clearCookies( wildcardDomain=false, primaryDomain=true, path=null ){
  pathSegment = path ? '; path=' + path : ''
  expSegment = "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"
  document.cookie.split(';').forEach(
    function(c) { 
      primaryDomain && (document.cookie = c.replace(/^ +/, "").replace(/=.*/, expSegment + pathSegment))
      wildcardDomain && (document.cookie = c.replace(/^ +/, "").replace(/=.*/, expSegment + pathSegment + '; domain=' + document.domain))
    }
  )
} 

其他回答

函数方法+ 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}`;
  }, "");
}

注意:不处理路径

这里有几个答案没有解决路径问题。我认为:如果你控制了网站,或者它的一部分,你应该知道所有使用的路径。所以你只需要让它删除所有路径上的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,因为我的网站是多域和多语言的

我发现IE和Edge有问题。Webkit浏览器(Chrome, safari)似乎更宽容。当设置cookie时,总是将“路径”设置为某个内容,因为默认将是设置cookie的页面。因此,如果你试图在不同的页面上过期,而没有指定“路径”,路径将不匹配,它将不会过期。该文档。Cookie值不会显示Cookie的路径或过期时间,因此您无法通过查看该值推导出Cookie的设置位置。

如果您需要从不同页面过期cookie,请在cookie值中保存设置页面的路径,以便稍后将其取出或始终附加“;Path =/;"到cookie值。然后它将从任何页面过期。

一个衬套

以防你想快速粘贴进去…

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

和bookmarklet的代码:

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

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

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

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

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