Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не запоминает localstorage (https://javascript.ru/forum/jquery/67320-ne-zapominaet-localstorage.html)

Nezumi.May 10.02.2017 15:02

Не запоминает localstorage
 
Всем добра, господа знатоки. Суть такова: Имеется код плеера с сериями вида:


<div class="block1">
<a onclick="vidLoc('url_video','1','0')">1</a>
<a onclick="vidLoc('url_video','1','0')">2</a>
<a onclick="vidLoc('url_video','1','0')">3</a>
<a onclick="vidLoc('url_video','1','0')">4</a>
</div>


Имеется блок, содержащий id конкретной страницы:
<div class="wrapper" id="id123"></div>


И скрипт, который находит значение этого уникального id для каждой страницы и используется для запоминания состояния нажатой серии.
$(function(){
var indxid = $(".wrapper:first").attr('id');
var a=$(".block1 > a"),indxid=localStorage.getItem("indxid");
   a.on("click",function(){a.not($(this).addClass("eps")).removeClass("eps");
      $(".eps").parent().css( "display", "block");
      indxid=a.index(this);
      $(".nezapomn").removeClass("nezapomn").addClass("zapomn");
      document.getElementById('zapominalka').innerHTML = "Забыть серию";
      localStorage.setItem("indxid",indxid)});
   indxid!==null&&a.eq(indxid).click();
});


Запоминалка работает, но не так как нужно: если на одной странице я выберу серию 1, то на другой странице тоже будет выбрана серия 1. Получается, что нет уникального ключа для localstorage, а как мне его тогда задать?!

laimas 10.02.2017 16:34

Но почему используется индекс набора, а не уникальный id?

Nezumi.May 10.02.2017 16:47

Цитата:

Сообщение от laimas (Сообщение 443931)
Но почему используется индекс набора, а не уникальный id?

Поясните? Было перебрано много вариантов, главным из которых было использовать уникальный id со страницы в качестве ключа для localstorage, а содержимое ключа = индекс ссылки, которая была нажата.

Причём в таком виде всё работает как надо:
$(function(){
var a=$(".block1 > a"),btn=$(".btn"),indx$ID$=localStorage.getItem("indx$ID$");
   a.on("click",function(){a.not($(this).addClass("eps")).removeClass("eps");
      $(".eps").parent().css( "display", "block");
      indx=a.index(this);
      var indxid = $(".wrapper:first").attr('id');
      localStorage.setItem("indx$ID$",indx)});
   indx$ID$!==null&&a.eq(indx$ID$).click();
alert (indx$ID$)
});


Где $ID$ - порядковый номер материала. Но мне нужно добавить код удалённо (<script src="url.js"></script>), а не на странице эту страсть хранить. И тут-то нашла коса на камень.

laimas 10.02.2017 16:52

Цитата:

Сообщение от Nezumi.May
Имеется блок, содержащий id конкретной страницы:
<div class="wrapper" id="id123"></div>
И скрипт, который находит значение этого уникального id для каждой страницы и используется для запоминания состояния нажатой серии.

А a.index(this) - это индекс элемента в наборе. Ну если нужно использовать id, значит

localStorage["indx$ID$"] = this.id


Или причем тут тогда уникальность?

laimas 10.02.2017 16:56

Пока писал, добавлено действительно по ID.

Цитата:

Сообщение от Nezumi.May
Но мне нужно добавить код удалённо

И проблема с чем, с идентификаторами которых не будет при этом в скрипте?

Nezumi.May 10.02.2017 17:01

Цитата:

Сообщение от laimas (Сообщение 443936)
А a.index(this) - это индекс элемента в наборе. Ну если нужно использовать id, значит

localStorage["indx$ID$"] = this.id


Или причем тут тогда уникальность?

Просто этот индекс распространяется на все страницы. Если на странице номер 1 выбрана серия 1, то на странице номер 2 тоже будет выбрана серия 1. И я не понимаю как сделать так, чтобы на стр.1 была серия 25, а на стр.2 была, например, 3 серия.

С помощью id страницы собиралась сделать уникальным ключ localstorage, чтобы для каждой страницы был свой ключ, со своим значением index. Не получается внешним файлом никак.

Nezumi.May 10.02.2017 17:04

Цитата:

И проблема с чем, с идентификаторами которых не будет при этом в скрипте?
Да, во внешнем файле нет $ID$, а его значение пыталась получить через var indxid = $(".wrapper:first").attr('id');

laimas 10.02.2017 17:21

Цитата:

Сообщение от Nezumi.May
Если на странице номер 1 выбрана серия 1, то на странице номер 2 тоже будет выбрана серия 1. И я не понимаю как сделать так, чтобы на стр.1 была серия 25, а на стр.2 была, например, 3 серия.

Вот что. Ну так для этого и индексов хватит, но вкупе с другим параметром. То есть нужно запоминать страницу и выбранный на ней индекс.

Nezumi.May 10.02.2017 17:26

Цитата:

Сообщение от laimas (Сообщение 443945)
Вот что. Ну так для этого и индексов хватит, но вкупе с другим параметром. То есть нужно запоминать страницу и выбранный на ней индекс.

Наверное, я не так хорошо в этом разбираюсь. Просто не понимаю почему так работает:

$(function(){
var a=$(".block1 > a"),btn=$(".btn"),indx$ID$=localStorage.getItem("indx$ID$");
   a.on("click",function(){a.not($(this).addClass("eps")).removeClass("eps");
      $(".eps").parent().css( "display", "block");
      indx=a.index(this);
      var indxid = $(".wrapper:first").attr('id');
      localStorage.setItem("indxid",indx)});
   indx$ID$!==null&&a.eq(indx$ID$).click();
});


А во внешнем файле нет:

$(function(){
var mat = $(".wrapper:first").attr('id');
var a=$(".block1 > a"),btn=$(".btn"),indxid=localStorage.getItem("indx+mat");
   a.on("click",function(){a.not($(this).addClass("eps")).removeClass("eps");
      $(".eps").parent().css( "display", "block");
      indxid=a.index(this);
      localStorage.setItem("indx+mat",indxid)});
   indx+mat!==null&&a.eq(indx+mat).click();
});

laimas 10.02.2017 17:36

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

<div id="уникальный на каждой странице" class="block1">

то в хранилище нужно держать один объект, в котором будут храниться данные как id=>index. Естественно что при записи сохраняем его в JSON, а при получении получаем из него объект.

Nezumi.May 10.02.2017 17:44

в JSON - это как? Можно пример?

laimas 10.02.2017 18:30

var _mem = localStorage; 
$(function() {
var itm = $(".wrapper:first").attr('id'),
    btn = $(".btn"),
    idx = !!_mem['items'] && JSON.parse(_mem['items']) || {},
    
    a = $(".block1 a").on("click", function() {
        a.not($(this).addClass("eps")).removeClass("eps");
        $(".eps").parent().css( "display", "block");
        idx[itm] = a.index(this);
        _mem['items'] = JSON.stringify(idx);
    });
    
    if(idx) a.eq(idx[itm]).trigger('click');
});

Nezumi.May 10.02.2017 18:45

Цитата:

Сообщение от laimas (Сообщение 443953)
var _mem = localStorage; 
$(function() {
var itm = $(".wrapper:first").attr('id'),
    btn = $(".btn"),
    idx = !!_mem['items'] && JSON.parse(_mem['items']) || {},
    
    a = $(".block1 a").on("click", function() {
        a.not($(this).addClass("eps")).removeClass("eps");
        $(".eps").parent().css( "display", "block");
        idx[itm] = a.index(this);
        _mem['items'] = JSON.stringify(idx);
    });
    
    if(idx) a.eq(idx[itm]).trigger('click');
});

Благодарю! То есть это наиболее оптимальный вариант?
И не могли бы Вы подсказать, как удалить запоминание на конкретной странице при клике по <button id="zapominalka">?

Извиняюсь, но я правда ничего не понимаю в JSON, только начинаю вникать в эту тему. Своими силами уже весь день прошёл, можно сказать, впустую.

laimas 10.02.2017 19:23

Цитата:

Сообщение от Nezumi.May
То есть это наиболее оптимальный вариант?

Ну а как еще?

Цитата:

Сообщение от Nezumi.May
как удалить запоминание на конкретной странице при клике по <button id="zapominalka">?

$('#zapominalka').click(function() {
        delete idx[id]; 
      //где id это ключ который надо удалить, 
      //если речь о текущей странице
      //значит это будет ранее определенная переменная itm
      //если выбирать из набора страниц, значит надо передавать в это обработчик ключ старнцы
      //или ключи, если выбор из списка  
        _mem['items'] = JSON.stringify(idx);
})

Nezumi.May 10.02.2017 20:19

Большое спасибо! После долгих мучений наконец-то получилось так, как нужно.

laimas 10.02.2017 20:28

Цитата:

Сообщение от Nezumi.May
После долгих мучений наконец-то получилось так, как нужно.

Хотя конечно объем хранимых данных небольшой, но "мода" запихнуть все в хранилище набирает обороты, и кто его знает, вдруг более ушлые заняли своим все хранилище. ) По логике вещей это нужно проверять.

Вообще-то локальное хранилище не единственное у браузера, есть еще и сессионное.

Nezumi.May 10.02.2017 20:40

Цитата:

Сообщение от laimas (Сообщение 443976)
Хотя конечно объем хранимых данных небольшой, но "мода" запихнуть все в хранилище набирает обороты, и кто его знает, вдруг более ушлые заняли своим все хранилище. ) По логике вещей это нужно проверять.

Вообще-то локальное хранилище не единственное у браузера, есть еще и сессионное.

Эта примочка "временная" для тех случаев, когда случайно перешёл на другую страницу и потерял данные. Статьи пишут давно, а информации про это дело очень мало. Вроде как 5мб на каждый сайт, каждому браузеру, хранить такие данные как в моём случае (в несколько символов) кажется более чем достаточно, разве нет?

Впрочем, не уверена, что на каждый сайт 5мб, но кто-то такую информацию распространил. А про сессионные совсем ничего не слышала.

laimas 10.02.2017 21:30

Цитата:

Сообщение от Nezumi.May
Вроде как 5мб на каждый сайт

Да, правда IE под него выводит вроде бы 10. Ну если более нет идей впихнуть на все 100% в хранилище, тогда да, можно не бояться. )

Сессионное хранилище (sessionStorage) тоже самое за исключением того, что не зависит от домена и работает в приделах окна, то есть открыли окно - сессия, закрыли окно - сессия умерла. Для одной и той же страницы открытой в разных окнах/вкладках будет создаваться своя сессия. Поэтому если временно нужно, то лучше сессионное хранилище. Все методы работы с ним те же самые что и у локального хранилища.

Nezumi.May 13.02.2017 22:05

laimas, Спасибо за разъяснения. sessionStorage самое то использовать для запоминания в форме комментариев или на форуме. Надо взять на заметку.


Часовой пояс GMT +3, время: 10:16.