Массив localStorage не сохраняет данные, если сделать refresh страницы

249
22 марта 2018, 10:45

Есть форма, в нее пользователь вписывает данные и они сохраняются в localStorage массиве под названием todo. Данные вписанные в форму оказываются в ul li списке. Я проверяю в консоли и они действительно добавляются в массив todo, но после обновления страницы данные исчезают из списка li пропадает и из массива todo тоже. Я думаю проблема либо в самом начале кода, где создается массив, либо в dataObjectUpdated(). Вопрос - как сделать, так чтобы данные сохранялись в массиве и refresh страницы на них не влиял. Решение желательно на чистом js

var content = { 
  todo: [], 
  completed: [], 
  uncompleted: [] 
}; 
var create = localStorage.setItem('todoList', JSON.stringify(content)); 
var data = JSON.parse(localStorage.getItem('todoList')); 
 
var button = document.getElementById('button'); 
button.onclick = function() { 
  var input = document.getElementById('input').value; 
  if (input) { 
    addItem(input); 
  } 
}; 
 
var input = document.getElementById('input'); 
input.onkeypress = function(e) { 
  if (e.keyCode === 13) { 
    button.click(); 
    return false; 
  } 
}; 
 
renderTodoList(); 
 
function renderTodoList() { 
  for (var i = 0; i < data.todo.length; i++) { 
    var value = data.todo[i]; 
    addItemToDOM(value); 
  } 
} 
 
function addItem(value) { 
  addItemToDOM(value); // функции нет (для экономии места) 
  document.getElementById('input').value = ''; 
 
  data.todo.push(value); 
  dataObjectUpdated(); 
} 
 
function dataObjectUpdated() { 
  localStorage.setItem('todoList', JSON.stringify(data)); 
}
<div id="container"> 
  <header> 
    <h1>ToDoList</h1> 
  </header> 
 
  <div id="main"> 
    <input id="input" maxlength="40" type="text" placeholder="New task"> 
    <button id="button">ADD</button> 
    <button id="clear_all">Clear all</button> 
  </div> 
 
  <div id="list"> 
    <ul id="include"></ul> 
  </div> 
</div>

Answer 1

Проследите логику того, что делается в этих трех строчках:

var content = {todo:[], completed:[], uncompleted:[]};
var create = localStorage.setItem('todoList', JSON.stringify(content));
var data = JSON.parse(localStorage.getItem('todoList'));

Вы создаете пустой content, сохраняете его в localStorage и тут же читаете оттуда в data.

Вот как надо:

var data = {todo:[], completed:[], uncompleted:[]};
var stored = localStorage.getItem('todoList');
if (stored)
  data = JSON.parse(stored);
READ ALSO
Как превратить строку utf-16 в верстку

Как превратить строку utf-16 в верстку

Нужно динамически рендерить элементы в браузереС сервера приходит верстка в юникоде

198
Не работает изменение стиля метки

Не работает изменение стиля метки

Здравствуйте, не работает изменение стиля метки, а именно свойство preset

207
не работает функция JS

не работает функция JS

Нужно чтобы функция возвращала false если в password найдено одно из значений linesArray, чтобы цикл проверял каждое значение массива, но почему что...

242
В чем смысл условия во второй строке?

В чем смысл условия во второй строке?

По условию нужно создать функцию addClass(obj, cls), которая добавляет в список класс cls, но только если его там еще нет и она не должна добавлять лишних...

200