You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JS实现Todo List任务的勾选样式切换功能?

Todo List任务勾选功能实现求助

刚接触编程,学完HTML/CSS后开始学习JavaScript,已经完成Todo List的任务添加与删除功能,但无法实现任务勾选功能——希望点击勾选按钮时,修改对应任务的text-decoration与背景色,查了资料许久仍未解决,恳请帮助。

我的代码

HTML代码

<html lang="fr">
<head>
  <meta charset="utf-8">
  <meta name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no'>
<!-- Boxicons CSS -->
<link href='https://unpkg.com/boxicons@2.1.2/css/boxicons.min.css' rel='stylesheet'>

<title>To-Do List</title>
  <link rel="stylesheet" href="tdl2.css">
</head>
<body>

<div id="add" class="entete">
<h2>To-Do List!</h2>
<input type="text" id="myInput" placeholder ="Laver la voiture..."> 
<button type="button" id="button">Ajouter</button>
</div>

<ul id="list"></ul>

<script src="tdl2.js"></script>
</body>
</html>

JavaScript代码

//SELECTORS
let taskInput = document.querySelector('#myInput');
let addTaskButton = document.querySelector('#button');
let taskList = document.querySelector('#list');

//EVENT LISTENERS
addTaskButton.addEventListener('click',addTask);

//FUNCTIONS
function addTask() {
    event.preventDefault();

    if(taskInput.value === "") {
        alert("Please enter a task!")
    }
    else {
         //CREATE TASK DIV
        let taskDiv = document.createElement('div');
        taskDiv.classList.add('task');

        //CREATE LI
        let taskLi = document.createElement('li');
        taskLi.innerText = taskInput.value;
        taskLi.classList.add('task-li');
        taskDiv.appendChild(taskLi);

        //DELETE BUTTON
        let deleteButton = document.createElement('button');
        deleteButton.innerHTML = '<i class="bx bx-eraser"></i>';
        deleteButton.classList.add('delete-btn');
        taskDiv.appendChild(deleteButton);

        taskList.appendChild(taskDiv);

        //CLEAR INPUT VALUE
        taskInput.value = '';

        deleteButton.addEventListener('click', () => {
            taskDiv.remove()
        });

        //CHECK BUTTON
        let checkButton = document.createElement('button');
        checkButton.innerHTML = '<i class="bx bx-check"></i>';
        checkButton.classList.add('check-btn');
        taskDiv.appendChild(checkButton);
    }
}

效果截图

Todo List截图


解决方案

问题核心是未给勾选按钮绑定点击事件,推荐用CSS类控制样式(比直接修改JS样式更易维护),具体步骤如下:

  1. 添加CSS完成状态类
    在tdl2.css中加入以下代码,定义任务完成后的样式:
/* 任务完成状态样式 */
.completed {
  text-decoration: line-through; /* 添加删除线 */
  background-color: #f0f0f0; /* 自定义背景色,可按需修改 */
  color: #888; /* 可选:将文字设为灰色 */
}
  1. 给勾选按钮绑定点击事件
    在JavaScript中创建checkButton后,添加点击事件通过classList.toggle()实现样式切换:
//CHECK BUTTON
let checkButton = document.createElement('button');
checkButton.innerHTML = '<i class="bx bx-check"></i>';
checkButton.classList.add('check-btn');
taskDiv.appendChild(checkButton);

// 绑定勾选事件
checkButton.addEventListener('click', () => {
  // 切换任务文本的完成状态类
  taskLi.classList.toggle('completed');
  // 若需给整个任务块加背景色,可改为操作taskDiv:
  // taskDiv.classList.toggle('completed');
});

说明

  • classList.toggle()会自动判断元素是否包含目标类:存在则移除,不存在则添加,实现勾选/取消的切换效果。
  • 样式与逻辑分离,后续修改样式无需改动JS代码,符合前端开发最佳实践。

内容的提问来源于stack exchange,提问作者C-Rollot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:36:20