LocalStorage удаляет неправильное значение - PullRequest
0 голосов
/ 21 ноября 2018

У меня снова и снова возникает одна и та же проблема: когда я добавляю задачу, она корректно добавляется в localStorage.Но если у меня есть несколько задач, и я нажимаю «Завершить» на случайной, иногда случается, что LocalStorage удаляет задачу до или после нее.Я не могу придумать, как заставить это работать.

let addBtn = document.getElementById("addButton");
let textInput = document.getElementById("textInput");
let mainList =  document.getElementById("mainList");
let storage = JSON.parse(localStorage.getItem("toDos")) || [];

if (storage.length != 0){
  for (let i=0; i<storage.length;i++){
    addTask(mainList, storage[i]);
  };
};

function addTask(list,task){
	var newTask = document.createElement("li");
	newTask.textContent=task
  newTask.className="task d-flex justify-content-between list-group-item bg-primary mt-2";
  addCompleteBtn(newTask);
  list.appendChild(newTask);
}

function addCompleteBtn (newTask){
  let completeBtn = document.createElement("button");
  completeBtn.className="btn btn-success completeBtn";
  completeBtn.textContent="Completed";
  newTask.appendChild(completeBtn);
};

  addBtn.addEventListener("click", ()=>{
  if(textInput.value === ""){
    alert("Error: The field is either empty or you entered more than 100 characters!");
  }else{
    storage.push(textInput.value);      
    addTask(mainList, textInput.value);
    textInput.value="";
    localStorage.setItem("toDos",JSON.stringify(storage));
  };
});
    
mainList.addEventListener("click",(evt)=>{
    if (evt.target.className==="btn btn-success completeBtn") {
       let listItem = evt.target.parentNode;
       let mainUl = listItem.parentNode;
       let toBeRemoved = listItem.textContent;
       storage.splice(storage.indexOf(toBeRemoved),1);
       mainUl.removeChild(listItem);
       localStorage.setItem("toDos",JSON.stringify(storage));
	};
});
<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link rel="stylesheet" href="style.css">
    <title>To-do-list App</title>
  </head>
  <body>
  <div class="jumbotron bg-info">
  <div class="container">
    <h1 class="display-4 text-center">Task List</h1>
    <p class="lead text-center">Click on the Add button to add a task</p>
  </div>
</div>
<div class="container">
  <div class="firstInput input-group mb-5">
    <div class="input-group-prepend">
      <button class="btn btn-primary" type="button" id="addButton">Add Task</button>
    </div>
    <input type="text" title='Enter a Task' class="form-control" id="textInput" maxlength="200">
    </div>
  </div>
      <ul class='tasksList container' id="mainList">
      </ul>
    <script src="script.js"></script>
  </body>
</html>
Показывает все значения в LocalStorage

После удаления задачи 2 задача 3 удаляется из хранилища

это особая часть, которая вызывает у меня проблемы:

mainList.addEventListener("click",(evt)=>{
    if (evt.target.className==="btn btn-success completeBtn") {
       let listItem = evt.target.parentNode;
       let mainUl = listItem.parentNode;
       let toBeRemoved = listItem.textContent;
       /* This is the part of code causing me issues
       storage.splice(storage.indexOf(toBeRemoved),1);
       */
       mainUl.removeChild(listItem);
       localStorage.setItem("toDos",JSON.stringify(storage));
	};
});

1 Ответ

0 голосов
/ 21 ноября 2018

Проблема здесь let toBeRemoved = listItem.textContent;, это вернет текстовое содержимое всех элементов внутри этого li.Таким образом, если вы добавляете задачу с именем «Задача 1», при нажатии кнопки «Завершено» значение toBeRemoved будет равно Task 1Completed, так как при этом будет также возвращен текст кнопки, поскольку ваша кнопка является дочерней по отношению к li.

Так что измените let toBeRemoved = listItem.textContent; на let toBeRemoved = listItem.childNodes[0].nodeValue;, и все будет в порядке, получится только текст li.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...