我正在try 创建一个待办事项列表,不知道该如何做才能避免每次添加新任务时完成的待办事项都消失.我知道会发生这种情况,因为每次添加新任务时我都会清除div,但是我不确定如何继续,以便继续使用数组,并且仍然显示已完成的任务和新任务.

科德芬:https://codepen.io/martinkariuki7-the-looper/pen/OJvQXRW

const newToDo = document.getElementById('todo-new')
const addBtn = document.getElementById('addToDo')
const main= document.getElementById('toDoList')
const taskDone = document.getElementsByClassName('task')

let toDoList = []

// populate to do list
function populateToDo(){
  let todo = newToDo.value
  todo !== null && todo !== '' ? toDoList.push(todo) : alert('You must write something')

  updateDOM()
}

//Update DOM
function updateDOM(){
    // Clear main div
    main.innerHTML = `<h1>To do list </h1>`

    // Show tasks on the front
    toDoList.forEach(item =>{
        let task = document.createElement('div')
        task.classList.add('task')
        task.innerHTML = `<label><input type="checkbox" >${item}</label><br>`
        main.append(task)
   
        task.addEventListener('change', () => task.classList.toggle('task-complete'))

        newToDo.value = ''
    })

}

// Event listeners
// Add Tasks
addBtn.addEventListener('click', populateToDo)
newToDo.addEventListener('keydown', (e) => {
    if(e.code === 'Enter'){
       e.preventDefault()
       populateToDo()
    }
})

推荐答案

如果要使用数组来更新列表,则需要将已有的内容与将要更改的内容进行比较.

如果不存在具有相同文本的项目,则可以执行以下操作:

function updateNodes()
{
    const nodesMap = new Map();
    [...document.querySelectorAll('div label')]
        .forEach(node => {
            nodesMap.add(node.innerText, node);
        });
  
    const nodesUpdate = [];
    toDoList.forEach(item => {
        if (nodesMap.has(item)) {
            nodesUpdate.push(nodesMap[item]);
        } else {
            const newNode = document.createElement('div');
            newNode.classList.add('task');
            newNode.innerHTML = `<label><input type="checkbox" >${item}</label>`;
            nodesUpdate.push(newNode);
        }
    });
  
    return nodesUpdate;
}

否则,每个项目(或任务)都需要有一个标识.否则,如果有两个项目具有相同的名称,您将不知道哪个项目被移除或移动.此外,没有标识,你无法知道一件物品是否被重新命名.

这里的代码没有经过测试,当然,您需要根据您的需要对其进行调整.

Javascript相关问答推荐

ReactJS中的material UI自动完成类别

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

判断表格单元格中是否存在文本框

Rehype将hashtag呈现为URL

成功完成Reducers后不更新状态

在grafana情节,避免冲突的情节和传说

如何在输入元素中附加一个属性为checkbox?

编辑文本无响应.onClick(扩展脚本)

Reaction Redux&Quot;在派单错误中检测到状态Mutations

在画布中调整边上反弹框的大小失败

Jexl to LowerCase()和Replace()

顶点图使用组标签更新列之间的条宽

MongoDB通过数字或字符串过滤列表

如何在Firebase中读取对象的特定字段?

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行

CSS网格使页面自动滚动

我如何让我的弹力球在JavaScript和HTML画布中相互碰撞后改变 colored颜色 ?

为什么我的Reaction组件不能使用createBrowserRouter呈现?

如何在父IF条件和单个IF条件中形成嵌套的三元语句