0

0

原生JavaScript中如何实现todolist功能

亚连

亚连

发布时间:2018-06-02 09:57:51

|

2611人浏览过

|

来源于php中文网

原创

本篇文章给大家介绍了通过原生javascript实现todolist功能相关知识点,对此有需要的朋友可以学习下。

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

主要功能:

  • 将用户输入添加至待办项

  • 可以对todolist进行分类,用户勾选即将待办项分入已完成组

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

  • todolist的每一项可删除和编辑

  • 将用户输入数据写入localStorage本地缓存,实现对输入数据的保存

  • 可以清楚域名下本地缓存,并清空所有todolist项

具体功能的实现

HTML代码




 
 todolist-prime
 



 

未完成

已完成

JS代码及分析

创建一个数组对象来保存用户输入的数据,数组的每一项都是一个对象,对象的"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")的值进行分类。

BizPower CRM客户管理系统
BizPower CRM客户管理系统

通过使用BizPower CRM解决方案,您的员工、生产过程及信息能够与客户保持着平稳、无间断的联络,并且能够通过以客户为焦点、创新的产品和服务;以客户为中心,更高层次的生产过程;持久有益的客户关系这三个方面创造有价值客户的领导关系。选择Bizpower CRM的原因1、灵活的数据权限和功能权限BizPower CRM 系统通过引入了灵活的数据权限和功能权限,模仿现实中协同工作的实际情况。 实现企

下载
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;
    }

    最后的实现效果

    上面是我整理给大家的,希望今后会对大家有帮助。

    相关文章:

    通过Angular利用内容投射向组件输入ngForOf模板的方法步骤有哪些?

    通过axios全局请求参数设置请求以及返回拦截器操作步骤有哪些?

    有关处理axios拦截设置和错误处理的方法?

    相关文章

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

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

    下载

    相关标签:

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

    相关专题

    更多
    php源码安装教程大全
    php源码安装教程大全

    本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

    7

    2025.12.31

    php网站源码教程大全
    php网站源码教程大全

    本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

    4

    2025.12.31

    视频文件格式
    视频文件格式

    本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

    7

    2025.12.31

    不受国内限制的浏览器大全
    不受国内限制的浏览器大全

    想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

    7

    2025.12.31

    出现404解决方法大全
    出现404解决方法大全

    本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

    42

    2025.12.31

    html5怎么播放视频
    html5怎么播放视频

    想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

    4

    2025.12.31

    关闭win10系统自动更新教程大全
    关闭win10系统自动更新教程大全

    本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

    3

    2025.12.31

    阻止电脑自动安装软件教程
    阻止电脑自动安装软件教程

    本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

    3

    2025.12.31

    html5怎么使用
    html5怎么使用

    想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

    2

    2025.12.31

    热门下载

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

    精品课程

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

    共58课时 | 3.1万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 1.9万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 2.7万人学习

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

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