Добавление при загрузке, если файл cookie существует

#javascript #jquery #cookies

#javascript #jquery #файлы cookie

Вопрос:

У меня есть a div , который содержит несколько a тегов, каждый из которых содержит уникальный href атрибут. Каждая ссылка помечается галочкой при нажатии. Я пытаюсь настроить сеансовый файл cookie для клика, чтобы при переходе пользователя от страницы к странице и обратно флажок, указывающий на переход по ссылке, все еще присутствовал. Я настроил array ( strArray ), который хранит файлы cookie, преобразуя history объект в строку и используя .push() метод, для проверки по массиву hrefs , сгенерированному с помощью:

 var urlArray = $(".holder a").map(function() {
  return $(this).attr("href");
}).get();
  

Я не могу понять, почему strArray он постоянно переписывается при нажатии на ссылку или если мой скрипт достигает желаемого результата, то есть, если он фактически добавляет ссылки после перехода со страницы и обратно. Кто-нибудь может указать мне правильное направление?

Смотрите мою скрипку здесь: https://jsfiddle.net/tfrx9tyf/19 /

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

1. возникает ли эта проблема только в jsfiddle или когда вы запускаете его и на своем собственном компьютере?

2. для этого рекомендуется использовать localStorage или sessionStorage. Файлы cookie имеют низкие ограничения на хранение, а также отправляются на сервер с каждым запросом, добавляя дополнительную полезную нагрузку

Ответ №1:

Как упоминал charlietfl, localstorage лучше подходит для этого, вот как я бы это сделал:

Рабочий jsFiddle

HTML:

 <a href="https://somesite/index.php" class="remember-links">some link</a>
<br>
<a href="https://somesite/home.php" class="remember-links">some other link</a>
<br>
<button class="remove-remembered">Remove remembered </button>
  

js

 /**
 * Feature detect   local reference for simple use of local storage
 * if (storage) {
 *    storage.setItem('key', 'value');
 *    storage.getItem('key');
 * }
 *
 */
var storage;
var fail;
var uid;
try {
  uid = new Date;
  (storage = window.localStorage).setItem(uid, uid);
  fail = storage.getItem(uid) != uid;
  storage.removeItem(uid);
  fail amp;amp; (storage = false);
} catch (exception) {}
/* end  Feature detect   local reference */




$(document).on('click', '.remember-links', function(e) {
  var $this = $(this);
  if (storage) {
    var thisLink = $this.attr('href'); // get the clicked href
    var links = storage.getItem('rememberedLinks'); // get all the previously clicked links as a string
    links = (!links || links == '') ? [] : links.split('||'); // if present, split the links into an array, or just make an empty array
    if ($.inArray(thisLink, links) === -1) links.push(thisLink); // if the link is not already in the list, add it
    console.log(links);
    links = links.join('||'); // join the array into a string sepparated by a string not likely to appear in an actuall link "||"
    storage.setItem('rememberedLinks', links); // store the new value
    $this.addClass('remembered');
  } 
});


$(document).on('click', '.remove-remembered', function(e) {
  if (storage) {
    storage.setItem('rememberedLinks', '');
    $('.remembered').removeClass('remembered');
  }
});

function checkLinks() {
  if (storage) {
    var links = storage.getItem('rememberedLinks') || ''; // get all the previously clicked links as a string
    console.log(links);
    links = (!links || links == '') ? [] : links.split('||'); // if present, split the links into an array, or just make an empty array
    console.log(links);
    $('.remember-links').each(function() {
      var $this = $(this);
      var thisLink = $this.attr('href'); // get the current href 
      if ($.inArray(thisLink, links) > -1) $this.addClass('remembered'); // if remembered, do something with the link in the dom
    });
  }
}



// on load, check the links to see if they need to be marked.
$(function() {
  checkLinks();
});