• 原生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. }

  • 相关阅读:
    OceanBase TableAPI实践案例(Rust)
    Canvas动画
    【C++】图的存储 -- 邻接表
    【云原生】配置Kubernetes CronJob自动备份Clickhouse数据库(单机版)
    【面试刷题】——C++四种类型转化
    动态规划:子序列问题(C++)
    C++交叉编译grpc
    C++--map和set--1027
    纯干货内容:关于ivx和mendix的对比 还在犹豫选择那个低代码平台的小伙伴看过来
    前端监控系列2 |聊聊 JS 错误监控那些事儿
  • 原文地址:https://blog.csdn.net/weixin_69761220/article/details/126165709