前端案例:我的备忘录(支持事件的增加、删除和修改,代码完整)

简介: 前端案例:我的备忘录(支持事件的增加、删除和修改,代码完整)

一、案例效果

       如下图,备忘录可添加新事件,对事件进行编辑,删除已有事件,对完成的事件进行标注。

1.gif

二、涉及要点

1. 事件监听

       事件源要与事件绑定后,才能触发对应事件,事件绑定有三种方式:行内事件属性赋值、事件属性赋值、事件监听。


       本案例使用了事件监听的方式进行事件绑定,与其他两种方式的区别在于事件属性多次赋值则只会执行最后一次事件处理程序;而事件监听可以添加多个监听器,执行多个事件处理程序。


事件监听格式为:


addEventListener(type, listener, useCapture)
//type: 事件类型
//listener: 监听器(处理程序)
//useCapture: 默认为false,设置为true时,不会因冒泡触发监听器
//eg:
const btn = document.querySelector('button');
btn.addEventListener('click', function() {
  alert('事件监听')
})

2. DOM 节点操作

(1)常用节点获取方法

image.png

(2)常用节点信息获取方法

image.png

(3)常用节点属性获取方式

image.png

(4)DOM 修改

image.png

(5)DOM 添加

image.png


(6)DOM 删除

image.png

3. DOM 控制 CSS 样式

(1)通过 style 属性控制样式

box.style.color = "#fff"; //将元素中文字设置为白色 
box.style.marginLeft = "100px"; //将元素左外边距设置为100px

(2)通过classList控制样式:

image.png

如果类名存在,则移除它,否则添加它,第二个参数代表无论类名是否存在,强制添加(true)或删除(false)


三、完整代码+详细注释

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>我的备忘录</title>
  <style>
    button {
      cursor: pointer;
    }
    input {
      outline: none;
      background-color: antiquewhite;
      border: none;
      border-radius: 3px;
      width: 250px;
      height: 30px;
      margin: 15px;
    }
    input::-webkit-input-placeholder {
      color: #999;
    }
    /* 解决li前面的点删除后还占空间的问题 */
    ul {
      padding: 0;
      margin: 0;
    }
    ul>li {
      list-style: none;
    }
    .border {
      width: 500px;
      background-color: #999;
      border-radius: 20px;
      margin: auto;
      padding-bottom: 20px;
    }
    .border .title {
      font-size: 24px;
      color: aliceblue;
      line-height: 50px;
      text-align: center;
    }
    .form {
      width: 80%;
      margin: 15px auto;
    }
    .form #add {
      width: 100px;
      height: 30px;
      border-radius: 5px;
      border: 0;
      font-weight: 600;
      font-size: 16px;
      color: #999;
      letter-spacing: 6px;
    }
    /* 每一条li,代表每一条事件 */
    .item {
      display: flex;
      justify-content: space-between;
      line-height: 30px;
      font-size: 14px;
      color: rgb(75, 73, 73);
      padding: 5px 0;
      border-bottom: 1px solid white;
    }
    .item .info {
      margin-left: 10px;
    }
    .list .item .edit,
    .fin,
    .del {
      width: 50px;
      height: 30px;
      border: 0;
      border-radius: 5px;
      color: white;
    }
    .edit {
      background-color: #337ab7;
    }
    .fin {
      background-color: #20c248;
    }
    .del {
      background-color: #d9534f;
    }
    .btn {
      display: inline-block;
      width: 180px;
      margin-right: 0;
    }
    /* 点击完成按钮后所添加的新类名finished */
    .finished {
      color: rgb(112, 110, 110);
      background-color: rgb(197, 190, 190);
      border-radius: 3px
    }
    .finished>.info {
      /* 为文字添加删除线 */
      text-decoration: line-through;
    }
  </style>
</head>
<body>
  <!-- 备忘录外层边框 -->
  <div class="border">
    <!-- 标题 -->
    <div class="title">我的备忘录</div>
    <hr>
    <!-- 输入框和按钮 -->
    <div class="form">
      <input type="text" name="text" placeholder="请填写您的事件">
      <button id="add">添加</button>
    </div>
    <!-- 备忘录事件列表 -->
    <div
      style="width: 94%;margin: auto;border-radius: 3px;box-shadow: 2px 2px rgb(119, 115, 115);background-color: rgb(214, 219, 219);">
      <ul class="list">
        <li class="item">
          <!-- 事件区域 -->
          <span class="info">事件1</span>
          <!-- 按钮区域 -->
          <div class="btn">
            <button class="edit">编辑</button>
            <button class="fin">完成</button>
            <button class="del">删除</button>
          </div>
        </li>
        <li class="item">
          <!-- 事件区域 -->
          <span class="info">事件2</span>
          <!-- 按钮区域 -->
          <div class="btn">
            <button class="edit">编辑</button>
            <button class="fin">完成</button>
            <button class="del">删除</button>
          </div>
        </li>
      </ul>
    </div>
  </div>
</body>
<script>
  var input = document.querySelector('.form input'); //获取事件输入框
  var addBtn = document.querySelector('#add'); //获取添加按钮
  var list = document.querySelector('.list'); //获取事件列表ul
  //点击添加按钮
  addBtn.addEventListener('click', function () { //使用监听器addEventListener
    //使用DOM添加insertAdjacentHTML,第一个参数:添加的位置;第二个参数:添加的内容
    //每次添加的li均添加到ul内的第一个li之前(afterbegin)
    list.insertAdjacentHTML('afterbegin', `
    <li class="item">
          <!-- 事件区域 -->
          <span class="info">${input.value}</span>
          <!-- 按钮区域 -->
          <div class="btn">
            <button class="edit">编辑</button>
            <button class="fin">完成</button>
            <button class="del">删除</button>
          </div>
        </li>
    `);
    //由于之前设置点击添加按钮后新元素item会被添加到插入元素内部的第一个子节点之前
    //所以我们应该对list的第一个子元素节点进行操作,否则新增事件无法被删除、修改和完成
    //删除
    list.firstElementChild.querySelector('.del').addEventListener('click', function () {
      var item = this.parentNode.parentNode
      item.remove()
    })
    //完成
    list.firstElementChild.querySelector('.fin').addEventListener('click', function () {
      var item = this.parentNode.parentNode
      item.classList.add('finished')
    })
    //修改
    list.firstElementChild.querySelector('.edit').addEventListener('click', function () {
      var item = this.parentNode.parentNode
      item.querySelector('.info').innerText = prompt('请修改你的事件:')
    })
  })
  var delBtns = document.querySelectorAll('.del'); //获取删除按钮
  var finBtns = document.querySelectorAll('.fin'); //获取完成按钮
  var editBtns = document.querySelectorAll('.edit'); //获取编辑按钮
  //遍历,有几个删除按钮则相当于有几个事件(li)
  for (var idx = 0; idx < delBtns.length; idx++) {
    //点击删除按钮
    delBtns[idx].addEventListener('click', function () {
      var item = this.parentNode.parentNode //删除按钮父级的父级,即类名为item的li(该按钮所在的行),一个li即一个事件行
      item.remove(); //点击删除按钮后删除该条li
    })
    //点击完成按钮
    finBtns[idx].addEventListener('click', function () {
      var item = this.parentNode.parentNode; //获取该条事件行
      //classList属性可以返回一个元素类属性集合
      item.classList.add('finished'); //点击完成按钮后为该行添加新类名finished,以实现新样式
    })
    //点击编辑按钮
    editBtns[idx].addEventListener('click', function () {
      var item = this.parentNode.parentNode; //获取该条事件行
      item.querySelector('.info').innerText = prompt('请修改你的事件:'); //点击编辑后将内容插入类名为info的span并弹出系统提示框
    })
  }
</script>
</html>


相关文章
|
21天前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
3天前
|
前端开发 JavaScript
前端界的革命:掌握这些新技术,让你的代码简洁到让人惊叹!
前端技术的快速发展带来了许多令人惊叹的新特性。ES6及其后续版本引入了箭头函数、模板字符串等简洁语法,极大减少了代码冗余。React通过虚拟DOM和组件化思想,提高了代码的可维护性和效率。Webpack等构建工具通过模块化和代码分割,优化了应用性能和加载速度。这些新技术正引领前端开发的革命,使代码更加简洁、高效、可维护。
9 2
|
3天前
|
前端开发 JavaScript 测试技术
前端工程师的必修课:如何写出优雅、可维护的代码?
前端工程作为数字世界的门面,编写优雅、可维护的代码至关重要。本文从命名规范、模块化设计、注释与文档、遵循最佳实践四个方面,提供了提升代码质量的方法。通过清晰的命名、合理的模块划分、详细的注释和持续的学习,前端工程师可以写出高效且易于维护的代码,为项目的成功打下坚实基础。
11 2
|
9天前
|
监控 前端开发 JavaScript
前端开发的终极奥义:如何让你的代码既快又美,还不易出错?
【10月更文挑战第31天】前端开发是一个充满挑战与机遇的领域,本文从性能优化、代码美化和错误处理三个方面,探讨了如何提升代码的效率、可读性和健壮性。通过减少DOM操作、懒加载、使用Web Workers等方法提升性能;遵循命名规范、保持一致的缩进与空行、添加注释与文档,让代码更易读;通过输入验证、try-catch捕获异常、日志与监控,增强代码的健壮性。追求代码的“快、美、稳”,是每个前端开发者的目标。
23 3
|
10天前
|
前端开发 JavaScript 开发者
前端开发的终极技巧:如何让你的代码既简洁又高效,还能减少bug?
【10月更文挑战第30天】前端开发充满挑战与创新,如何编写简洁高效且少bug的代码是开发者关注的重点。本文介绍五大技巧:1. 模块化,提高代码复用性;2. 组件化,降低代码耦合度;3. 使用现代框架,提高开发效率;4. 统一代码规范,降低沟通成本;5. 利用工具,优化代码质量。掌握这些技巧,让前端开发更高效。
23 1
|
17天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
24 1
|
1月前
|
前端开发 JavaScript 开发者
利用代码分割优化前端性能:高级技巧与实践
【10月更文挑战第2天】在现代Web开发中,代码分割是优化前端性能的关键技术,可显著减少页面加载时间。本文详细探讨了代码分割的基本原理及其实现方法,包括自动与手动分割、预加载与预取、动态导入及按需加载CSS等高级技巧,旨在帮助开发者提升Web应用性能,改善用户体验。
|
1月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
90 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
1月前
|
前端开发 小程序 JavaScript
信前端里的循环显示如何编写代码?
信前端里的循环显示如何编写代码?
66 5
|
2月前
|
JavaScript 前端开发
前端基础(十)_Dom自定义属性(带案例)
本文介绍了DOM自定义属性的概念和使用方法,并通过案例展示了如何使用自定义属性来控制多个列表项点击变色的独立状态。
43 0
前端基础(十)_Dom自定义属性(带案例)