Печенье Threeway

Я создаю всплывающее окно с тремя кнопками! Каждой кнопке необходимо установить файл cookie, но с другим временем истечения срока действия. Я использую jquery.cookie для этого!

  • 1 кнопка - больше cookie сеанса. Поэтому при нажатии этой кнопки всплывающее окно должно исчезнуть и снова отобразиться при запуске нового экрана браузера. Поэтому НЕ открывать страницу в том же окне браузера и на том же сайте.

  • 1 кнопка предназначена для "Не показывать всплывающее окно снова", которое установит cookie на 7 дней

  • 1 cookie устанавливается в функции AJAX succes и устанавливается в 365 дней.

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

Я не вижу, что я делаю неправильно! Я не получаю никаких консольных ошибок, но файлы cookie просто не будут установлены должным образом.

Что у меня есть:

 $(document).ready(function(){


    var my_cookie = $.cookie('regNewsletter');

    if (!my_cookie) {
      setTimeout(function(){
        $('#newsletter').modal('show');
      }, 1000);
    }
    $(".close--btn").on("click", function () {
      $.cookie('regNewsletter', true, {
        path: '/',
        domain: ''
      });
    });
    $(".dismiss--btn").on("click", function () {
      $.cookie('regNewsletter', true, {
        path: '/',
        domain: '',
        expires: 7
      });
    });
    console.log(my_cookie);

 // code for removing cookie when session ends //
 window.onbeforeunload = function() {
    $.removeCookie('regNewsletter', { path: '/', domain: '' });
 };


 $("#newsletter .btn").click(function(e){
      e.preventDefault();

       $.ajax({
       ... 

        success: function(txt, status, xhr){
       // some code //

              $.cookie('regNewsletter', true, {
                path: '/',
                expires: 365
              });

        // etc etc //


  });

Ответ 1

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

живая демонстрация

$(document).ready(function(){
    var my_cookie = $.cookie('regNewsletter');        
    if (my_cookie && my_cookie=="true") {
      alert("Cookie found");
    } else {
      setTimeout(function(){
        //$('#newsletter').modal('show');
        alert("Popup newsletter");
      }, 1000);
    }
    $(".close--btn").on("click", function () {
      // set a session cookie. It'll be automatically deleted
      // when the browser is closed
      $.cookie('regNewsletter', 'true', {
        path: '/'
      });
      alert("session cookie set");
    });
    $(".dismiss--btn").on("click", function () {
      $.cookie('regNewsletter', 'true', {
        path: '/',
        expires: 7
      });
      alert("cookie set for 7 days");
    });
    console.log(my_cookie);
    $("#newsletter .btn").click(function(e){
       e.preventDefault();
       $.ajax({
         url:"setcookie.html",
         success: function(txt, status, xhr){
           $.cookie('regNewsletter', 'true', {
             path: '/',
             expires: 365
           });
           alert("cookie set for 365 days");
         }
       });
     });
 });

HTML:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="jquery.cookie.js"></script>
<button class="close--btn">close</button>
<button class="dismiss--btn">dismiss</button>
<span id="newsletter"><button class="btn">ajax</button></span>

Ответ 2

Вы можете проверить свои файлы cookie с помощью инструментов разработчика браузера. В Google Chrome это F12 → Ресурсы вверху (только что открывшегося фрейма), Cookies слева.

Я думаю, проблема может заключаться в том, что вы не устанавливаете правильный domain для этих файлов cookie.

Обновление: Еще одна подозрительная вещь - удалить cookie на unolad окна:

window.onbeforeunload = function() {
    $.removeCookie('regNewsletter', { path: '/', domain: '' });
};

Вы можете установить его на 7 или 365 дней, но он удаляется при выгрузке окна, потому что у вас нет 3 куки здесь, это тот же файл cookie regNewsletter, который настроен с различными параметрами.

Каждый раз, когда вы его устанавливаете, он перезаписывает предыдущие значения (это, вероятно, то, что вы хотите). Но похоже, что вы не должны его удалять.

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

Ответ 3

Почему у вас есть этот кусок кода?

// code for removing cookie when session ends //
window.onbeforeunload = function() {
   $.removeCookie('regNewsletter', { path: '/', domain: '' });
};

Из вашего вопроса неясно, какие обстоятельства вызывают проблемы, которые вы видите, но я подозреваю, что это часть, если не все, из них.

Точка cookie сеанса заключается в том, что он автоматически удаляется при закрытии браузера. Нет необходимости вручную удалять его.

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

Очевидно, что 7 и 365-дневные выходы также игнорируются по той же причине.

Удалите фрагмент кода, и cookie затем должен сохраняться для соответствующей длины

Ответ 4

jquery-cookie: больше не поддерживается, заменяется JS Cookie: https://github.com/js-cookie/js-cookie

Попробуйте использовать ниже, используя js-cookie

$(document).ready(function(){

    var my_cookie = Cookies.get('regNewsletter');

    if (!my_cookie) {
      setTimeout(function(){
      //  $('#newsletter').modal('show');
      }, 1000);
    }
    $(".close--btn").on("click", function () {
        Cookies.set('regNewsletter', true, { path: '' });
    });
    $(".dismiss--btn").on("click", function () {
        Cookies.set('regNewsletter', true, { expires: 7, path: '' });
    });
    //console.log(my_cookie);


 $("#newsletter .btn").click(function(e){
      e.preventDefault();
        $.ajax({
          method: "POST",
          url: ".....",
          data: YourData
        }).done(function( msg ) {
            Cookies.set('regNewsletter', true, { expires: 365, path: '' });
          });

    });

});

Ответ 5

В вашем коде есть только несколько проблем:

  • Вы можете использовать значение по умолчанию для домена
  • Вам не нужен метод onbeforeunload для удаления сеанса печенье
  • Нет необходимости настраивать слушателей, если присутствует файл cookie.

var my_cookie = $.cookie('regNewsletter');

if (!my_cookie) {

  setTimeout(function() {
    $('#newsletter').modal('show');
  }, 1000);

  // 365 days cookie

  $("#newsletter .btn").click(function(e) {
    e.preventDefault();
    $.cookie('regNewsletter', true, {
      path: '/',
      expires: 365
    });
  });

  // Session cookie

  $(".close--btn").on("click", function() {
    $.cookie('regNewsletter', true, {
      path: '/'
    });
  });

  // 7 days cookie

  $(".dismiss--btn").on("click", function() {
    $.cookie('regNewsletter', true, {
      path: '/',
      expires: 7
    });
  });
}