Я пишу приложение списка дел, и у меня возникает проблема, когда я нажимаю кнопку редактирования, чтобы изменить значение задачи, Я хочу изменить значение входной задачи, изменить его в объектной задаче "заголовок" и сохраните его в локальном хранилище.
const inputWriteTask = document.querySelector("input"),
buttonAddTask = document.querySelector("button"),
containerTasks = document.querySelector(".container-tasks");
let arrayOfTasks = [];
function buttonAddtasksToArray() {
if (inputWriteTask.value != "") {
addValueInput(inputWriteTask.value);
inputWriteTask.value = "";
};
};
buttonAddTask.addEventListener("click", buttonAddtasksToArray);
function addValueInput(text) {
const task = {
id: Date.now(),
title: text,
};
arrayOfTasks.push(task);
console.info(arrayOfTasks);
createTasks(arrayOfTasks);
addDataToLocaleStorage(arrayOfTasks)
};
function createTasks(arrayOfTasks) {
containerTasks.innerHTML = "";
arrayOfTasks.forEach(task => {
let div = document.createElement("div");
div.className = "task";
containerTasks.appendChild(div)
let inputText = document.createElement("input")
inputText.type = "text"
inputText.setAttribute("value", task.title)
inputText.setAttribute("readonly", "")
let editButton = document.createElement("button");
editButton.className = "edit-btn";
editButton.appendChild(document.createTextNode("edit"))
div.append(inputText, editButton)
editButton.onclick = () => {
inputText.removeAttribute("readonly");
inputText.focus();
};
});
};
function addDataToLocaleStorage(arrayOfTasks) {
window.localStorage.setItem("data-task", JSON.stringify(arrayOfTasks));
};
if (localStorage.getItem("data-task")) {
arrayOfTasks = JSON.parse(localStorage["data-task"])
createTasks(arrayOfTasks)
}<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta http-equiv = "X-UA-Compatible" content = "IE=edge">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Document</title>
<script defer src = "main.js"></script>
</head>
<body>
<style>
.container-tasks {
display: grid;
gap: 1em;
margin-top: 1em;
}
.task {
background-color: #ddd;
padding: 1em;
display: flex;
justify-content: space-between;
}
.task input {
border: none;
outline: none;
background-color: transparent;
}
</style>
<input type = "text">
<button>add task</button>
<div class = "container-tasks">
</div>
</body>
</html>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы отредактировать определенный индекс этого массива, сохраненного в локальном хранилище, вы должны отслеживать index каждой записи. Для этого вы можете использовать атрибут data-.
function createTasks(arrayOfTasks) {
containerTasks.innerHTML = "";
arrayOfTasks.forEach((task, index) => {
let div = document.createElement("div");
div.className = "task";
div.setAttribute("data-taskindex", index);
containerTasks.appendChild(div);
...
И при размытии ввода передайте это значение индекса в addValueInput.
function addValueInput(text, index = -1) {
const task = {
id: Date.now(),
title: text
};
if (index === -1) {
arrayOfTasks.push(task);
} else {
arrayOfTasks[index] = task;
// OR! If you whish to keep the original id (a date)
// arrayOfTasks[index].title = text;
}
console.info(arrayOfTasks);
createTasks(arrayOfTasks);
addDataToLocaleStorage(arrayOfTasks);
}
Итак, если не было передано index... Он добавляет новую задачу в массив. И если он есть, он перезаписывает этот конкретный index вместо этого.
Вот обработчик события (находится в вашей функции createTasks):
inputText.addEventListener("blur", (event) => {
let index = event.target.closest("div").dataset.taskindex;
console.info(`The task at index # ${index} was modified.`);
addValueInput(event.target.value, index);
});
Поскольку localStorage здесь запрещено, взгляните на этот CodePen