• 原生js实现todolist案例


    html代码:

    部分css代码:

     

     js代码:

    1. var title = document.getElementById('title');
    2. var todolist = document.getElementById('todolist');
    3. var donelist = document.getElementById('donelist');
    4. var todocount = document.getElementById('todocount');
    5. var donecount = document.getElementById('donecount');
    6. load()
    7. //回车把输入的数据存储到本地
    8. title.addEventListener('keydown', function(e) {
    9. var arr = getData();
    10. if (e.key == 'Enter') {
    11. var todo = {
    12. title: title.value,
    13. done:false
    14. }
    15. arr.push(todo)
    16. saveData(arr)
    17. load()
    18. this.value = ''
    19. }
    20. })
    21. // 给ol添加点击事件
    22. todolist.addEventListener('click', function (e) {
    23. // 调用编辑数据函数
    24. edit(e)
    25. // 调用删除数据函数
    26. remove(e)
    27. change(e)
    28. })
    29. // 给ul添加点击事件
    30. donelist.addEventListener('click', function (e) {
    31. remove(e)
    32. change(e)
    33. })
    34. // 读取本地的数据,为删除,修改,渲染提供方法
    35. function getData(){
    36. // 把json格式的字符串转换成了JSON对象。
    37. var data = localStorage.getItem('todo')
    38. if(data != null){
    39. return JSON.parse(data);
    40. }else{
    41. return [];
    42. }
    43. }
    44. // 存储数据,当删除,修改,渲染,完成之后,更新数据
    45. function saveData(tdlist){
    46. // 把获得的对象转换成 JSON 字符串形式储存
    47. localStorage.setItem('todo',JSON.stringify(tdlist));
    48. }
    49. // 加载数据,渲染到页面
    50. function load(){
    51. // 每次调动都清空ol ul 中的内容,防止出现之前的数据
    52. todolist.innerHTML = ''
    53. donelist.innerHTML = ''
    54. var tocount = 0;
    55. var docount = 0;
    56. // 获得存储的最新数据
    57. var data = getData();
    58. // 循环存储的数据渲染到页面
    59. data.forEach((item, index) => {
    60. // 创建li
    61. var li = document.createElement('li');
    62. // 判断复选框是非选中
    63. if(item.done){
    64. // 选中的话添加到已完成事项中
    65. li.innerHTML = `

      ${item.title}

      ${index}
      >`;
    66. // 把li添加到前面
    67. donelist.insertBefore(li, donelist.children[0]);
    68. // 计数
    69. docount++;
    70. }else{
    71. li.innerHTML = `

      ${index}">${item.title}

      ${index}
      >`;
    72. todolist.insertBefore(li, todolist.children[0]);
    73. tocount++;
    74. }
    75. });
    76. todocount.innerHTML = tocount;
    77. donecount.innerHTML = docount;
    78. }
    79. // 编辑数据
    80. function edit(e){
    81. if(e.target.nodeName == 'P'){
    82. // 当点击p标签时,添加一个ipt框
    83. e.target.innerHTML = `${e.target.innerHTML}" id="ipt${e.target.id}">`;
    84. // 当鼠标获取焦点后全选ipt框中的内容
    85. e.target.children[0].select();
    86. // 鼠标失去焦点后,获取修改后的数据重新储存,并渲染
    87. e.target.children[0].addEventListener('blur', function() {
    88. var data = getData();
    89. var i = e.target.id.substring(1)
    90. data[i].title = this.value
    91. saveData(data)
    92. load()
    93. })
    94. }
    95. }
    96. // 删除数据
    97. function remove(e){
    98. var data = getData();
    99. if(e.target.nodeName == 'A'){
    100. var i = e.target.id
    101. data.splice(i, 1);
    102. saveData(data)
    103. load()
    104. }
    105. }
    106. // 已完成和未完成进行切换
    107. function change(e){
    108. var data = getData();
    109. if(e.target.nodeName == 'INPUT'){
    110. // 获取a的id赋值给 i
    111. var i = e.target.nextElementSibling.nextElementSibling.id
    112. // 当点击那个就把他复选框改成选中状态
    113. data[i].done = e.target.checked
    114. // 重新存储修改后的数据
    115. saveData(data)
    116. // 渲染到页面
    117. load()
    118. }
    119. }

  • 相关阅读:
    nginx部署多个前端项目
    LeetCode 周赛 344(2023/05/07)手写递归函数的固定套路
    kkFileView getCorsFile 任意文件读取漏洞(CVE-2021-43734)
    Mysql8 %中间%模糊搜索 强行 支持 使用 索引 代替全文搜索 全文检索数据库
    前端uniapp块样式写法
    torch lighting 设置多个优化器
    线性代数+分治:446E
    这一次,我们把AI自治数据库带到了世界人工智能大会上
    基于jsp+ssm的家庭理财系统
    [Rust笔记] 我也谈 Box<T>智能指针·实践领悟
  • 原文地址:https://blog.csdn.net/weixin_69761220/article/details/126165709