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怎么在子组件中显示父组件传递

    相关专题

    更多
    php文件怎么打开
    php文件怎么打开

    打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

    2363

    2023.09.01

    php怎么取出数组的前几个元素
    php怎么取出数组的前几个元素

    取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

    1536

    2023.10.11

    php反序列化失败怎么办
    php反序列化失败怎么办

    php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

    1435

    2023.10.11

    php怎么连接mssql数据库
    php怎么连接mssql数据库

    连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

    951

    2023.10.23

    php连接mssql数据库的方法
    php连接mssql数据库的方法

    php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

    1413

    2023.10.23

    html怎么上传
    html怎么上传

    html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

    1233

    2023.11.03

    PHP出现乱码怎么解决
    PHP出现乱码怎么解决

    PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    1445

    2023.11.09

    php文件怎么在手机上打开
    php文件怎么在手机上打开

    php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    1305

    2023.11.13

    c++主流开发框架汇总
    c++主流开发框架汇总

    本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

    25

    2026.01.09

    热门下载

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

    精品课程

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

    共58课时 | 3.5万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 2.1万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 2.8万人学习

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

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