副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发

发布时间:2026/10/30 17:36:00

副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发 点此查看所有教程、项目、源码导航文章目录1. 需求说明2. 实现思路3. 分步讲解3.1 HTML 结构、CSS样式3.2 获取页面元素3.3 读取本地存储里面的待办数据3.4 封装渲染函数3.5 新增待办逻辑4. 完整可运行代码5. 重点复盘1. 需求说明我们来实现一个极简的待办事项是前端入门很经典的案例。功能清单在输入框输入待办内容点击新增按钮添加一条待办每条待办后面有删除按钮可以单独删除这一条页面刷新、关闭浏览器再打开待办数据不会丢失localStorage JSON知识点回顾localStorage 只能保存字符串数组需要先用JSON.stringify序列化为 JSON 字符串再存入读取的时候用JSON.parse把字符串转回 JS 数组2. 实现思路页面加载时先从 localStorage 读取待办数据没有数据就使用空数组封装 render 渲染函数把待办数组渲染到页面新增拿到输入框内容添加进数组保存到本地存储重新渲染删除单条根据下标删除数组对应项保存、重渲染。3. 分步讲解3.1 HTML 结构、CSS样式输入框、新增按钮列表容器inputtypetextidtodoInputplaceholder请输入待办事项buttonidaddBtn新增待办/buttonulidtodoList/ul效果CSS部分如下当然如果只是为了学习本地存储的话CSS这一部分代码可以不看style/* 全局重置清除默认内外边距统一盒模型 */*{margin:0;padding:0;box-sizing:border-box;}/* 页面主体样式居中、设置背景色、字体 */body{width:600px;margin:50px auto;font-family:Microsoft Yahei,sans-serif;background-color:#f5f7fa;}/* 标题样式 */h2{text-align:center;color:#333;margin-bottom:20px;}/* 输入区域容器弹性布局控制输入框和按钮间距 */.input-wrap{display:flex;gap:10px;margin-bottom:20px;}/* 输入框样式弹性占满剩余宽度 */#todoInput{flex:1;padding:10px 14px;border:1px solid #ccc;border-radius:6px;font-size:16px;}/* 新增按钮基础样式 */#addBtn{padding:10px 20px;background-color:#409eff;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:16px;}/* 鼠标悬浮在新增按钮上颜色加深 */#addBtn:hover{background-color:#337ecc;}/* 待办列表容器去掉默认圆点白色背景圆角 */#todoList{list-style:none;background:#fff;border-radius:8px;overflow:hidden;}/* 每一条待办项弹性布局文字和删除按钮左右分开 */#todoList li{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #eee;font-size:16px;}/* 最后一条待办去掉底部边框 */#todoList li:last-child{border-bottom:none;}/* 删除按钮样式红色风格 */#todoList li button{padding:6px 12px;background-color:#f56c6c;color:#fff;border:none;border-radius:4px;cursor:pointer;}/* 删除按钮悬浮效果 */#todoList li button:hover{background-color:#dd6161;}/style3.2 获取页面元素vartodoInputdocument.getElementById(todoInput);varaddBtndocument.getElementById(addBtn);vartodoListdocument.getElementById(todoList);3.3 读取本地存储里面的待办数据varstrlocalStorage.getItem(todoData);// 有数据就转数组没有就初始化为空数组vartodoArrstr?JSON.parse(str):[];3.4 封装渲染函数functionrender(){// 清空旧列表todoList.innerHTML;for(vari0;itodoArr.length;i){varlidocument.createElement(li);li.innerTexttodoArr[i];// 删除按钮vardelBtndocument.createElement(button);delBtn.innerText删除;delBtn.style.marginLeft10px;delBtn.onclickfunction(){// 找到删除的元素在数组中的序号varindexArray.from(this.parentElement.parentElement.children).indexOf(this.parentElement);todoArr.splice(index,1);localStorage.setItem(todoData,JSON.stringify(todoArr));render();}li.appendChild(delBtn);todoList.appendChild(li);}}// 页面打开先渲染一次render();3.5 新增待办逻辑addBtn.onclickfunction(){varcontenttodoInput.value.trim();if(content){alert(待办内容不能为空);return;}todoArr.push(content);localStorage.setItem(todoData,JSON.stringify(todoArr));render();// 清空输入框todoInput.value;}4. 完整可运行代码!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8title简易持久化待办事项/titlestyle/* 全局重置清除默认内外边距统一盒模型 */*{margin:0;padding:0;box-sizing:border-box;}/* 页面主体样式居中、设置背景色、字体 */body{width:600px;margin:50px auto;font-family:Microsoft Yahei,sans-serif;background-color:#f5f7fa;}/* 标题样式 */h2{text-align:center;color:#333;margin-bottom:20px;}/* 输入区域容器弹性布局控制输入框和按钮间距 */.input-wrap{display:flex;gap:10px;margin-bottom:20px;}/* 输入框样式弹性占满剩余宽度 */#todoInput{flex:1;padding:10px 14px;border:1px solid #ccc;border-radius:6px;font-size:16px;}/* 新增按钮基础样式 */#addBtn{padding:10px 20px;background-color:#409eff;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:16px;}/* 鼠标悬浮在新增按钮上颜色加深 */#addBtn:hover{background-color:#337ecc;}/* 待办列表容器去掉默认圆点白色背景圆角 */#todoList{list-style:none;background:#fff;border-radius:8px;overflow:hidden;}/* 每一条待办项弹性布局文字和删除按钮左右分开 */#todoList li{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #eee;font-size:16px;}/* 最后一条待办去掉底部边框 */#todoList li:last-child{border-bottom:none;}/* 删除按钮样式红色风格 */#todoList li button{padding:6px 12px;background-color:#f56c6c;color:#fff;border:none;border-radius:4px;cursor:pointer;}/* 删除按钮悬浮效果 */#todoList li button:hover{background-color:#dd6161;}/style/headbodyinputtypetextidtodoInputplaceholder请输入待办事项buttonidaddBtn新增待办/buttonulidtodoList/ulscriptvartodoInputdocument.getElementById(todoInput);varaddBtndocument.getElementById(addBtn);vartodoListdocument.getElementById(todoList);varstrlocalStorage.getItem(todoData);vartodoArrstr?JSON.parse(str):[];functionrender(){todoList.innerHTML;for(vari0;itodoArr.length;i){varlidocument.createElement(li);li.innerTexttodoArr[i];vardelBtndocument.createElement(button);delBtn.innerText删除;delBtn.style.marginLeft10px;delBtn.onclickfunction(){varindexArray.from(this.parentElement.parentElement.children).indexOf(this.parentElement);todoArr.splice(index,1);localStorage.setItem(todoData,JSON.stringify(todoArr));render();}li.appendChild(delBtn);todoList.appendChild(li);}}render();addBtn.onclickfunction(){varcontenttodoInput.value.trim();if(content){alert(待办内容不能为空);return;}todoArr.push(content);localStorage.setItem(todoData,JSON.stringify(todoArr));render();todoInput.value;}/script/body/html效果注意刷新后待办事项仍能保留。5. 重点复盘数组不能直接放进 localStorage必须JSON.stringify()序列化读取出来的是字符串要用JSON.parse()转回数组新增、删除数据之后都要重新保存到 localStorage再调用渲染函数数据保存在浏览器本地刷新页面、关闭浏览器再打开数据依旧存在清除浏览器缓存才会消失。
延伸阅读

更多相关文章

2026/10/30 17:36:00

副队长JavaScript教程(64)-本地存储:localStorage 与 sessionStorage

点此查看 所有教程、项目、源码导航 文章目录1. 背景2. WebStorage 基础特点3. localStorage 持久化存储4. sessionStorage 会话存储5. localStorage 和 sessionStorage 对比6. 入门常见坑点6.1 存入的值,都会自动转为字符串6.2 不能直接存对象、数组6.3 只能在浏览…

2026/10/30 17:36:00

副队长JavaScript教程(63)-BOM之窗口大小与页面滚动

点此查看 所有教程、项目、源码导航 文章目录1. 背景2. 获取浏览器窗口可视区域大小2.1 innerWidth、innerHeight2.2 outerWidth、outerHeight(了解)3. 窗口缩放事件 resize4. 获取页面滚动距离 scrollX、scrollY5. 控制页面滚动的方法5.1 scrollTo (x, …

2026/10/30 17:30:59

栈、队列与二分:Agent Offer高频考点快速速记

文档知识库教程 【免费下载链接】agent_java_offer 公开的 Java 后端 / AI Agent / 系统设计 / 算法面试复习资料库 项目地址: https://gitcode.com/gh_mirrors/ag/agent_java_offer 点击查看 免费下载 备战 Java 后端 / AI Agent 面试时,栈、队列与二分…

2026/10/30 18:51:10

农业物联网与遥感技术在苗情灾情监控系统中的应用

1. 苗情灾情监控系统概述在现代农业生产中,及时掌握作物生长状况和灾害发生情况是提高农业生产效率的关键。苗情灾情监控系统通过整合物联网、遥感技术和数据分析手段,为农业生产者提供从田间到决策的全链条支持。这套系统能够实时监测作物生长参数、识别…

2026/10/30 18:51:10

防爆气象检测系统:集成化设计与工业安全应用

1. 防爆气象检测系统概述在石油化工、矿山开采、危化品存储等高危行业中,环境气象参数的实时监测直接关系到生产安全。传统气象站设备体积庞大、安装复杂,且难以满足防爆区域的特殊要求。而将气象监测功能集成到防爆屏幕中的解决方案,正在成为…

2026/10/30 18:51:10

R24烧写工具自动检测与多模块并发下载实践指南

简介:ResearchDownload_R24.0.0001 是一款面向手机维修与刷机从业者的烧写工具软件,用于把电脑端程序写入手机硬件模块,适合需要批量处理多台设备的场景,使用前需安装USB驱动并通过数据线或串口线缆连接手机。软件支持多COM口并行…

2026/10/30 18:51:10

OG05B1B全局快门与SCCB深度解析:硬件级图像同步与可靠寄存器控制

简介:本资源为豪威科技OG05B1B黑白CMOS图像传感器的官方技术手册PDF,面向嵌入式视觉系统工程师、机器视觉开发者及工业相机方案设计人员,解决高精度成像选型、全局快门参数配置与红外低照度性能评估等核心问题。手册完整涵盖PureCelPlus-S像素…

2026/10/30 18:51:09

微电网谐波注入主动保护技术原理与工程实践

1. 项目概述微电网作为分布式能源接入的重要形式,其保护系统的可靠性直接关系到供电安全。传统被动式保护在新能源高渗透率场景下存在灵敏度不足、选择性差等问题。基于谐波注入的主动保护技术通过在故障时主动注入特定频率谐波信号,利用信号传播特性实现…

2026/10/30 18:46:09

埃夫特离线编程实战:从虚拟仿真到产线节拍优化

简介:本资源是一份面向工业自动化工程师、机器人集成商及高校教学人员的埃夫特tVR_Factory离线编程软件技术详解文档,聚焦工业机器人虚拟仿真与离线编程核心能力,解决现场调试风险高、轨迹精度难保障、多品牌适配复杂等实际工程问题。文档为单…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑