【问题标题】:How to remove array objects from localStorage using dynamic buttons? [JS only]如何使用动态按钮从 localStorage 中删除数组对象? [仅限JS]
【发布时间】:2017-11-27 23:47:23
【问题描述】:

这里是 JS 新手,已经为此苦苦挣扎了几个小时。

所以我创建了一个带有按钮的待办事项列表,该按钮将对象存储在 localStorage 内的数组中,还创建了带有内容和删除按钮的动态列表项。每当我单击删除按钮时,它都会删除动态列表项,但不会将其从 localStorage 中删除。我不知道如何将每个按钮分配给 localStorage 中的特定数组索引。

https://codepen.io/jupiterisland/pen/ooPXWV

  var taskList = []; //build array

  if(localStorage.taskList){ //call func to recreate li's on refresh
    taskList = JSON.parse(localStorage.taskList) || [];
    createTasks(taskList)
  }

  function submitFunc() {
    var task = { //build objects
      desc: document.getElementsByTagName("textarea")[0].value,
      date: document.getElementsByTagName("input")[0].value,
      time: document.getElementsByTagName("input")[1].value,
      important: document.getElementsByTagName("input")[1].checked
    };

    if(task.desc && task.date !== ""){
      taskList[taskList.length] = task;  //put objects inside array
      localStorage.taskList = JSON.stringify(taskList); //store array with stringify
      newTaskList = JSON.parse(localStorage.taskList); //retrieve array with parse

      createTasks(newTaskList)

      document.getElementById("error").style.display = "none";
      return false; //prevent submit
    } else {
        document.getElementById("error").style.display = "block";
        document.getElementById("error").innerHTML = "Please enter a task description and a date.";
        return false;
    }
  }

  function createTasks (newTaskList){

    for (i = 0; i < newTaskList.length; i++) { // display objects in list items

      var currentTask = newTaskList[i];
      var taskIndex = newTaskList.indexOf(currentTask);
      newElement();

      function newElement() {
        var liNode = document.createElement("li");
        var titleNode = document.createElement("h3");
        var dNode = document.createElement("p");
        var tNode = document.createElement("p");
        var delNode = document.createElement("button")

        liNode.className = "liNode";
        titleNode.className = "titleNode";
        dNode.className = "dNode";
        tNode.className = "tNode";
        delNode.className = "delete";
        delNode.innerText = "Delete";

        var titleText = newTaskList[i].desc;
        var dateText = newTaskList[i].date;
        var timeText = newTaskList[i].time;

        var descNode = document.createTextNode(titleText);
        var dateNode = document.createTextNode(dateText);
        var timeNode = document.createTextNode(timeText);

        titleNode.appendChild(descNode);
        dNode.appendChild(dateNode);
        tNode.appendChild(timeNode);
        liNode.appendChild(titleNode);
        liNode.appendChild(dNode);
        liNode.appendChild(tNode);
        liNode.appendChild(delNode);

        document.getElementById("taskBoard").appendChild(liNode);

        if (taskBoard.childElementCount > newTaskList.length) { //remove excess divs
          for (n = 0; taskBoard.childElementCount - 2; n++) {
            taskBoard.removeChild(taskBoard.firstChild);
          }
        }

          function deleteTasks(){
            var listItem = this.parentNode;
            var ul = listItem.parentNode;
            ul.removeChild(listItem);
          }
        delNode.addEventListener("click", deleteTasks);
      }
    }
  }



 
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
    <h1>My Task Board</h1>
     <div class="container">
     <form onsubmit="return submitFunc()">
     <div>
       <label for="">Task:</label>
       <textarea name="name" rows="8" cols="80"placeholder="Please enter your task description"></textarea>
      </div>
      <div>
       <label for="">Deadline:</label>
       <input type="date" placeholder="Choose a date">
       <input type="time" placeholder="Set time">
      </div>
      <div>
       <label for="">Important:</label>
       <input type="checkbox" name="" value="">
       </div>
       <button type="submit" name="button">Add Task</button>
       <div id="error"></div>
     </form>
     </div>
 
     <div>
      <ul id="taskBoard"></ul>
     </div>
</body>
</html>

【问题讨论】:

    标签: javascript arrays dynamic local-storage


    【解决方案1】:
    var taskList = []; //build array
    
      if(localStorage.taskList){ //call func to recreate li's on refresh
        taskList = JSON.parse(localStorage.taskList) || [];
        createTasks(taskList)
      }
    function fakeGuid() {
      function s4() {
        return Math.floor((1 + Math.random()) * 0x10000)
          .toString(16)
          .substring(1);
      }
      return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
        s4() + '-' + s4() + s4() + s4();
    }
      function submitFunc() {
        var task = { //build objects
          desc: document.getElementsByTagName("textarea")[0].value,
          date: document.getElementsByTagName("input")[0].value,
          time: document.getElementsByTagName("input")[1].value,
          important: document.getElementsByTagName("input")[1].checked,
          id :fakeGuid()
        };
    
        if(task.desc && task.date !== ""){
          taskList[taskList.length] = task;  //put objects inside array
          localStorage.taskList = JSON.stringify(taskList); //store array with stringify
          newTaskList = JSON.parse(localStorage.taskList); //retrieve array with parse
    
          createTasks(newTaskList)
    
          document.getElementById("error").style.display = "none";
          return false; //prevent submit
        } else {
            document.getElementById("error").style.display = "block";
            document.getElementById("error").innerHTML = "Please enter a task description and a date.";
            return false;
        }
      }
    
      function createTasks (newTaskList){
    
        for (i = 0; i < newTaskList.length; i++) { // display objects in list items
    
          newElement(i);
    
          function newElement(currentIndex) {
            var liNode = document.createElement("li");
            var titleNode = document.createElement("h3");
            var dNode = document.createElement("p");
            var tNode = document.createElement("p");
            var delNode = document.createElement("button")
    
            liNode.className = "liNode";
            titleNode.className = "titleNode";
            dNode.className = "dNode";
            tNode.className = "tNode";
            delNode.className = "delete";
            delNode.innerText = "Delete";
    
            var titleText = newTaskList[i].desc;
            var dateText = newTaskList[i].date;
            var timeText = newTaskList[i].time;
    
            var descNode = document.createTextNode(titleText);
            var dateNode = document.createTextNode(dateText);
            var timeNode = document.createTextNode(timeText);
    
            titleNode.appendChild(descNode);
            dNode.appendChild(dateNode);
            tNode.appendChild(timeNode);
            liNode.appendChild(titleNode);
            liNode.appendChild(dNode);
            liNode.appendChild(tNode);
            liNode.appendChild(delNode);
    
            document.getElementById("taskBoard").appendChild(liNode);
    
            if (taskBoard.childElementCount > newTaskList.length) { //remove excess divs
              for (n = 0; taskBoard.childElementCount - 2; n++) {
                taskBoard.removeChild(taskBoard.firstChild);
              }
            }
              function deleteTasks(node, currentTask) {
                var listItem = node.parentNode;
                var ul = listItem.parentNode;
                ul.removeChild(listItem);
                taskList = taskList.filter(function(t) {
                  return t.id !== currentTask.id;
              });
                localStorage.taskList = JSON.stringify(taskList); //store array with stringify
              }
               var currentTask = newTaskList[currentIndex];
            delNode.addEventListener("click", () => deleteTasks(delNode, currentTask));
          }
        }
      }
    
    • 不要尝试使用索引来操作 DOM 元素。而是使用某种唯一 ID。在这种情况下,我创建了一个虚假的 GUID。
    • 阅读更多关于关闭的信息。您无法将索引向下传递给函数的原因是索引绑定到另一个上下文。
    • 有什么理由对本地存储的 JSON 进行字符串化?您可以简单地存储一个数组。

    【讨论】:

    • 感谢您的回复!我试过这段代码,但现在当我添加 2 个任务并删除它们时,由于某种原因它只删除了 1 个......
    • @user8477893 只是一个小错误 :) 我修复了它
    • 谢谢! tbh 你添加的整个数学对于我的水平来说太复杂了,我不确定我是否理解它,但我会尽力而为
    • @user8477893 没什么太复杂的。只需确保在创建它们时每个都有唯一的 ID。只要您确保它是独一无二的,它就可以是您定义的任何东西!在这种情况下,它只是一堆很可能是唯一的随机字符串
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多