利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)

下面是利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)的完整攻略。

准备工作

首先,我们需要创建一个HTML文件,并链接上CSS和JS文件。其中,CSS文件用于样式的设置,JS文件用于实现页面的动态效果和交互逻辑。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>TODOLIST</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <h1>TODOLIST</h1>

  <form>
    <input type="text" id="new-todo" placeholder="What needs to be done?" autofocus>
  </form>

  <ul id="todo-list"></ul>

  <script src="todo.js"></script>
</body>
</html>

实现功能

接下来,我们需要使用JS代码实现TODOLIST的各种功能,包括添加、删除、修改和完成任务等。

添加任务

首先,我们需要为输入框添加keydown事件,并在用户按下回车键时,创建一个新的li元素,并将用户输入的内容插入到其中。同时,我们还需要将新的任务存储到本地存储中,以便在页面刷新后可以继续使用。

const todoInput = document.getElementById('new-todo');
const todoList = document.getElementById('todo-list');

let todos = JSON.parse(localStorage.getItem('todos')) || [];

function addTodo() {
  if (!todoInput.value.trim()) return;

  const todo = {
    id: Date.now().toString(),
    title: todoInput.value.trim(),
    completed: false
  };

  todos.push(todo);

  localStorage.setItem('todos', JSON.stringify(todos));

  const li = document.createElement('li');
  const checkbox = document.createElement('input');
  const label = document.createElement('label');
  const button = document.createElement('button');

  li.setAttribute('data-id', todo.id);
  checkbox.setAttribute('type', 'checkbox');
  checkbox.setAttribute('id', 'todo-' + todo.id);
  label.setAttribute('for', 'todo-' + todo.id);
  label.textContent = todo.title;
  button.textContent = 'x';

  li.appendChild(checkbox);
  li.appendChild(label);
  li.appendChild(button);
  todoList.appendChild(li);

  todoInput.value = '';
}

todoInput.addEventListener('keydown', event => {
  if (event.key === 'Enter') {
    event.preventDefault();
    addTodo();
  }
});

删除任务

接下来,我们需要为删除按钮添加click事件,并在用户点击按钮时,删除对应的任务。同时,我们还需要在本地存储中删除对应的任务。

todoList.addEventListener('click', event => {
  if (event.target.tagName === 'BUTTON') {
    const li = event.target.parentNode;
    const id = li.getAttribute('data-id');

    todos = todos.filter(todo => todo.id !== id);

    localStorage.setItem('todos', JSON.stringify(todos));

    li.remove();
  }
});

修改任务

接下来,我们需要为任务标题添加dblclick事件,并在用户双击标题时,将其变为可编辑状态。同时,我们需要为input元素添加blur事件,并在用户离开input元素时,将其变为不可编辑状态,并将修改后的内容保存到本地存储中。

todoList.addEventListener('dblclick', event => {
  if (event.target.tagName === 'LABEL') {
    const label = event.target;
    const input = document.createElement('input');

    input.setAttribute('type', 'text');
    input.setAttribute('value', label.textContent);

    label.replaceWith(input);

    input.focus();

    input.addEventListener('blur', () => {
      const li = input.parentNode;
      const id = li.getAttribute('data-id');

      todos = todos.map(todo => {
        if (todo.id === id) {
          todo.title = input.value.trim();
        }
        return todo;
      });

      localStorage.setItem('todos', JSON.stringify(todos));

      const label = document.createElement('label');

      label.setAttribute('for', 'todo-' + id);
      label.textContent = input.value.trim();

      input.replaceWith(label);
    });
  }
});

完成任务

最后,我们需要为复选框添加change事件,并在用户勾选复选框时,将对应的任务标记为已完成。同时,我们需要在本地存储中保存任务的完成状态。

todoList.addEventListener('change', event => {
  if (event.target.tagName === 'INPUT') {
    const li = event.target.parentNode;
    const id = li.getAttribute('data-id');

    todos = todos.map(todo => {
      if (todo.id === id) {
        todo.completed = event.target.checked;
      }
      return todo;
    });

    localStorage.setItem('todos', JSON.stringify(todos));

    li.classList.toggle('completed', event.target.checked);
  }
});

示例说明

以下是两个使用示例:

示例1

例如,我们现在需要添加一个名为“吃早餐”的任务,我们可以在输入框中输入“吃早餐”,然后按下回车键,就可以在页面上看到一个新的任务出现。同时,我们可以在本地存储中查看该任务是否已经被保存。

示例2

例如,现在有一个名为“做饭”的任务,我们已经完成了这个任务。在页面上,我们可以勾选该任务对应的复选框,此时该任务会被标记为已完成。同时,我们也可以在本地存储中查看该任务的完成状态是否已经被更新。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本) - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • Vue.js实现网格列表布局转换方法

    Vue.js是一种流行的JavaScript框架,主要用于构建交互式响应式Web应用程序,它提供了丰富的工具和插件来简化项目的开发。本篇文章将详细讲解如何使用Vue.js实现网格列表布局的转换方法。 实现原理 网格列表布局是将一个网格布局转换为列表布局的过程,即将原先按照固定网格分布的样式,转换为逐行排列的样式,便于移动端和小屏幕设备的展示。实现的基本步骤如…

    css 2023年6月9日
    00
  • jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果

    下面我将详细讲解如何用jQuery实现动画菜单的左右滚动、渐变及图形背景滚动等效果。 实现动画菜单左右滚动效果 首先,在HTML中准备好需要滚动的菜单项,并给每一项分配一个对应的类名或者ID。例如,我们假设需要左右滚动的菜单项都属于“scroll-menu”类。 接下来,在CSS中为菜单项添加样式。我们需要为其添加一些基础的样式,例如宽度、高度、边框、背景颜…

    css 2023年6月10日
    00
  • jQuery插件animateSlide制作多点滑动幻灯片

    让我详细讲解一下“jQuery插件animateSlide制作多点滑动幻灯片”的完整攻略。 1. 准备工作 要制作一个jQuery插件animateSlide,需要先准备好以下工作: 安装jQuery库文件; 安装jQuery UI库文件; 编写html结构; 编写CSS样式; 编写JS代码。 2. 编写html结构 先来看一下一个基础的html结构: &l…

    css 2023年6月9日
    00
  • div+css设置div的背景为半透明的方法

    Div 是文档中常用的一个标签元素,可以用来表示文档的一部分,这里将详细讲解如何使用 CSS 给 div 元素设置背景色半透明的方法。 使用 CSS 设置背景色半透明的方法 设置 div 元素不透明的一种方法是使用 RGBA 颜色值,RGBA 是一种带透明度的颜色格式,其中 R、G、B 表示颜色的 RGB 值,A 表示透明度,范围从 0(完全透明)到 1(完…

    css 2023年6月9日
    00
  • 如何通过 CSS 写出火焰效果

    如何通过 CSS 写出火焰效果? 通过 CSS 写出火焰效果可以为网页增添一份动感和活力。以下是关于如何通过 CSS 写出火焰效果的完整攻略。 步骤一:创建 HTML 结构 首先,需要在 HTML 文件中创建一个容器元素,用于包含火焰效果。以下是一个示例: <div class="fire"></div> 步骤二:…

    css 2023年5月18日
    00
  • 使用CSS的clip-path属性实现不规则图形的显示

    使用CSS的clip-path属性可以实现不规则图形的显示。它能够将元素裁剪成各种形状,让你可以创造出独特的图形效果。下面是具体的攻略: 1. 了解clip-path属性 clip-path属性是用来设置元素裁剪路径的。它可以取值为none、url()、inset()、circle()、ellipse()、polygon()等,其中最常用的是polygon(…

    css 2023年6月10日
    00
  • bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)

    Bootstrap是由Twitter公司推出的一个前端开发框架,因为其灵活性、易用性和兼容性,被越来越多的前端工程师使用。本文将详细介绍如何在网页中使用Bootstrap的导航条、下拉菜单、轮播和栅格布局等常用功能。 一、导航条 导航条是网站中必不可少的部分之一。Bootstrap提供了一些样式和组件,使得我们能够快速地创建漂亮的导航条。以下是一个创建Boo…

    css 2023年6月11日
    00
  • padding盒子内部文字跟盒子之间的距离

    首先,padding 是盒子和其边框之间的空间,而不是盒子内部的空间。因此,padding 会对盒子的大小产生影响,并且也会影响盒子内部内容的位置。 在 CSS 中,我们可以使用 padding 属性来定义盒子的内边距。这个属性可以取一个数值,表示上下左右四个方向的内边距大小(单位可以是 px、em 等),也可以取两个值,表示上下和左右两个方向的内边距大小。…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部