0

0

源生JS怎样实现todolist功能

php中世界最好的语言

php中世界最好的语言

发布时间:2018-04-12 14:55:18

|

2110人浏览过

|

来源于php中文网

原创

这次给大家带来源生JS怎样实现todolist功能,源生JS实现todolist功能的注意事项有哪些,下面就是实战案例,一起来看一下。

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

主要功能:

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

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

    奥硕企业网站管理系统3.0.2
    奥硕企业网站管理系统3.0.2

    临沂奥硕软件有限公司拥有国内一流的企业网站管理系统,奥硕企业网站管理系统真正会打字就会建站的管理系统,其强大的扩展性可以满足企业网站实现各种功能(唯一集成3O多套模版的企业建站系统)奥硕企业网站管理系统具有一下特色功能1、双语双模(中英文采用单独模板设计,可制作中英文不同样式的网站)2、在线编辑JS动态菜单支持下拉效果,同时生成中文,英文,静态3个JS菜单3、在线制作并调用FLASH展示动画4、自

    下载
  • 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")的值进行分类。

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

     相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

    推荐阅读:

    element UI怎么导出Excel

    vue slot怎么在子组件中显示父组件传递

    热门AI工具

    更多
    DeepSeek
    DeepSeek

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

    豆包大模型
    豆包大模型

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

    通义千问
    通义千问

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

    腾讯元宝
    腾讯元宝

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

    文心一言
    文心一言

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

    讯飞写作
    讯飞写作

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

    即梦AI
    即梦AI

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

    ChatGPT
    ChatGPT

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

    相关专题

    更多
    js正则表达式
    js正则表达式

    php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

    514

    2023.06.20

    js获取当前时间
    js获取当前时间

    JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

    244

    2023.07.28

    js 字符串转数组
    js 字符串转数组

    js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

    298

    2023.08.03

    js是什么意思
    js是什么意思

    JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

    5306

    2023.08.17

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    481

    2023.09.01

    js截取字符串的方法
    js截取字符串的方法

    js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

    212

    2023.09.04

    Js中concat和push的区别
    Js中concat和push的区别

    Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

    218

    2023.09.14

    js截取字符串的方法介绍
    js截取字符串的方法介绍

    JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

    219

    2023.09.21

    俄罗斯Yandex引擎入口
    俄罗斯Yandex引擎入口

    2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

    158

    2026.01.28

    热门下载

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

    精品课程

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

    共58课时 | 4.3万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 2.5万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 3.1万人学习

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

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