• 前端|做一个TODO,练习DOM操作(原生JS版本)


    这是我在github上的todo例子,大家感兴趣的话可以先去看看。

    原生js版本:https://github.com/remy-cpu/VanillaJS-Todo

    jQuery版本:https://github.com/remy-cpu/JQuery-Todo

    可参考例子:todoMVC 。

    界面样式

    功能需求

    • 添加 / 删除 todo
    • 完成 / 取消完成 todo
    • 显示所有/ 未完成/ 已完成/ 已删除 的 todo
    • 显示已完成的todo的数目和所有todo的数目
    • 提供修改 todo 功能
    • 清除所有已经完成的 todo
    • 添加回收站功能,可以查看所有已删除的todo,可以从已删除的todo中恢复todo,可以清空回收站
    • 尝试给todo加上优先级(高级、中级、无优先级)。优先级高的会显示在比较靠上面。(同级“后来者居上”)
    • 添加用户验证: 登录注销,利用 Local Storage

     

    接下来我们会详细地讲解这些功能的实现,大家准备好了吗?嘿嘿。

    主要思路:我们做添加、删除、优先级设置等操作时,都会把这些参数(或者说状态)保存到本地里, 然后重新渲染页面load( ).

    准备工作

    //读取本地数据
      function getData() {
        var data = localStorage.getItem("storeUsers");
        if (data !== null) {
          return JSON.parse(data);
        } else {
          return [];
        }
      }
      //保存本地存储数据
      function saveData(data) {
        localStorage.setItem("storeUsers", JSON.stringify(data));
      }
    
      //获取删除的数据
      function getDeleted() {
        var data = localStorage.getItem("dels");
        if (data !== null) {
          return JSON.parse(data);
        } else {
          return [];
        }
      }
    
      //保存删除的数据
      function saveDeleted(data) {
        localStorage.setItem("dels", JSON.stringify(data));
      }

    添加 / 删除 todo

    1、添加issue

    分析:我们在input文本框输入issue,按下回车键,将这条issue存入users数组中,在经过渲染页面,插入到页面中。

    //最终本地存储数据示例
    [
      {
        name: "11",//用户名
            password: "123456",//用户密码
            todos: [{
            title: "23",            //issue具体内容
            completed: false, //issue完成情况
            priority: 0            //issue优先级
          }]
      }
    ]
    
    //保存删除的数据是为我们之后做回收站功能做准备
    [
      {
        name:"11",
      done:[{
            title: "23",            //issue具体内容
            completed: false, //issue完成情况
            priority: 0            //issue优先级
           }]
     }
    ]
    function addItem() {
          //创建新的li
          var input = document.querySelector('.input');
          input.onkeyup = function (e) {
            //如果文本框内容为空,就弹出警告框,想好看点也可以自己做一个提示框
            if (input.value == '') {
              alert("输入内容不能为空");
              return false;
            }
            //如果按下的是回车键
            if (e.keyCode == 13) {
              //必须先登录
              if (!online) {
                showTips("请先登录 !");
                input.value = '';
                return false;
              }
              
              //获取数组
              var users = getData();
              //找到这是users数组中的第几个用户
              cnt = Match(users);
              
              //找到的todos数组中第一个优先级为0的issue
              var index;
              for (var i = 0; i < users[cnt].todos.length; i++) {
                if (users[cnt].todos[i].priority == 0) {
                  index = i;
                  break;
                }
              }
              
              //每一条issue的基本形式
              var obj = {
                title: this.value,
                completed: false,
                priority: 0        //刚添加的issue的优先级都为零
              };
              
              //这里是体现同级者后来居上
              //将新的issue插入到你找到的todos数组中第一个优先级为0的issue前面
              users[cnt].todos.splice(index, 0, obj);
              //保存数组
              saveData(users);
              //每次都先把新的li添加到本地存储,再连同之前的issue一起渲染到页面上
              load();
              
              //清空文本框的内容
              input.value = '';
            }
          }
        }

    接下来会继续更新,希望和大家多多交流!!

  • 相关阅读:
    C加加学习之路 1——开始
    哈夫曼树C++实现详解
    Linux常用命令
    Accp第二章:基础知识
    第一章Accp 8.0
    泛型集合
    深入C#数据类型
    初始wondows系统
    深入.NET框架
    二至十五章总结
  • 原文地址:https://www.cnblogs.com/isremya/p/13416229.html
Copyright © 2020-2023  润新知