Очистка всех файлов cookie с помощью JavaScript
Как удалить все файлы cookie для текущего домена с помощью JavaScript?
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 почти точно так же, как Зак интересно, как переполнение стека помещает их рядом друг с другом.
edit: nvm, который был временным, по-видимому
решил, что поделюсь этим методом для очистки cookies. Возможно, это может быть полезно для кого-то еще в какой-то момент.
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}`;
}, "");
}
Примечание: не обрабатывает пути
Я не знаю, почему первый проголосовал за ответ не работает для меня.
As ответ сказал:
нет 100% решения для удаления файлов cookie браузера.
проблема в том, что cookies однозначно идентифицируются не только по их ключевому "имени", но и по их "домену" и "пути".
Не зная "домен" и "путь" 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=;';
}
}
после тестирования почти всегда метода, перечисленного в нескольких стилях браузеров на нескольких стилях cookies, я обнаружил, что здесь почти ничего не работает даже 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);
}
ваниль 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) кажутся более прощающими. При настройке файлов cookie всегда устанавливайте "путь" к чему-либо, потому что по умолчанию будет страница, которая устанавливает файл cookie. Поэтому, если вы попытаетесь истечь его на другой странице без указания "пути", путь не будет совпадать, и он не истечет. The document.cookie
value не показывает путь или срок действия для cookie, поэтому вы не можете получить, где cookie был установлен, посмотрев на значение.
Если вам нужно истечь куки с разных страниц, сохраните путь к странице настроек в значении куки, чтобы вы могли вытащить его позже или всегда добавлять "; path=/;"
значения cookie. Тогда он истечет с любой страницы.