I tried creating an edit button for editing a created task, and it works for the very first task that i create.
However for subsequent tasks, the edit button for the respective tasks focus on editing the input on my first task again.
For every new task created, it changes the first task back to the very first original task that was written.
To-Do List<div > <div > <div >TO-DO APP</div> </div> <div > <div >CREATE A TO-DO</div> </div> <form id="todo-form"> <div > <div > <input name="newTask" type="text" placeholder="eg. Do the laundry"> </div> </div> <div > <div >CATEGORY</div> </div> <div > <div > <input type="radio" name="category" id="option1" value="Work"> <label for="option1">Work</label> </div> <div > <input type="radio" name="category" id="option2" value="Personal"> <label for="option2">Personal</label> </div> </div> <div > <div ><button type="submit" active>ADD TO-DO</button></div> </div> </form> <div > <div >TO-DO LIST</div> </div> <div > </div> </div> <script src="main.js"></script>
Javascript
const todoForm = document.getElementById("todo-form")
window.addEventListener("load", () => {
todos = JSON.parse(localStorage.getItem("todos")) || []
todoForm.addEventListener("submit", (e) => {
e.preventDefault()
if (e.target.elements.newTask.value != "") {
const todo = {
task: e.target.elements.newTask.value,
category: e.target.elements.category.value
}
todos.push(todo);
localStorage.setItem("todos", JSON.stringify(todos));
e.target.reset()
showList()
}
})
showList();
})
function showList() {
let outPut = '';
let taskListShow = document.querySelector(".todoList")
const taskName = document.querySelector(".todoContent")
todos.forEach((data, index)=> {
outPut = `
<div >
<div >
<input value="${data.task}" readonly>
</div>
<div >
<div >
<div >
<button type="button" onClick="editItem()">Edit</button>
</div>
<div >
<button type="button" onClick="deleteItem(${index})">Delete</button>
</div>
</div>
</div>
</div>`
});
taskListShow.innerHTML = outPut;
}
function deleteItem(index) {
todos.splice(index, 1)
localStorage.setItem("todos", JSON.stringify(todos))
showList()
}
function editItem() {
const taskName = document.querySelector(".todoContent")
taskName.removeAttribute('readonly')
taskName.focus()
taskName.addEventListener("blur", (e) => {
taskName.setAttribute('readonly', true)
taskName = e.target.value
localStorage.setItem('todos', JSON.stringify(todos))
showList()
})
}
I am new to javascript and hope to get help on this! thank you
CodePudding user response:
Since all of the input class
will have todoContent
and when you look for a class using querySelector
then JS will return you the first matching element with class todoContent
.
const taskName = document.querySelector(".todoContent")
What you can do is look for all of the element with class todoContent
and then take the particular input on which you have clicked by using the index
of the clicked edit button
as:
function editItem ( index ) { // RECEVIVE INDEX
const taskAllName = document.querySelectorAll( ".todoContent" );
const taskName = taskAllName[index]; // USE SPECIFC ELEMENT
So you have to pass the index
to function editItem
as:
onClick="editItem(${index})">Edit</button>