javascript 如何通过用户输入更新数组中对象的值?

c9qzyr3d  于 2022-12-17  发布在  Java
关注(0)|答案(1)|浏览(114)

如何实现/执行单击编辑按钮后,允许用户输入值,然后提交,li中的文本将呈现更新后的值?
JS代码块编写如下:
你可以忽略其他不相关的函数。我知道,edittask是不完整的,但我不知道如何实现我上面提到的功能。

const alertMsg = document.querySelector('.alert-message');
    const inputForm = document.querySelector('.input-section');
    const todoInput = document.querySelector('.todo-input');
    const addBtn = document.querySelector('.add-btn');
    const taskActions = document.querySelector('.task-actions');
    const todosList = document.querySelector('.todos-list');
    const deleteAllBtn = document.querySelector('.delete-all-btn');
    const savedTodos = localStorage.getItem('todos');

    let todos = [];

    function displayTodos(newTodoObj){
        const li = document.createElement('li');
        li.id = newTodoObj.id;
        li.className = 'task-container'

        const task = document.createElement('span');
        const checkBtn = document.createElement('button')
        const editBtn = document.createElement('button')
        const deleteBtn = document.createElement('button')

        task.innerText = newTodoObj.text;
        checkBtn.innerText = 'Check'
        editBtn.innerText = 'Edit';
        deleteBtn.innerText = 'Del';
    
        checkBtn.addEventListener('click', (event) => {
            const task = event.target.parentElement;
            console.log(task);
            task.classList.toggle('completed');
        })
    
        editBtn.addEventListener('click', editTask)
        deleteBtn.addEventListener('click', deleteTask)

        li.appendChild(task);
        li.appendChild(checkBtn);
        li.appendChild(editBtn);
        li.appendChild(deleteBtn);

        todosList.appendChild(li);
    }

    function editTask(event){
        const li = event.target.parentElement.children[0].innerText;
        todoInput.value = li;    
    }

    function deleteTask(event){
        const li = event.target.parentElement;

        li.remove();
        todos = todos.filter((todo) => todo.id !== parseInt(li.id));
        saveTodos();
    }

    function handleTodoSubmit(event){
        event.preventDefault();
        const newTodo = todoInput.value;
        todoInput.value = '';
        const newTodoObj = {
            text: newTodo,
            id: Date.now(),
            checked: false
        };
        todos.push(newTodoObj);
        displayTodos(newTodoObj);
        saveTodos();
    }

    function saveTodos(){
        localStorage.setItem('todos', JSON.stringify(todos));
    }

    inputForm.addEventListener('submit', handleTodoSubmit);

    if(savedTodos !== null){
        const parsedTodos = JSON.parse(savedTodos);
        parsedTodos.forEach(displayTodos);
    }

    window.addEventListener('beforeunload', saveTodos);
56lgkhnf

56lgkhnf1#

此代码在单击“Edit”按钮时向DOM添加一个input元素,将其值设置为任务文本,并添加一个侦听“Enter”键的事件侦听器。当按下“Enter”键时,此代码更新任务文本,并用包含更新文本的span元素替换input元素。它还更新todos数组,并将更新的数组保存到本地存储。

function editTask(event){
    const li = event.target.parentElement;
    const task = li.children[0];
    const input = document.createElement('input');
    input.value = task.innerText;
    li.replaceChild(input, task);
    input.focus();
    input.addEventListener('keydown', (event) => {
        if (event.key === 'Enter') {
            const newTask = document.createElement('span');
            newTask.innerText = input.value;
            li.replaceChild(newTask, input);
            const todoIndex = todos.findIndex((todo) => todo.id === parseInt(li.id));
            todos[todoIndex].text = newTask.innerText;
            saveTodos();
        }
    });
}

您可以在现有的JavaScript文件中使用这段代码,方法是将当前的editTask函数替换为以下函数。
我不知道我是否很好地理解了你的问题,但我希望它至少能对你有所帮助。或者它可能是完整的解决方案。祝你好运!

相关问题