• 【精讲】利用原生js实现todolist


    通过原生js实现todolist:

    第一部分:css样式部分

    body {margin:0;padding:0;font-size:16px;background: #CDCDCD;}
    header {height:50px;background:#333;background:rgba(47,47,47,0.98);}
    section{margin:0 auto;}
    label{float:left;width:100px;line-height:50px;color:#DDD;font-size:24px;cursor:pointer;font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;}
    header input{float:right;width:60%;height:24px;margin-top:12px;text-indent:10px;border-radius:5px;box-shadow: 0 1px 0 rgba(255,255,255,0.24), 0 1px 6px rgba(0,0,0,0.45) inset;border:none}
    input:focus{outline-width:0}
    h2{position:relative;}
    span{position:absolute;top:2px;right:5px;display:inline-block;padding:0 5px;height:20px;border-radius:20px;background:#E6E6FA;line-height:22px;text-align:center;color:#666;font-size:14px;}
    ol,ul{padding:0;list-style:none;}
    li input{position:absolute;top:2px;left:10px;width:22px;height:22px;cursor:pointer; border: none;}
    p{margin: 0;}
    li p input{top:3px;left:40px;width:70%;height:20px;line-height:14px;text-indent:6px;font-size:14px;}
    li p input:focus{outline:1px solid #000;margin-top:2px;}
    li{height:32px;line-height:32px;background: #fff;position:relative;margin-bottom: 10px;
        padding:0 45px;border-radius:3px;border-left: 5px solid #629A9C;box-shadow: 0 1px 2px rgba(0,0,0,0.07);}
    ol li{cursor:move;}
    ul li{border-left: 5px solid #999;opacity: 0.5;}
    li a{position:absolute;top:2px;right:5px;display:inline-block;width:14px;height:12px;border-radius:14px;border:6px double #FFF;background:#CCC;line-height:14px;text-align:center;color:#FFF;font-weight:bold;font-size:14px;cursor:pointer;}
    footer{color:#666;font-size:14px;text-align:center;}
    footer a{color:#666;text-decoration:none;color:#999;}
    @media screen and (max-device-width: 620px) {section{width:96%;padding:0 2%;}}
    @media screen and (min-width: 620px) {section{width:600px;padding:0 10px;}}

    HTML内容部分:



        
            
             
            ToDoList—最简单的待办事项列表
            
            
        
        
            


                

                   

                    
                 

                

            

            

                

    正在进行


                

                  

                

    已经完成


                

                  

            

            

                Copyright © 2014 todolist.cn clear
            

            
        

    js内容部分:

    var title = document.querySelector("#title");
    var ol = document.querySelector("#todolist");
    var ul = document.querySelector("#donelist");
    locd()
    // 回车存储数据
    title.addEventListener('keyup',function(e){
        // 这里是所以调用是因为每执行一次就需要将数据保存到数组中一次
            var arr = getData()
        // 这里必须使用e.keyCode否则失效
        if(e.keyCode == 13){
          var todo = {
              title:title.value,
              done:false
          }
          // 根据 getData() 获取的数据返回值,调用至该函数后将数据存入数组中
          arr.push(todo);
          // 传入一个实参
           cunchu(arr);
          // 获取form表单验证
          // var form = document.querySelector('#form')
          // // reset()是重置属性  在这里重置表单提交内容
          // form.reset()
          var form = document.querySelector('#form')
          form.reset()
          locd()
        }     
    })
    // 存储数据
    function  cunchu(shuzu){
        // 将数据存起来
        window.localStorage.setItem('todo',JSON.stringify(shuzu))
    }
    // 获取数据
    function getData(){
        // 之所以将localStorage.getItem('todo')放置在该位置 因获取存储的数据 对数据进行解析转换为字符串的格式
      var data = window.localStorage.getItem('todo')
      // 通过上面data 所获取的值在下面进行判断,(获取到值不为空(意味着可以解析),那么就执行第一个,否则执行第二个)
      if(data != null){
         // 解析data所获取的值为字符型/数组
         return JSON.parse(data)
      }else{
          // 若获取到值 不为数组 那么先返回一个数组将数据放在数组中
          return []
      }
    }
    // 加载数据
    function  locd(){
        //获取页面标签
        var todocount = document.querySelector("#todocount")
        var donecount = document.querySelector('#donecount')
        // 设置num1与num2起始值都为空
        var num1=0;
        var num2=0;
        // 每次调用都让页面中的ol,ul内部的子级都清空一次
        ol.innerHTML='';
        ul.innerHTML='';
        // 调用获取的数据遍历forEach循环   随后创建li并且将li里的值打印到页面中
        var data=getData();
        data.forEach((item,index)=>{
            var li=document.createElement('li')
        li.innerHTML= `

    ${item.title}

    -`
        // 判断item中的值是true还是false
        if(item.done){
            // 是true,说明已经点击,则将数据传入ul列表中去
            ul.insertBefore(li,ul.children[0])
            li.children[0].checked = 'checked';
              num2++
        }else{
            // 若是false说明未点击,将数据传入ol列表中去
            ol.insertBefore(li,ol.children[0]);    
            num1++
        }
        })
        // 通过上面的num1与num2可以动态计算列表内部有多少个子级
        todocount.innerHTML = num1;
        donecount.innerHTML = num2;
    }
    // 编辑数据
    function bianji(){
        ol.addEventListener('dblclick',function(e){
            var p = e.target;
            if(e.target.nodeName == 'P'){
             p.innerHTML = ``
           // 点击后,使每一个子级选中
            p.children[0].select();
            p.children[0].addEventListener('blur',function(e){
                //获取数据
                var shuju = getData();
                // 截取字符串 下标是1
                var i = p.id.substring(1);
                // 将当前编辑好的数据修改
                shuju[i].title = this.value;
                 cunchu(shuju);
                 locd()
            })
            }
        })
    }
    bianji();
    // 删除数据
    function remove(){
        ol.addEventListener('click',function(e){
            //这里是点击a删除数据  所以后面的a需要大写
            var p = e.target;
            if(p.nodeName == 'A'){
                // 调用获取的数据,可对数组中删除指定元素或者插入元素、替换元素。这里是删除
                var i = p.id
                var data = getData();
                data.splice(i,1);
                cunchu(data);
                locd()
            }
        })
    }
    remove();
    //切换正在进行完成
    // 传入两个参数  第一个是列表(ol/ul)  第二个是传入的值判断是true还是false  (适用于上下传切换)
    function change(teml,tell){
        teml.addEventListener('click', function(e) {
            var input = e.target
            if (input.nodeName == 'INPUT') {
                var i = input.nextElementSibling.nextElementSibling.id;
                var data = getData();
                data[i].done =tell;
                cunchu(data);
                locd()
            }
        })
    }
     change(ol,true);
     change(ul,false);

  • 相关阅读:
    2022.07月总结
    0826(040天 集合框架05 亿点总结)
    应用案例 | 基于三维机器视觉的机器人麻袋拆垛应用解决方案
    数据仓库:金融/银行业的分层架构篇
    前端利器躬行记(8)——VSCode插件研发
    【SemiDrive源码分析】【驱动BringUp】41 - LCM 驱动 backlight 背光控制原理分析
    GO微服务实战第十节 案例:微服务 Docker 容器化部署和 Kubernete 容器编排
    【优化充电】粒子群算法电动汽车充电动态优化策略【含Matlab源码 2163期】
    linux安装fbprophet程序库
    现代检测技术课程实验编程:波特图分析仪原理仿真:一阶检测系统编程仿真
  • 原文地址:https://blog.csdn.net/m0_59505309/article/details/126122280