JavaScriptですべてのCookieをクリアする


288

JavaScriptを使用して、現在のドメインのすべてのCookieをどのように削除しますか?

回答:


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

このコードには2つの制限があることに注意してください。

  • フラグはJavaScriptによるCookieへのアクセスを無効にするHttpOnlyため、HttpOnlyフラグが設定されているCookieは削除されません。
  • Path値が設定されているCookieは削除されません。(これらのCookieはに表示されdocument.cookieますが、Path設定されたのと同じ値を指定せずに削除することはできません)。

5
いいものですが、実験したところ、サイトに=なしのCookieは1つしか持てず、名前のないCookieであることがわかりました。実際にその値を取得します。したがって、eqPos == 1の場合は、name = ""代わりに、名前のない値を消去する必要があります。
PhiLho 2008年

59
注意してください!パスまたはドメインコンポーネントを使用するようにCookieが構成されている場合、この便利なスニペットは機能しません。
Dan Fabulich

1
そうだね。スニペットは、それらの詳細を要求するように変更できます。しかし、これはほとんどの場合に機能します。
Robert J. Walker

7
これをどのように変更して、パスまたはドメイン情報を含めますか?
VUELA 2013

2
少なくともChromeでは、Cookieは「;」で区切られているためtrim()split('; ')適切に機能させるために追加のスペースまたは(「;」で)する必要があります。編集を提案しました。
Daniel Kucal

124

一発ギャグ

すぐに貼り付けたい場合は...

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

ブックマークレットのコード:

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

1
一部の永続的なWebサイトではCookieをバックアップしているlocalStorageためwindow.localStorage.clear()、同様に役立つ場合があります
Klesun

75

そして、これはドメインのすべてのパスとすべてのバリアント(www.mydomain.com、mydomain.comなど)のすべてのCookieをクリアするためのものです:

(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();
        }
    }
})();

10
これが最良の答えになるはずです
Kanan Farzali 2017年

3
これは私にとってクロームで機能しますが、受け入れられた回答は機能しません
Orny

2
鮮やかさ!私の開発サーバーでは機能したが本番サーバーでは機能しなかった他のいくつかを試した後、これは両方で動作した最初のものでした。純金!
Velojet 2018年

1
これは私にとっても受け入れられた答えよりもはるかにうまく機能します。感謝
ギョームポティエ

先頭にドットが付いたドメインのコードを追加する必要がありましたが、関連するサブドメインがない場合でも、一部のCookieにはコードがあり、一部にはありません。しかし、これらの変更により、これまでに試した中で最も完全な実装である私にとってはうまく機能します。
ブラウエルフ

67

私自身、これに少し不満を感じた後、名前付きCookieをすべてのパスから削除しようとするこの関数をまとめました。Cookieごとにこれを呼び出すだけで、以前と同じようにすべてのCookieを削除できます。

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

いつものように、ブラウザによって動作は異なりますが、これでうまくいきました。楽しい。


@TomHammond、それはまったく新しい質問です。主な問題は、ホステッドドメインとホスティングドメイン、およびホステッドページを制御する機能に関連しています。
AnthonyVO 2016

2
これでも、httpOnly Cookieは削除されません。HTTP経由でのみ変更できます。
Sunny R Gupta 2017年

14

jquery.cookieプラグインにアクセスできる場合は、次の方法ですべてのCookieを消去できます。

for (var it in $.cookie()) $.removeCookie(it);

私は自分のウェブサイトで試したところ、すべてのCookieが削除されました。@Cerin様は、Cookieをクリアする前後にコンソールで次のコードを実行してみませんか?「for(var it in $ .cookie())console.log(it);」
jichi

jichiはjquery.cookieプラグインと一緒にjqueryライブラリを含めましたか?
ko1Rn 2017年

11

私が知る限り、ドメインに設定されたCookieを一括削除する方法はありません。名前がわかっていて、スクリプトがCookieと同じドメインにある場合は、Cookieをクリアできます。

値を空に設定し、有効期限を過去のどこかに設定できます。

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

あります、ここで優れた記事はJavaScriptを使用してクッキーを操作するには。


11
また、単に行うことができますdocument.cookie="username;expires=" + new Date(0).toGMTString()-あまり差はクッキーが1秒前または1970年に満了した場合
Bマット

記事をありがとう!
tx291 2017年

7

よりシンプル。もっと早く。

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

2
パスを処理しません。
スコットスミス

6

ここの2番目の回答とW3Schoolsの両方に影響された回答

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

働いているようです

編集:ワウは、スタックオーバーフローがそれらを互いに隣り合わせに配置する方法であるザックの興味深いものとほぼ同じです。

編集:一時的に見えたnvm


3

この方法を共有してCookieをクリアします。おそらく、ある時点で他の人に役立つかもしれません。

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

2

document.cookie変数を調べることでリストを取得できます。それらをすべてクリアするには、すべてをループして1つずつクリアするだけです。


2

なぜ最初に投票した答えがうまくいかないのかわかりません。

この答えは言いました:

ブラウザのCookieを削除するための100%の解決策はありません。

問題は、Cookieがキーの「名前」だけでなく「ドメイン」と「パス」によっても一意に識別されることです。

Cookieの「ドメイン」と「パス」を知らなければ、確実に削除することはできません。この情報は、JavaScriptのdocument.cookieからは入手できません。HTTP Cookieヘッダーからも利用できません!

だから私のアイデアは、Cookieの設定、取得、削除の完全なセットでCookieバージョンコントロールを追加することです。

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

これは私に時間を節約しました。賛成票に値する。`` let now = new Date(0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; はクッキーを削除します。
CruelEngine 2018

2

さらに洗練されたOOP指向のCookie制御モジュールがあります。またdeleteAll、既存のCookieをすべてクリアするメソッドも含まれています。このバージョンのdeleteAllメソッドにはpath=/、現在のドメイン内のすべてのCookieを削除する設定があることに注意してください。一部のスコープからのみCookieを削除する必要がある場合は、このメソッドをアップグレードして、このメソッドに動的pathパラメーターを追加する必要があります。

メインCookieクラスがあります:

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);
    }
}

Cookieセッターメソッド(Cookie.set)はかなり複雑なので、他のクラスに分解しました。これのコードがあります:

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

1

JavaScriptのすべてのCookie削除する簡単なコードを次に示します

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);
}

関数deleteAllCookies()を実行して、すべてのCookieをクリアします。


1

機能的アプローチ+ 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}`;
  }, "");
}

注:パスを処理しません


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

0

複数のスタイルのブラウザでリストされているほとんどすべてのメソッドを複数のスタイルのCookieでテストしたところ、ここではほとんど何も機能せず、50%も機能しませんでした。

必要に応じて修正してください。ここに2セントを投入します。次のメソッドはすべてを分解し、基本的に両方の設定に基づいてCookie値の文字列を構築します/。もちろん、パス文字列の段階的な構築を含みます。

これが他の人を助けることを願っています、そして私はどんな批判もこの方法を完成させるという形で来ることを願っています 最初は、他の人が求めていたような単純な1ライナーが欲しかったのですが、JS Cookieは、それほど簡単には処理できないものの1つです。

;(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;
        }
    }
})();

どちらも機能していない、または少なくとも私には適していません... CookieをHTTPで削除する必要がありました。
adelriosantiago 2018

0

jquery:

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

バニラ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
}

3
これにはjQuery Cookieプラグインが必要です。jQueryライブラリにはcookie()関数がありません。
ルチラ2017

-1

IEとEdgeに問題が見つかりました。Webkitブラウザー(Chrome、safari)の方が寛容であるようです。Cookieを設定するときは、デフォルトでCookieを設定したページになるため、常に「パス」を何かに設定してください。したがって、「パス」を指定せずに別のページで期限切れにしようとすると、パスが一致せず、期限切れになりません。このdocument.cookie値にはCookieのパスや有効期限は表示されないため、値を見てもCookieが設定された場所を特定することはできません。

別のページのCookieを期限切れにする必要がある場合は、設定ページのパスをCookie値に保存して、後で引き出したり、常に"; path=/;"Cookie値に追加したりできるようにします。その後、どのページからも期限切れになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.