LocalStorage- 无法从待办事项列表中删除项目

时间:2021-03-11 18:18:05

标签: javascript html dom local-storage

我最近开始在不依赖编码教程的情况下处理我的待办事项列表,这太难了。我可以在我的列表中添加项目,但我无法删除项目。当我单击项目时,所有项目都会被删除。你能帮忙吗?

   <fieldset>
      <legend class="task-list-title">Goals that I need to work on</legend>
        <input
         id="inpKey" 
         type="text"
         placeholder="add new goal"
         aria-label="new list name"
    <button type="button" id="btnInsert">New Goal</button>
    <div id="task_list">

    </div>
</fieldset>

JavaScript 代码

const inpKey  = document.getElementById("inpKey");
const btnInsert = document.getElementById("btnInsert");
const task_list = document.getElementById("task_list");

btnInsert.onclick = function() {
const key = inpKey.value;
   if(key) {
     localStorage.setItem(key, inpKey.value);
     location.reload();
     }
}

for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
task_list.innerHTML += `${key}<br />`
}

task_list.onclick = function() { 
  for (let i = 0; i < localStorage.length; i++) {
  const key = localStorage.key(i);
  window.localStorage.removeItem(key);
  task_list.innerHTML = key; 
    } 
 }

2 个答案:

答案 0 :(得分:1)

所以我认为问题在于您没有检查要删除的特定待办事项,而是将它们全部删除

for (let i = 0; i < localStorage.length; i++) {
    const key = localStorage.key(i);
   // I it would be better if you wrapped each key in its own element
    task_list.innerHTML += `<div>${key}</div>`; // I'm using a `div` so there'll be no need for a `<br/>` tag
}   

task_list.onclick = function(e) {
    // I want to use the event data to find out exactly which localStorage key to delete
    for (let i = 0; i < localStorage.length; i++) {
        const key = localStorage.key(i);
        // Here i'm checking if the key is the same as the todo that you want to delete
        if (key == e.target.innerText) {
            localStorage.removeItem(key); // Removing the todo from storage
            e.target.remove(); // Removing the todo element from the DOM
        }
    } 
}

答案 1 :(得分:1)

将新密钥附加到 innerHTMLtasks_list 会使您在要删除项目时很难获得密钥。相反,让每个新任务成为 <p> 元素(或无序列表元素)并将该新元素作为子元素附加到 tasks_list 像这样会更容易-

for (let i = 0; i < localStorage.length; i++) {
  const key = localStorage.key(i);
  const newTask = document.createElement('p') //create a new html element
  newTask.classList.add('task') //add a class of "task" to it
  newTask.innerHTML = key //set the innerHTML to equal the key
  task_list.appendChild(newTask) //add the newTask element as a child element of task_list
}

您可以使用 task 类为每个元素添加事件侦听器,方法是遍历每个元素并添加您的事件侦听器。这里的好处是,当您需要单个任务的密钥时,您只需抓住 innerHTML 并使用它-

for(let i = 0; i < tasks.length; i++) {
    tasks[i].addEventListener("click", () => {
        const key = tasks[i].innerHTML
        window.localStorage.removeItem(key)
        location.reload()
    })
}

您当前通过循环 localStorage 删除项目的方式实际上是在每次循环时删除一个元素,而不是检查它正在删除的项目是否是被点击的项目。

>

编辑-a。 mola 的答案与我的类似,但您无需遍历整个本地存储即可找到匹配的密钥。这就是拥有键/值对的美妙之处!只要您知道密钥,您就可以操作数据,而无需先通过循环搜索。