Увеличение значения Cookie в Javascript при каждом обновлении

#javascript #increment

Вопрос:

У меня возникла проблема, из-за которой я хочу, чтобы значение моего файла cookie увеличивалось на 1 каждый раз, когда я загружаю страницу. В настоящее время я могу увеличить значение на 1, но поскольку переменная values вызывается в начале, она продолжает сбрасываться при каждом посещении.

 var cName = "Cookie Value";
var cValue = 0, expDays = 10;
let cookies = document.cookie;
        
function buildCookie(cName, cValue, expDays) {
    let date = new Date();
    date.setTime(date.getTime()   (expDays * 24 * 60 * 60 * 1000));
    const expires = "expires="   date.toUTCString();
    document.cookie = cName   "="   cValue   "; "   expires   "; path=/";
}

function setToZero() {
    buildCookie(cName, cValue=0, expDays);
    console.log('Cookie set to 0');
}

function wholePackage() {
    if (cookies == null) {
        setToZero();
    } else {
        if (cValue >= 0) {
            cValue = cValue   1;
            buildCookie(cName, cValue, expDays);
            console.log('Cookie to set to '   cValue);
        }
    }
}

wholePackage()
 

Любая помощь будет признательна, спасибо.

Комментарии:

1. Если у вас есть файл cookie, вы должны прочитать cValue его вместо использования значения по умолчанию. Вы также должны правильно проанализировать document.cookie , чтобы получить из него значение.

Ответ №1:

Проблема здесь в том, что вы сбрасываете счетчик при каждой загрузке страницы, потому что вы не читаете текущее сохраненное значение внутри document.cookie .

Сначала вы должны прочитать текущее значение, а затем увеличить его на 1.

Чтобы прочитать текущее значение свойства внутри document.cookie , вы можете сделать что-то вроде этого:

 const prop = document.cookie.split("; ").map(prop => prop.split("=")).find(prop => prop[0] === cName)
if (prop) {
    console.log('Current counter:', prop[1])
}
 

Код очень наивен, но он должен дать вам отправную точку.

Если что-то не ясно, пожалуйста, дайте мне знать.

Комментарии:

1. Спасибо, это вывело меня на правильный путь!

2. Я рад, что помог вам. Пожалуйста, подумайте о том, чтобы принять один из ответов как правильный, чтобы помочь будущим людям быстро найти решение.

Ответ №2:

В wholePackage методах вам нужно получить значение файла cookie и преобразовать его в число с помощью кода ниже:

  document.cookie.split("; ")[0].split("=")[1]
 

Это полный код:

 var cName = "Cookie Value";
var cValue = 0, expDays = 10;
let cookies = document.cookie;

function buildCookie(cName, cValue, expDays) {
    let date = new Date();
    date.setTime(date.getTime()   (expDays * 24 * 60 * 60 * 1000));
    const expires = "expires="   date.toUTCString();
    document.cookie = cName   "="   cValue   "; "   expires   "; path=/";
}

function setToZero() {
    buildCookie(cName, cValue = 0, expDays);
    console.log('Cookie set to 0');
}

function wholePackage() {
    if (!cookies) {
        setToZero();
    } else {
        if (cValue >= 0) {
            cValue =  document.cookie.split("; ")[0].split("=")[1]   1;
            buildCookie(cName, cValue, expDays);
            console.log('Cookie to set to '   cValue);
        }
    }
}

wholePackage()
 

Комментарии:

1. Да, спасибо вам за вашу помощь! Есть ли способ, которым я должен отметить это решение?

Ответ №3:

  1. Если вы хотите установить значение файла cookie для каждой загрузки страницы, то начальное значение должно быть 1. Не равно нулю. Итак, это не сетТоЗеро, это должен быть Сеттоун. Поэтому установите начальное значение cValue = 1.
  2. В функции wholePackage вы проверяете, является ли значение C больше или равно 0. Если это правда, вы устанавливаете для файла cookie значение 0. Что неверно в двух отношениях. значение C всегда равно 0 в начале. Таким образом, он не может стать выше. b. Даже если вам каким — то образом удастся увеличить значение C (например, с помощью базы данных), оно все равно больше 0 и снова делает файл cookie 0.



Итак, вам нужно проверить, существует ли файл cookie. Если файл cookie с именем cName существует, он будет установлен в старый файл cookie 1. В противном случае установите значение равно нулю.

  1. Вы не можете проверить значение файла cookie с помощью этого кода
 cookies = document.cookie
 

Вместо этого запишите эту функцию, чтобы проверить, существуют ли файлы cookie,

 function getCookie(name) {
    var dc = document.cookie;
    var prefix = name   "=";
    var begin = dc.indexOf("; "   prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else
    {
        begin  = 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
        end = dc.length;
        }
    }
    return decodeURI(dc.substring(begin   prefix.length, end));
} 
 

Тогда функция wholePackage будет выглядеть следующим образом,

 
let cookies = getCookie(cName);

function wholePackage() {
    
    if (cookies == null) {
        setToOne();
    } else {
            cValue = cookies   1;
            buildCookie(cName, cValue, expDays);
            console.log('Cookie to set to '   cValue);
        }
    }
}

 
  1. В функции buildCookie имя параметров не может совпадать с именем вашей ранее объявленной переменной. Это плохо. cName, cValue уже объявлено в начале.
  2. Вам не нужна дата истечения срока действия в качестве параметра, так как вы создаете их внутри функции.

Вот полный фиксированный код,

 
var cName = "Cookie Value";
var cValue = 1;

function getCookie(name) {
    var dc = document.cookie;
    var prefix = name   "=";
    var begin = dc.indexOf("; "   prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else
    {
        begin  = 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
        end = dc.length;
        }
    }
    return decodeURI(dc.substring(begin   prefix.length, end));
} 

let cookies = getCookie(cName);
        
function buildCookie(cname, cvalue) {
    let date = new Date();
    date.setTime(date.getTime()   (expDays * 24 * 60 * 60 * 1000));
    const expires = "expires="   date.toUTCString();
    document.cookie = cname   "="   cvalue   "; "   expires   "; path=/";
}

function setToOne() {
    buildCookie(cName, cValue);
    console.log('Cookie set to 1');
}

function wholePackage() {
    
    if (cookies == null) {
        setToOne();
    } else {
            cValue = cookies   1;
            buildCookie(cName, cValue);
            console.log('Cookie to set to '   cValue);
        }
    }
}


wholePackage()

 

Комментарии:

1. Спасибо, это было невероятно полезно!

2. Проверьте код еще раз, я исправил еще кое-какой код в недавней правке