利用前端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日

相关文章

  • JavaScript截屏功能的实现代码

    我来为您讲解“JavaScript截屏功能的实现代码”的完整攻略。 1. 基本思路 实现JavaScript截屏功能的基本思路是,使用HTML5新增的Canvas元素,将页面上需要截屏的部分绘制到Canvas上,然后将Canvas转换为图片格式保存。具体步骤如下: 创建Canvas元素和Context对象 绘制需要截屏的部分到Canvas上 将Canvas转…

    css 2023年6月10日
    00
  • H5页面适配iPhoneX(就是那么简单)

    下面是“H5页面适配iPhoneX(就是那么简单)”的完整攻略。 一、了解iPhoneX全面屏设计 作为iPhone最新一代产品,iPhoneX全面屏的设计对于H5页面的适配来说是一个很大的挑战。iPhoneX所采用的全面屏设计,最大的特点就是顶部存在“刘海”,底部没有Home键,因此在适配时需要考虑到这些特殊的设计要素。 二、viewport和safe a…

    css 2023年6月10日
    00
  • 详解CSS3+JS完美实现放大镜模式

    下面是详解“详解CSS3+JS完美实现放大镜模式”的完整攻略。 1. 确定需求 首先我们需要确立需要实现的需求:实现一个放大镜模式,当用户鼠标移动到小图上时,大图会显示相应的局部区域,使用户能够更清晰地看到细节。 2. 准备所需资源和环境 接下来,准备所需的资源和环境: 一张小图和一张大图 HTML和CSS代码 JavaScript代码 3. HTML结构 …

    css 2023年6月10日
    00
  • css实现右侧固定宽度 左侧宽度自适应

    要实现右侧固定宽度、左侧宽度自适应的效果,可以使用CSS中的float属性和盒模型的原理来实现。下面是具体的实现步骤: HTML结构的编写 首先,我们需要明确左右两侧元素的父容器。在父容器中,先写一个右侧的固定宽度的元素,再写一个左侧的自适应宽度的元素,可以使用div标签。此外,还可以考虑加上一个clearfix类,避免浮动元素的影响。 示例代码: <…

    css 2023年6月10日
    00
  • jQuery CSS()方法改变现有的CSS样式表

    下面是关于“jQuery CSS()方法改变现有的CSS样式表”的完整攻略: 1. 什么是jQuery CSS()方法? 在jQuery中,CSS()方法用来获取或设置一个或多个元素的CSS属性。这个方法接受两个参数:CSS属性和值。可以在一个CSS属性和值的对象上调用CSS()方法,也可以在两个单独的参数上调用。例如: $( "p" )…

    css 2023年6月9日
    00
  • 微信小程序 如何引入外部字体库iconfont的图标

    请看以下的详细讲解: 一、前置准备工作 在进行外部字体库iconfont的图标引入之前,需要先确保以下工作已经完成: 在微信公众平台中创建小程序,并获得小程序的APPID。 在iconfont(https://www.iconfont.cn/)中选择需要引入的字体库,并下载当前字体库的包。 二、引入iconfont字体库 解压下载的字体包,将其中的iconf…

    css 2023年6月9日
    00
  • Bootstrap优化站点资源、响应式图片、传送带使用详解3

    Bootstrap优化站点资源、响应式图片、传送带使用详解3 在这篇文章中,我们将介绍如何使用Bootstrap框架来优化您的站点资源和处理响应式图片。此外,我们还将讲解如何使用Bootstrap的传送带组件来创建漂亮的幻灯片和图片轮播。 优化站点资源 优化站点资源可以大大提高您的站点性能,使页面加载速度更快。使用Bootstrap可以使您的工作更轻松。 通…

    css 2023年6月9日
    00
  • Dreamweaver设置页面属性后采用HTML格式怎么办?

    如果在Dreamweaver中设置页面属性后,采用了HTML格式,有两种方法解决这个问题:使用CSS样式表和内联样式。 方法一:使用CSS样式表 步骤1:选择“文本” → “CSS样式” → “新样式”。 步骤2:在“新样式”窗口中,输入新的样式名称并选择“所在文件”。 步骤3:在新窗口中,根据需要设置文本属性,如字体、颜色、大小等。 步骤4:单击“应用”按…

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