0

0

JavaScript实现todolist功能的实现代码

小云云

小云云

发布时间:2018-03-03 09:15:04

|

3773人浏览过

|

来源于php中文网

原创

该项目主要可以练习js操控dom,事件,事件触发之间的逻辑关系,以及如何写入缓存,获取缓存。

需要实现的功能:将用户输入添加至待办项,可以对todolist进行分类,用户勾选即将待办项分入已完成组,todolist的每一项可删除和编辑,将用户输入数据写入localStorage本地缓存,实现对输入数据的保存,可以清楚域名下本地缓存,并清空所有todolist项。

具体功能的实现

HTML代码





 
 todolist-prime
 



 

未完成

已完成

JS代码及分析

立即学习Java免费学习笔记(深入)”;

创建一个数组对象来保存用户输入的数据,数组的每一项都是一个对象,对象的"todo"属性保存着用户输入的数据,"done"属性可理解为用户输入数据的标签,主要用来对"todo"值进行分类。

每次用户输入完数据,都要更新缓存,并初始化输入框。


function addTodolist(e) {
 var obj_list = {
  todo: "", //用于存储用户输入的数据
  done: false  //初始化用户输入的数据属性,以便对用户待办事项进行分类
 };
 document.getElementById("add_list").value = document.getElementById("add_list").value.trim();
 if (document.getElementById("add_list").value.length === 0){
  alert("不能为空");
  return;
 }

 obj_list.todo = document.getElementById("add_list").value;
 todolist.push(obj_list);

 saveData(todolist);

 document.getElementById("add_list").value = "";  //初始化输入框
 load();  //将用户输入的数据添加至dom节点
 document.getElementById("add_list").focus();
}

将输入的数据添加至dom节点,并且根据输入数据属性("done")的值进行分类。


function load(){
 var todo = document.getElementById("todolist"),
  done = document.getElementById("donelist"),
  todocount = document.getElementById("todocount"),
  donecount = document.getElementById("donecount"),
  todoString = "",
  doneString = "",
  todoCount = 0,
  doneCount = 0;
 document.getElementById("add_list").focus();

 todolist = loadData();

 //todolist数组对象里若包含用户输入数据,则将其添加至dom节点;若为空对象,则初始化页面。
 if (todolist != null){
  for (var i=0; i"
     + "

" + todolist[i].todo + "

" + "-" + ""; //将每次用户输入的数据,通过节点

利用id标记,以便后续编辑功能定位 todoCount ++; } else{ doneString += "

  • " + "" + "

    " + todolist[i].todo + "

    " + "-" + "
  • "; doneCount ++; } } todo.innerHTML = todoString; done.innerHTML = doneString; todocount.innerHTML = todoCount; donecount.innerHTML = doneCount; } else { todo.innerHTML = ""; done.innerHTML = ""; todocount.innerHTML = 0; donecount.innerHTML = 0; } }

    击事项触发编辑事件,将可编辑表单控件插入段落中,并将用户输入的值通过update函数对todolist数组里存储的数据进行更新


    function edit(i) {
     var p = document.getElementById('p-' + i),
      pContent = p.innerHTML,
      inputId;
    
    //通过upadate函数对todolist数组相应项进行更新,将用户输入的内容写入到todolist数组相应项的todo属性中
     function confirm() {
      if (inputId.value.length === 0) {
       p.innerHTML = pContent;
       alert("内容不能为空");
      }
      else {
       update(i, "todo", inputId.value); //修改事项内容后,更新数组里对应项"todo"属性的值,以便更新dom节点
      }
     }
    
    //结合keypress事件,按下enter键,调用confirm函数
     function enter(e) {
      if (e.keyCode == 13){
       confirm();
      }
     }
    
     p.innerHTML = "";
     inputId = document.getElementById('input-'+i);
     inputId.focus();
     inputId.setSelectionRange(0, inputId.value.length);
     inputId.onblur = confirm; //表单控件失去焦点,调用confirm函数,即对页面内容进行更新
     inputId.onkeypress = enter;  //对按键事件进行监控
    }

    将数组todolist相应项的属性(“todo”或“done”)进行更新,并加载


    function update(i, field, value) { 
     todolist[i][field] = value; 
     saveData(todolist); 
     load(); 
    }

    删除相应项,并加载

    秒哒
    秒哒

    秒哒-不用代码就能实现任意想法

    下载


    function remove(i) { 
     todolist.splice(i, 1); 
     
     saveData(todolist); //相同名称的缓存会覆盖,更新缓存 
     
     load(); 
    }

    将用户数据保存至本地缓存


    function saveData(data) { 
     localStorage.setItem("mytodolist", JSON.stringify(data)); //JS对象转换成JSON对象存进本地缓存 
    }

    从本地缓存中获取数据,有数据,赋值给todolist,这样刷新页面用户数据依旧存在


    function loadData() { 
     var hisTory = localStorage.getItem("mytodolist"); 
     if(hisTory !=null){ 
      return JSON.parse(hisTory);  //JSON对象转换为JS对象 
     } 
     else { return []; } 
    }

    清楚本地缓存


    function clear() { 
     localStorage.clear(); 
     load(); 
    }

    一系列事件的监听


    window.addEventListener("load", load); //页面加载完毕调用load函数 
    document.getElementById("clearbutton").onclick = clear; 
    document.getElementById("add_list").onkeypress = function (event) { 
     if(event.keyCode === 13){ 
      addTodolist(); 
     } 
    };

    CSS


    body {
      margin: 0px;
      padding: 0px;
      font-size: 16px;
      background-color: gainsboro;
    }
    header {
      height: 50px;
      background-color: cornflowerblue;
    }
    header section {
      margin: 0 auto;
      width: 40%;
    }
    
    header section label {
      float: left;
      line-height: 50px; /*设置line-height和包含块高度一致,以实现行内元素垂直居中*/
      font-size: 20px;
    }
    
    #add_list {
      float: right;
      margin-top: 11px;
      width: 60%;
      height: 24px;
      border-radius: 5px;
      box-shadow: 0 1px 0 black;
      font-size: 18px;
      text-indent: 10px;
    }
    
    h1 {
      position: relative;
    }
    
    h1 span {
      position: absolute;
      top: 1px;
      right: 5px;
      display: inline-block;
      width: 23px;
      height: 23px;
      border-radius: 23px;  /*创建圆形标记*/
      line-height: 23px;
      font-size: 18px;
      text-align: center;
      background: #E6E6FA;
    }
    
    .content {
      width: 40%;
      margin: 0 auto;
    }
    
    li {
      position: relative;
      margin-bottom: 10px;
      border-radius: 5px;
      padding: 0 10px;
      height: 32px;
      box-shadow: 0 1px 0 black;
      line-height: 32px;
      background-color: burlywood;
      list-style: none;
    }
    
    ol li input {
      position: absolute;
      top: 4px;
      left: 10px;
      width: 20px;
      height: 20px;
      cursor: pointer;
    }
    p{
      margin: 0;
    }
    ol li p {
      display: inline;
      margin-left: 35px;
    }
    
    ol li p input{
      top: 5px;
      margin-left: 35px;
      width: 70%;
      height: 14px;
      font-size: 14px;
      line-height: 14px;
    }
    
    ol li a {
      position: absolute;
      top: 8px;
      right: 10px;
      display: inline-block;
      border: 1px;
      border-radius: 50%;
      width: 16px;
      height: 16px;
      font-size: 32px;
      line-height: 10px;
      color: red;
      font-weight: bolder;
      cursor: pointer;
      background-color: gray;
    }
    
    #clear {
      width: 100px;
      margin: 0 auto;
    }
    
    #clearbutton {
      border-color: red;
      border-radius: 5px;
      box-shadow: 0 1px 0 yellow;
      cursor: pointer;
    }
    
    button h3{
      font-size: 13px;
      line-height: 13px;
    }

    相关推荐:

    vue.js todolist如何实现

    关于vue.js todolist实现的示例

    用React实现TodoList的详细步骤

    相关文章

    java速学教程(入门到精通)
    java速学教程(入门到精通)

    java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
    包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

    本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

    47

    2026.02.10

    MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法
    MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法

    本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。

    34

    2026.02.10

    谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程
    谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程

    本专题汇总了谷歌邮箱网页版的最新登录入口和注册方法,详细提供官方账号快速访问方式、网页版操作教程及安全登录技巧,帮助用户轻松管理Gmail邮箱账户,实现高效、安全的邮箱使用体验。

    25

    2026.02.10

    铁路12306订票与退改全攻略_高效购票与座位选取技巧
    铁路12306订票与退改全攻略_高效购票与座位选取技巧

    本专题全面汇总铁路12306订票、退票、改签及候补订单操作技巧,提供车厢座位分布参考、抢票攻略和高铁安检注意事项,帮助新手用户快速掌握高效购票与退改流程,提高出行效率和体验。

    31

    2026.02.10

    TensorFlow2深度学习模型实战与优化
    TensorFlow2深度学习模型实战与优化

    本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。

    0

    2026.02.10

    Vue3组合式API与组件开发实战
    Vue3组合式API与组件开发实战

    本专题讲解 Vue 3 组合式 API 的核心概念与应用技巧,深入分析响应式系统、生命周期管理、组件设计与复用策略。通过完整项目案例,指导前端开发者实现高性能、结构清晰的 Vue 应用,提升开发效率与代码可维护性。

    4

    2026.02.10

    Go语言微服务架构与gRPC实战
    Go语言微服务架构与gRPC实战

    本专题面向有 Go 基础的开发者,系统讲解微服务架构设计与 gRPC 的高效应用。内容涵盖服务拆分、RPC 通信、负载均衡、错误处理、服务注册与发现等关键技术。通过实战案例,帮助开发者搭建高性能、可扩展的 Go 微服务系统。

    1

    2026.02.10

    React 18状态管理与Hooks高级实践
    React 18状态管理与Hooks高级实践

    本专题专注于 React 18 的高级开发技术,详细讲解 useState、useEffect、useReducer、useContext 等 Hooks 的使用技巧,以及 Redux、Zustand 等状态管理工具的集成与优化方法。通过真实案例,帮助前端开发者构建可维护、性能优良的现代 React 应用。

    4

    2026.02.10

    Node.js后端开发与Express框架实践
    Node.js后端开发与Express框架实践

    本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

    2

    2026.02.10

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    React 教程
    React 教程

    共58课时 | 4.9万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 2.9万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 3.3万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号