【问题标题】:How to add more items to local storage?如何将更多项目添加到本地存储?
【发布时间】:2018-03-02 08:45:48
【问题描述】:

我刚开始编程,我正在玩这个待办事项列表。现在我想将我的待办事项添加到本地存储中。

但是每次我在列表中添加一个新项目时,我都会覆盖一个并且只做项目。

我该如何解决这个问题?

代码如下:

$(document).ready(function() {
  var data = JSON.parse(localStorage.getItem("todoData"));

  for (var i = 0; i < localStorage.length; i++) {
    $('#thingsTodo').append('<div class="section">' +
      '<li id="listItem" class="blue-text text-darken-2 tooltip">' + data + '<span class="tooltiptext">Click to edit</span></li>' +
      '<i class="small material-icons deleteThisItem">delete</i>' +
      '<div class="divider"></div>');
  }

  $('#addItem').on('click', addItemToList);
  $('#thingsTodo').on('click', '.deleteThisItem', deleteItem);
  $('#thingsTodo').on('click', '#listItem', editItem);

  function addItemToList() {
    var newItem = {
      value: $('#inputField').val()
    };

    if (newItem.value !== '') {

      localStorage.setItem("todoData", JSON.stringify(newItem.value));

      $('#thingsTodo').append('<div class="section">' +
        '<li id="listItem" class="blue-text text-darken-2 tooltip">' + newItem.value + '<span class="tooltiptext">Click to edit</span></li>' +
        '<i class="small material-icons deleteThisItem">delete</i>' +
        '<div class="divider"></div>');
      $('#inputField').val("");
    } else {
      alert("Please make sure you enter something before clicking the button");
    }
  }

  function deleteItem() {
    $(this).closest('.section').remove();
    $(this).closest('.divider').remove();
  }

  function editItem() {
    var newTodoInput = {
      newValue: prompt("Please edit your todo item")
    };


    if (typeof newTodoInput.newValue !== 'object') {
      if (newTodoInput.newValue !== "") {

        $(this).replaceWith('<li id="listItem" class="blue-text text-darken-2 tooltip">' + newTodoInput.newValue + '<span class="tooltiptext">Click to edit</span></li>');
      }

    } else {
      alert("Please make sure you enter something before clicking the button");
    }


  }

});

如果可能,请在我编辑列表项时告诉我如何保存它。

【问题讨论】:

  • 我在发布我的帖子之前确实找到了该帖子,但我似乎无法让它工作......
  • 然后edit您的问题包括您如何在答案中实施建议以及它们如何不起作用。
  • 到目前为止我尝试了 100 件事情......到目前为止我尝试过的所有事情都没有真正保存......所以不是一个真正的选择。对不起
  • 快完成了,我现在有了,所以它可以保存超过 1 项,但它只会保存您上次会话的所有内容。

标签: javascript jquery local-storage


【解决方案1】:

当您创建一个新的待办事项时,您可以将该项目推送到一个全局数组,然后像这样将该数组添加到您的本地存储中。

 var items = [];


 function addItemToList (){
  var input = $('#inputField').val() 
  items.push(input);

  if(input){
    localStorage.setItem("todoData", JSON.stringify(items));

            $('#thingsTodo').append('<div class="section">'+
             '<li id="listItem" class="blue-text text-darken-2 tooltip">'   + item + '<span class="tooltiptext">Click to edit</span></li>'+
                        '<i class="small material-icons deleteThisItem">delete</i>'+
                        '<div class="divider"></div>');

    $('#inputField').val("");
    }else{
      alert("Please make sure you enter something before clicking the button");
 }
}

使用 localStorage.setObj(key, value) 保存数组或对象,使用 localStorage.getObj(key) 像这样检索它

 $(document).ready(function() {
 var storedItems = JSON.parse(localStorage.getItem("toDoData"));

        for(var i = 0; i < storedItems.length; i++) {
                       $('#thingsTodo').append('<div class="section">'+
         '<li id="listItem" class="blue-text text-darken-2 tooltip">'   + storedItems[i] + '<span class="tooltiptext">Click to edit</span></li>'+
                    '<i class="small material-icons deleteThisItem">delete</i>'+
                    '<div class="divider"></div>');
        }
      });

【讨论】:

  • 我似乎无法让它工作。请注意,我的 newInput var 被制成了一个对象。也许如果我将它恢复为正常的变量?我也试过 items.push(newInput.value);
  • 为 addToDoItem 函数复制并粘贴我的代码,它应该可以工作(注意我还没有测试过)。然后在底部是使用 JASON.parse(localStorage.getItem) 将字符串转换回数组来访问该数组。 Localstorage 只能保存字符串这就是您使用 json.stringify 将该数组保存到本地存储的原因。我说数组是解决这个问题的最简单方法。它只需要对如何将项目呈现给 dom 进行一些更改。
  • 对于我在移动设备上的任何拼写错误或格式,我深表歉意
  • 我试图复制并粘贴它,但它不起作用(我猜是其余的代码)。还在玩它......最终会得到它哈哈
  • 哈哈,不用担心 ;) 并感谢到目前为止的帮助
【解决方案2】:

addItemToList 函数中,all 问题始终使用相同的键。它覆盖现有行为是正常行为。您必须将待办事项存储在同一键下的数组中,或者为每个项目使用不同的键。

数组的简化代码。

var initialTodos = [];
localStorage.setItem('todoData', JSON.stringify(initialTodos );

// add item
function addItem(item) {
  var todos = getTodos();
  todos.push(item);
  localStorage.setItem('todoData', JSON.stringify(todos));
}
 // remove get data
function getTodos() {
   return JSON.parse(localStorage.getItem('todoData'));
}
// remove item
function removeItem(item) {
   var todos = getTodos();
   var index = todosFromStorage.indexOf(item);
   if (index >= 0) {
       todos.splice(index, 1);
       localStorage.setItem('todoData', JSON.stringify(todos));
   }
}

如果您想使用不同的值。 为每个项目添加一个唯一的 id 字段并将其用作键。

localStorage.setItem("todoData" + Date.now(), JSON.stringify(newItem.value));

注意:不要对 localStorage 字段使用迭代,因为您可能还会存储其他类型的数据。

【讨论】:

  • 我尝试实现上述。但我得到一个错误 data.push() is not a function。我也可以在不更改 90% 的代码的情况下实现这一点吗?一定是其他方式吧?
  • 如果您的代码中没有 3 个名为 data 的不同范围的变量,这可能会有所帮助。
  • 我只有一个名为数据的变量?仅在我的 localstorage.get 代码的顶部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多