การล้างคุกกี้ทั้งหมดด้วย JavaScript


คำตอบ:


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

โปรดทราบว่ารหัสนี้มีข้อ จำกัด สองประการ:

  • มันจะไม่ลบคุกกี้ที่มีการHttpOnlyตั้งค่าสถานะเป็นHttpOnlyธงปิดการใช้งานการเข้าถึงคุกกี้ Javascript
  • มันจะไม่ลบคุกกี้ที่ตั้งPathค่าไว้ (นี่คือความจริงที่ว่าคุกกี้เหล่านั้นจะปรากฏdocument.cookieแต่คุณไม่สามารถลบได้โดยไม่ต้องระบุPathค่าเดียวกันกับที่ตั้งไว้)

5
เป็นสิ่งที่ดี แต่หลังจากการทดลองฉันพบว่าไซต์สามารถมีเพียงคุกกี้เดียวที่ไม่มี = และจากนั้นเป็นคุกกี้ที่ไม่ระบุชื่อคุณจะได้รับคุณค่าจริง ดังนั้นถ้า eqPos == 1 คุณควรทำname = ""แทนเพื่อลบค่านิรนาม
PhiLho

59
ระวัง! หากคุกกี้ของคุณได้รับการกำหนดค่าให้ใช้เส้นทางหรือส่วนประกอบโดเมนตัวอย่างข้อมูลที่มีประโยชน์นี้จะไม่ทำงาน
Dan Fabulich

1
จริง ข้อมูลโค้ดสามารถแก้ไขได้เพื่อสอบถามรายละเอียดเหล่านั้น แต่วิธีนี้ใช้ได้กับกรณีส่วนใหญ่
Robert J. Walker

7
สิ่งนี้จะได้รับการแก้ไขอย่างไรเพื่อรวมเส้นทางหรือข้อมูลโดเมน
VUELA

2
อย่างน้อยในคุกกี้ Chrome จะถูกคั่นด้วย ";" ดังนั้นเราจึงต้องtrim()เว้นวรรคเพิ่มเติมหรือsplit('; ')(โดย ';') เพื่อให้ทำงานได้อย่างถูกต้อง ฉันเสนอการแก้ไข
Daniel Kucal

124

หนึ่งในสายการบิน

ในกรณีที่คุณต้องการวางอย่างรวดเร็ว ...

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

1
คุกกี้สำรองบางเว็บไซต์ที่ใช้งานlocalStorageไม่ได้window.localStorage.clear()อาจเป็นประโยชน์เช่นกัน
Klesun

75

และนี่คือการล้างคุกกี้ทั้งหมดในทุกเส้นทางและทุกรูปแบบของโดเมน (www.mydomain.com, mydomain.com ฯลฯ ):

(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

3
อันนี้ใช้ได้กับฉันในโครเมียมในขณะที่คำตอบที่ยอมรับไม่ได้
Orny

2
ยอดเยี่ยม! หลังจากลองหลาย ๆ อันที่ทำงานบนเซิร์ฟเวอร์ dev ของฉัน แต่ไม่ได้อยู่บนเซิร์ฟเวอร์ที่ใช้งานจริงนี่เป็นครั้งแรกที่ทั้งสองทำงาน ทองคำบริสุทธิ์!
Velojet

1
สิ่งนี้สำหรับฉันทำงานได้ดีกว่าคำตอบที่ยอมรับ ขอบคุณ
guillaumepotier

ต้องเพิ่มรหัสสำหรับโดเมนที่มีจุดนำคุกกี้บางส่วนของฉันมีบางอย่างทำไม่ได้ถึงแม้ว่าจะไม่มีโดเมนย่อยที่เกี่ยวข้อง แต่ด้วยการเปลี่ยนแปลงเหล่านี้มันทำงานได้ดีสำหรับฉันการใช้งานที่สมบูรณ์ที่สุดที่ฉันได้ลองมา
Blauelf

67

หลังจากผิดหวังเล็กน้อยกับตัวเองฉันก็เคาะฟังก์ชั่นนี้ซึ่งจะพยายามลบคุกกี้ชื่อจากทุกเส้นทาง เพียงแค่เรียกสิ่งนี้สำหรับแต่ละคุกกี้ของคุณและคุณควรจะใกล้ชิดกับการลบคุกกี้ทุกตัวที่เคยเป็นมาก่อน

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

เช่นเดียวกับเบราว์เซอร์ที่แตกต่างกันมีพฤติกรรมที่แตกต่างกันไป แต่สิ่งนี้ใช้ได้สำหรับฉัน สนุก.


@ ทอมแฮมมอนด์นั่นน่าจะเป็นคำถามใหม่หมดจด ปัญหาหลักอยู่รอบ ๆ โดเมนที่โฮสต์กับโฮสต์โดเมนและความสามารถในการควบคุมหน้าโฮสต์
AnthonyVO

2
การทำเช่นนี้จะไม่ลบ http http เฉพาะคุกกี้ สามารถแก้ไขได้ผ่าน HTTP เท่านั้น
ซันนี่ R Gupta

14

หากคุณสามารถเข้าถึงปลั๊กอินjquery.cookieคุณสามารถลบคุกกี้ทั้งหมดด้วยวิธีนี้:

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

ฉันลองในเว็บไซต์ของฉันเองซึ่งลบคุกกี้ทั้งหมด @Cerin sama ลองใช้รหัสต่อไปนี้ในคอนโซลก่อนและหลังการล้างคุกกี้หรือไม่ "สำหรับ (var it ใน $ .cookie ()) console.log (it);"
jichi

jichi คุณรวมไลบรารี่ jquery เข้ากับปลั๊กอิน jquery.cookie หรือไม่?
ko1Rn

11

เท่าที่ฉันรู้ไม่มีทางที่จะทำแบบครอบคลุมลบของชุดคุกกี้ใด ๆ ในโดเมน คุณสามารถล้างคุกกี้หากคุณรู้ชื่อและถ้าสคริปต์อยู่ในโดเมนเดียวกับคุกกี้

คุณสามารถตั้งค่าให้ว่างเปล่าและวันหมดอายุเป็นที่ผ่านมา:

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

มีบทความที่ดีเกี่ยวกับการจัดการคุกกี้โดยใช้จาวาสคริปต์


11
คุณสามารถทำได้โดยdocument.cookie="username;expires=" + new Date(0).toGMTString()ไม่แตกต่างกันมากหากคุกกี้หมดอายุ 1 วินาทีที่ผ่านมาหรือในปี 1970
ด้าน b

ขอบคุณสำหรับบทความ!
tx291

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
ไม่จัดการเส้นทาง
Scott Smith

6

คำตอบได้รับอิทธิพลจากคำตอบที่สองที่นี่และ W3Schools

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

ดูเหมือนว่าจะทำงาน

แก้ไข: ว้าวเกือบเหมือนกันกับ Zach ที่น่าสนใจว่า Stack Overflow วางเรียงซ้อนกัน

แก้ไข: nvm ที่เห็นได้ชัดชั่วคราว


3

คิดว่าฉันจะแบ่งปันวิธีนี้ในการล้างคุกกี้ บางทีมันอาจจะมีประโยชน์สำหรับคนอื่นในบางจุด

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 การล้างข้อมูลทั้งหมดเป็นเพียงการวนลูปของพวกเขาทั้งหมดและการล้างทีละอย่าง


2

ฉันไม่รู้ว่าทำไมคำตอบที่โหวตครั้งแรกไม่ทำงานสำหรับฉัน

อย่างที่คำตอบนี้บอกว่า:

ไม่มีวิธีแก้ปัญหา 100% ในการลบคุกกี้เบราว์เซอร์

ปัญหาคือมีการระบุคุกกี้ที่ไม่ซ้ำกันโดยไม่ใช่แค่ชื่อ "คีย์" แต่ยังรวมถึง "โดเมน" และ "เส้นทาง" ด้วย

หากไม่ทราบว่า "โดเมน" และ "เส้นทาง" ของคุกกี้คุณจะไม่สามารถลบได้อย่างน่าเชื่อถือ ข้อมูลนี้ไม่สามารถใช้ได้ผ่าน document.cookie ของ JavaScript ไม่สามารถใช้งานผ่านส่วนหัว HTTP คุกกี้ได้เช่นกัน!

ดังนั้นความคิดของฉันคือการเพิ่มการควบคุมเวอร์ชันคุกกี้ด้วยการตั้งค่าเต็มรูปแบบการรับการลบคุกกี้:

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

สิ่งนี้ช่วยฉันได้หลายชั่วโมง สมควรได้รับการโหวต `` ให้ตอนนี้ = วันที่ใหม่ (0); `` let expireTime = now.getTime(); now.setTime(expireTime); document.cookie =document.cookie+';expires='+now.toUTCString()+';path=/'; จะลบคุกกี้ออก
CruelEngine

2

ฉันมีโมดูลควบคุมคุกกี้ที่ซับซ้อนกว่าและมี OOP นอกจากนี้ยังมีdeleteAllวิธีการล้างคุกกี้ที่มีอยู่ทั้งหมด โปรดสังเกตว่าdeleteAllวิธีการเวอร์ชันนี้มีการตั้งค่าpath=/ที่ทำให้การลบคุกกี้ทั้งหมดภายในโดเมนปัจจุบัน หากคุณต้องการลบคุกกี้ออกจากขอบเขตเท่านั้นคุณจะต้องอัพเกรดวิธีนี้โดยเพิ่ม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.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

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()เพื่อล้างคุกกี้ทั้งหมด


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

หลังจากทดสอบวิธีการที่เคยปรากฏในหลาย ๆ รูปแบบของเบราว์เซอร์ในหลายรูปแบบของคุกกี้ฉันพบว่าแทบจะไม่มีอะไรเลยแม้แต่ 50%

โปรดช่วยแก้ไขได้ตามต้องการ แต่ฉันจะโยน 2 เซ็นต์ของฉันที่นี่ วิธีการต่อไปนี้จะแบ่งทุกอย่างลงและสร้างสตริงค่าคุกกี้โดยขึ้นอยู่กับทั้งส่วนการตั้งค่ารวมถึงการสร้างสตริงเส้นทางแบบทีละขั้นตอนโดยเริ่มต้นด้วย/จากหลักสูตร

หวังว่านี่จะช่วยผู้อื่นและฉันหวังว่าการวิจารณ์ใด ๆ อาจมาในรูปแบบของวิธีนี้ที่สมบูรณ์แบบ ตอนแรกฉันต้องการซับ 1 อันที่บางคนหา แต่คุกกี้ JS เป็นหนึ่งในสิ่งเหล่านั้นที่ไม่ได้รับการจัดการอย่างง่ายดาย

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

ไม่ทำงานหรืออย่างน้อยก็ไม่ใช่สำหรับฉัน ... ฉันต้องลบคุกกี้ด้วย HTTP
adelriosantiago

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 ()
Ruchira

-1

ฉันพบปัญหาใน IE และ Edge เว็บเบราว์เซอร์ (Chrome, ซาฟารี) ดูเหมือนจะให้อภัยมากกว่า เมื่อตั้งค่าคุกกี้ให้ตั้งค่า "เส้นทาง" เป็นบางสิ่งเสมอเนื่องจากค่าเริ่มต้นจะเป็นหน้าเว็บที่ตั้งค่าคุกกี้ ดังนั้นหากคุณพยายามหมดอายุในหน้าอื่นโดยไม่ระบุ "เส้นทาง" เส้นทางจะไม่ตรงกันและจะไม่หมดอายุ document.cookieมูลค่าไม่แสดงเส้นทางหรือการหมดอายุของคุกกี้ดังนั้นคุณจึงไม่สามารถได้รับมาที่คุกกี้ถูกกำหนดโดยดูที่ค่า

หากคุณต้องการหมดอายุคุกกี้จากหน้าต่าง ๆ ให้บันทึกเส้นทางของหน้าการตั้งค่าในค่าคุกกี้เพื่อให้คุณสามารถดึงออกมาในภายหลังหรือผนวก"; path=/;"เข้ากับค่าคุกกี้เสมอ จากนั้นจะหมดอายุจากหน้าใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.