17 ответов:
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 к файлу cookie.- он не будет удалять куки, которые были установлены с
Pathзначение. (Это несмотря на то, что эти куки появятся вdocument.cookie, но вы не можете удалить его без указания того жеPathзначение, с которым он был установлен.)
один лайнер
в случае, если вы хотите, чтобы вставить ее в быстро...
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=/"); }); })();
после небольшого разочарования в этом я сам сколотил эту функцию, которая будет пытаться удалить именованный файл 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 + ';'; } }Как всегда разные браузеры имеют разное поведение, но это сработало для меня. Наслаждаться.
и вот один, чтобы очистить все куки во всех путях и всех вариантах домена (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(); } } })();
Если у вас есть доступ к jquery.куки плагин, вы можете удалить все куки таким образом:
for (var it in $.cookie()) $.removeCookie(it);
насколько я знаю, нет никакого способа сделать полное удаление любого набора файлов cookie в домене. Вы можете очистить файл cookie, если знаете его имя и если скрипт находится в том же домене, что и файл cookie.
вы можете установить значение пусто и срок годности где-то в прошлом:
var mydate = new Date(); mydate.setTime(mydate.getTime() - 1); document.cookie = "username=; expires=" + mydate.toGMTString();здесь отличная статья здесь о манипулировании файлами cookie с помощью javascript.
проще. Быстрее.
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"; }
ответ зависит как от второго ответа здесь, так и от W3Schools
document.cookie.split(';').forEach(function(c) { document.cookie = c.trim().split('=')[0] + '=;' + 'expires=Thu, 01 Jan 1970 00:00:00 UTC;'; });работает
edit: wow почти точно так же, как интересно, как Zach Stack Overflow помещает их рядом друг с другом.
edit: nvm, который был временным, по-видимому
решил, что я поделюсь этим методом для очистки куки. Возможно, это может быть полезно для кого-то еще в какой-то момент.
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;'; }
вы можете получить список, заглянув в документ.переменная печенья. Очистка их всех-это просто зацикливание на всех из них и очистка их по одному.
вот простой код удалить все cookies в 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()удалить все куки.
функциональный подход + 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}`; }, ""); }Примечание: не обрабатывает пути
Я не знаю, почему первый проголосовал за ответ не работает для меня.
Как ответ сказал:
нет 100% решения для удаления файлов cookie браузера.
проблема в том, что файлы cookie однозначно идентифицируются не только по их ключевому "имени", но и по их "домену" и "пути".
Не зная "домен" и "путь" файл "cookie", вы не можете надежно удалить его. Эта информация не доступна через Документ JavaScript.печенье. Он также недоступен через заголовок 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;'; }
//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=;'; } }
после тестирования почти всегда метод, указанный в нескольких стилях браузеров на нескольких стилях куки, я не нашел почти ничего здесь работает даже 50%.
пожалуйста, помогите исправить по мере необходимости, но я собираюсь бросить свои 2 цента здесь. Следующий метод разбивает все и в основном строит строку значения cookie на основе обоих параметров, а также включает пошаговую сборку строки пути, начиная с
/конечно.надеюсь, это поможет другие и я надеюсь, что любая критика может прийти в форме совершенствования этого метода. Сначала я хотел простой 1-лайнер, как некоторые другие искали, но JS cookies-одна из тех вещей, с которыми не так легко справиться.
;(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 }
Я нашел проблему в IE и Edge. Браузеры Webkit (Chrome, safari) кажутся более снисходительными. При установке куки, всегда устанавливайте "путь" к чему-то, потому что по умолчанию будет страница, которая устанавливает куки. Поэтому, если вы попытаетесь истечь на другой странице без указания "пути", путь не будет совпадать, и он не истечет. Элемент
document.cookieзначение не показывает путь или срок действия для файла cookie, поэтому вы не можете получить, где был установлен файл cookie, глядя на значение.Если вам нужно истечь куки с разных страниц, сохраните путь к странице настроек в значении куки, чтобы вы могли вытащить его позже или всегда добавлять
"; path=/;"значения cookie. Тогда он будет истекать с любой страницы.
Comments