简体   繁体   English

待办事项列表。 删除任务按钮

[英]ToDo List. Delete task button

I am trying to build todo list and I like to put on button(.cancel-task) action which remove exactly item which connected with that button, but when I try to put addEventListener I meet error like "its not a function".我正在尝试构建待办事项列表,我喜欢执行按钮(.cancel-task)操作,该操作会准确删除与该按钮连接的项目,但是当我尝试放置 addEventListener 时,我遇到了“它不是函数”之类的错误。 Please explain me how to make it with using attribute id which I add before for tasks and also how to remove this item from local storage.请向我解释如何使用我之前为任务添加的属性 id 来制作它,以及如何从本地存储中删除该项目。 Thank you, for your attention.感谢您的关注。

const taskList = document.querySelector(".todo_tasks-wrapper");
const formTodo = document.querySelector(".control");
const inputTask = document.querySelector(".todo_input");
const btnDeleteTask = document.querySelectorAll(".cancel-task");

const taskKeeper = [];
let taskIdCounter = 0;

const data = JSON.parse(localStorage.getItem("tasks"));

const updateHtml = (taskObj) => {
    const newLi = document.createElement("li");
    newLi.innerHTML = `<li id="${taskObj.id}" class="item-task">
        <span>${taskObj.task}</span>
        <button class="cancel-task">
            <img src="assets/todo-cancel.png" alt="Cancel">
        </button>
    </li>`;
    taskList.append(newLi);
}

const newTask = (info) => {
    taskIdCounter += 1;
    const taskObj = {
        task: info,
        id: taskIdCounter,
    };
    taskKeeper.push(taskObj);
    localStorage.setItem("tasks", JSON.stringify(taskKeeper));
    updateHtml(taskObj);
};

formTodo.addEventListener("submit", event => {
    event.preventDefault();
    const info = inputTask.value.trim();
    if(info.length !== 0) {
        newTask(info);
        inputTask.value = "";
        inputTask.focus();
    }
});

if(data !== null) {
    for(let item of data) {
        updateHtml(item);
    }
}

        <div class="todo_wrapper">

    <ul class="todo_tasks-wrapper">

    </ul>

    <form class="control" action="">
        <label class="todo_label-form" for="task">
            <input class="todo_input" id="task" type="text" placeholder="Enter new task" maxlength="30">
            <input class="todo_submit" type="submit" value="+">
        </label>
    </form>

</div>

You can use a onclick listener on the todo_tasks-wrapper element and check every element inside the event path to match the criterias.您可以在todo_tasks-wrapper元素上使用 onclick 侦听器并检查事件路径中的每个元素以匹配条件。

Example:例子:

todoTaskWrapper.addEventListener("click", (event) => {
  for (let el of event.composedPath()) {
    // window and document have no matches function, but they are included in the path
    if (el.matches && el.matches("button.cancel-task")) {
      console.log(el, "is the button clicked")
      console.log(el.parentNode, "is the li element");
      // remove it
      el.parentNode.remove();
    }
  }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM