深入浅出:使用JavaScript实现一个功能丰富的待办事项应用

简介: 深入浅出:使用JavaScript实现一个功能丰富的待办事项应用

引言:

在日常工作和生活中,我们经常需要处理各种各样的待办事项。一个功能齐全、操作便捷的待办事项应用可以极大地提高我们的效率。今天,我们就来一起使用JavaScript,从零开始,实现一个这样的应用。在这个过程中,我们将会学习到如何使用JavaScript操作DOM,如何实现本地存储,以及如何设计和实现一个具有复杂功能的前端应用。

功能需求:

我们的待办事项应用将具备以下功能:

  1. 用户可以输入新的待办事项,并添加到列表中。
  2. 用户可以为每个待办事项设置优先级(高、中、低)。
  3. 用户可以标记待办事项为已完成或未完成。
  4. 用户可以删除待办事项。
  5. 应用能够持久化存储用户的待办事项,即使刷新页面也不会丢失数据。

技术栈:

  • HTML:用于构建应用的用户界面。
  • CSS:用于美化应用的用户界面。
  • JavaScript:用于实现应用的各种功能。

实现过程:

一、HTML结构

首先,我们需要使用HTML来构建应用的基本结构。包括一个输入框用于输入新的待办事项,一个按钮用于添加待办事项,以及一个列表用于展示所有的待办事项。

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>待办事项应用</title>  
    <link rel="stylesheet" href="styles.css">  
</head>  
<body>  
    <div class="container">  
        <h1>待办事项应用</h1>  
        <input type="text" id="newTodoInput" placeholder="输入新的待办事项">  
        <button id="addTodoButton">添加</button>  
        <ul id="todoList"></ul>  
    </div>  
    <script src="app.js"></script>  
</body>  
</html>

 

 

二、CSS样式

然后,我们使用CSS来美化应用的用户界面。这里只展示部分关键样式,完整的样式可以根据你的喜好来设计。

.container {  
    max-width: 600px;  
    margin: 0 auto;  
    padding: 20px;  
}  
  
input[type="text"] {  
    width: 100%;  
    padding: 10px;  
    box-sizing: border-box;  
    margin-bottom: 20px;  
}  
  
button {  
    padding: 10px 20px;  
    background-color: #007BFF;  
    color: white;  
    border: none;  
    cursor: pointer;  
    margin-bottom: 20px;  
}  
  
li {  
    list-style: none;  
    padding: 10px;  
    background-color: #F8F9FA;  
    margin-bottom: 10px;  
}  
  
.completed {  
    text-decoration: line-through;  
    opacity: 0.6;  
}

 

三、JavaScript实现

最后,我们使用JavaScript来实现应用的各种功能。

// 获取DOM元素  
const newTodoInput = document.getElementById('newTodoInput');  
const addTodoButton = document.getElementById('addTodoButton');  
const todoList = document.getElementById('todoList');  
  
// 定义待办事项对象  
class Todo {  
    constructor(text, priority, completed = false) {  
        this.text = text;  
        this.priority = priority;  
        this.completed = completed;  
    }  
}  
  
// 添加待办事项  
addTodoButton.addEventListener('click', () => {  
    const text = newTodoInput.value.trim();  
    if (text) {  
        // 假设优先级默认为中  
        const todo = new Todo(text, '中');  
        addTodoToList(todo);  
        saveTodosToLocalStorage();  
        newTodoInput.value = '';  
    }  
});  
  
// 将待办事项添加到列表中  
function addTodoToList(todo) {  
    const listItem = document.createElement('li');  
    listItem.textContent = `${todo.text} [${todo.priority}]`;  
    listItem.classList.add('todo-item');  
  
    // 添加完成按钮  
    const completeButton = document.createElement('button');  
    completeButton.textContent = '完成';  
    completeButton.addEventListener('click', () => {  
        todo.completed = true;  
        listItem.classList.add('completed');  
        saveTodosToLocalStorage();  
    });  
    listItem.appendChild(completeButton);  
  
    // 添加删除按钮  
    const deleteButton = document.createElement('button');  
    deleteButton.textContent = '删除';  
    deleteButton.addEventListener('click', () => {  
        todoList.removeChild(listItem);  
        removeTodoFromLocalStorage(todo);  
    });  
    listItem.appendChild(deleteButton);  
  
    todoList.appendChild(listItem);  
}  
  
// 从本地存储中加载待办事项  
function loadTodosFromLocalStorage() {  
    const savedTodos = JSON.parse(localStorage.getItem('todos'));  
    if (savedTodos) {  
        savedTodos.forEach(todoData => {  
            const todo = new Todo(todoData.text, todoData.priority, todoData.completed);  
            addTodoToList(todo);  
        });  
    }  
}  
  
// 将待办事项保存到本地存储  
function saveTodosToLocalStorage() {  
    const todosData = Array.from(todoList.children).map(listItem => {  
        const todoText = listItem.textContent.split('[')[0].trim();  
        const todoPriority = listItem.textContent.split('[')[1].split(']')[0];  
        const todoCompleted = listItem.classList.contains('completed');  
        return { text: todoText, priority: todoPriority, completed: todoCompleted };  
    });  
    localStorage.setItem('todos', JSON.stringify(todosData));  
}  
  
// 从本地存储中删除待办事项  
function removeTodoFromLocalStorage(todo) {  
    const todosData = JSON.parse(localStorage.getItem('todos'));  
    const updatedTodosData = todosData.filter(todoData => todoData.text !== todo.text);  
    localStorage.setItem('todos', JSON.stringify(updatedTodosData));  
    // 这里需要重新加载列表,以确保界面和数据同步  
    todoList.innerHTML = '';  
    loadTodosFromLocalStorage();  
}  
  
// 初始化应用  
loadTodosFromLocalStorage();

代码分析:

  1. 我们首先定义了一个Todo类,用于表示待办事项。每个待办事项都有一个文本内容、一个优先级和一个表示是否已完成的标志。
  2. 我们为添加按钮添加了一个点击事件监听器。当用户点击添加按钮时,我们会创建一个新的Todo对象,并将其添加到列表中。同时,我们还会将待办事项保存到本地存储中。
  3. addTodoToList函数中,我们创建了一个新的列表项,并将其添加到待办事项列表中。同时,我们还为每个列表项添加了一个完成按钮和一个删除按钮。
  4. 我们使用了本地存储来持久化存储用户的待办事项。loadTodosFromLocalStorage函数用于从本地存储中加载待办事项,saveTodosToLocalStorage函数用于将待办事项保存到本地存储,removeTodoFromLocalStorage函数用于从本地存储中删除待办事项。
  5. 在应用初始化时,我们调用了loadTodosFromLocalStorage函数,以确保用户的待办事项能够从本地存储中加载到界面中。

总结:

通过以上的步骤,我们成功地使用JavaScript实现了一个功能丰富的待办事项应用。在这个过程中,我们不仅学习了如何使用JavaScript操作DOM,还学习了如何实现本地存储,以及如何设计和实现一个具有复杂功能的前端应用。希望这个例子能够帮助你更好地理解JavaScript的实际应用,并激发你对前端开发的热情。

 

相关文章
|
3月前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
224 77
|
27天前
|
JavaScript 前端开发 安全
盘点原生JS中目前最没用的几个功能API
在JavaScript的发展历程中,许多功能与API曾风光无限,但随着技术进步和语言演化,部分功能逐渐被淘汰或被更高效的替代方案取代。例如,`with`语句使代码作用域复杂、可读性差;`void`操作符功能冗余且影响可读性;`eval`函数存在严重安全风险和性能问题;`unescape`和`escape`函数已被`decodeURIComponent`和`encodeURIComponent`取代;`arguments`对象则被ES6的剩余参数语法替代。这些变化体现了JavaScript不断优化的趋势,开发者应紧跟技术步伐,学习新技能,适应新技术环境。
43 10
|
30天前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
56 11
|
1月前
|
敏捷开发 人工智能 JavaScript
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
Figma-Low-Code 是一个开源项目,能够直接将 Figma 设计转换为 Vue.js 应用程序,减少设计师与开发者之间的交接时间,支持低代码渲染和数据绑定。
107 3
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
|
1月前
|
JavaScript 前端开发
【Vue.js】监听器功能(EventListener)的实际应用【合集】
而此次问题的核心就在于,Vue实例化的时机过早,在其所依赖的DOM结构尚未完整构建完成时就已启动挂载流程,从而导致无法找到对应的DOM元素,最终致使计算器功能出现异常,输出框错误地显示“{{current}}”,并且按钮的交互功能也完全丧失响应。为了让代码结构更为清晰,便于后续的维护与管理工作,我打算把HTML文件中标签内的JavaScript代码迁移到外部的JS文件里,随后在HTML文件中对其进行引用。
52 8
|
2月前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
28天前
|
监控 安全 中间件
Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
这篇文章介绍了什么是Next.js中的中间件以及其应用场景。中间件可以用于处理每个传入请求,比如实现日志记录、身份验证、重定向、CORS配置等功能。文章还提供了一个身份验证中间件的示例代码,以及如何使用限流中间件来限制同一IP地址的请求次数。中间件相当于一个构建模块,能够简化HTTP请求的预处理和后处理,提高代码的可维护性,有助于创建快速、安全和用户友好的Web体验。
|
3月前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
91 31
|
3月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
3月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
76 3

热门文章

最新文章

  • 1
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    49
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 3
    Node.js 中实现多任务下载的并发控制策略
    34
  • 4
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 5
    【JavaScript】深入理解 let、var 和 const
    49
  • 6
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    47
  • 7
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    57
  • 8
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    57
  • 9
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    72
  • 10
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    57