const todo = item.parentElement;
это неправильный код. Дай мне подумать об этом. Вы создали кнопку, а затем поместили в нее значок. Затем вы добавили событие щелчка к этой кнопке. Но проблема в том, что при нажатии на эту кнопку элемент, который вы хотите удалить, является родительским элементом этой кнопки. родительский элемент значка уже является самой кнопкой. Понимаете?
Обновлено:
Я добавил строки комментариев к своим изменениям и объяснил их. Надеюсь, это понятно. Удачи!
//selectors
const todoInput = document.querySelector(".todo-input");
const todoButton = document.querySelector(".todo-button");
const todoList = document.querySelector(".todo-list");
//eventlistners
todoButton.addEventListener("click", addTodo);
todoList.addEventListener('click', deleteCheck);
//functions
function addTodo(event) {
//prevent form submit
event.preventDefault();
//TODO DIV
const todoDiv = document.createElement("div");
todoDiv.classList.add("todo");
//create li
const newTodo = document.createElement('li');
newTodo.innerText = todoInput.value;
newTodo.classList.add('todo-item');
todoDiv.appendChild(newTodo);
//trash button
const trashButton = document.createElement('button');
trashButton.innerHTML = '<i class="fas fa-trash trash-btn"></i>'; // add trash-btn class here!
// trashButton.classList.add("trash-btn"); now instead of giving this class to the button itself, we can give directly to the icon.
todoDiv.appendChild(trashButton);
//append to list
todoList.appendChild(todoDiv);
//clear
todoInput.value = "";
}
function deleteCheck(e) {
const item = e.target;
//DELETE TODO
if (item.classList[0] === 'trash-btn') {
const todo = item.parentElement.parentElement; // Add one more parent element!
console.log(todo) // Look this carefully
// animation
todo.classList.add("fall");
todo.addEventListener('transitionend', function() {
todo.remove();
});
}
}
body {
color: whitesmoke;
}
header,
form {
min-height: 20vh;
display: flex;
justify-content: center;
align-items: center;
}
form input,
form button {
padding: 0.5rem;
font-size: 2rem;
border: none;
background-color: whitesmoke;
}
form button {
color: black;
background: whitesmoke;
cursor: pointer;
transition: all 0.5s ease;
}
form button:hover {
background: black;
color: whitesmoke;
}
.todo-container {
display: flex;
justify-content: center;
align-items: center;
}
.todo-list {
min-width: 30%;
list-style: none;
}
.todo {
background: whitesmoke;
color: black;
font-size: 1.5rem;
display: flex;
justify-content: space-between;
align-items: center;
transition: all 0.5 ease;
}
.todo li {
flex: 1;
}
.trash-btn {
color: red;
border: none;
padding: .4rem;
cursor: pointer;
font-size: 2rem;
}
.fa-trash {
pointer-events: none;
}
.fall {
transform: translateY(8rem) rotateZ(20deg);
display: none;
/* if you use opacity here, the Delete button will not work after a while. it makes more sense for the item to disappear completely using display none */
}
<script src="https://use.fontawesome.com/releases/v5.13.0/js/all.js" data-auto-replace-svg="nest"></script>
<header>
<h1> To do List</h1>
</header>
<form>
<input type="text" class="todo-input">
<button class="todo-button" type="submit"><i class = "fas fa-plus-square"></i></button>
</form>
<div class="todo-container">
<ul class="todo-list">
</ul>
</div>