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

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

一、案例效果

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

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>


相关文章
|
2天前
|
存储 安全 前端开发
PHP医院安全不良事件管理系统源码(AEMS)前端vue2+element+后端laravel8不良事件上报与闭环管理
医院不良事件上报与管理系统结合现代医院管理思路,遵照PDCA全面质量循环管理方法而设计,并在多家大型三甲医院成熟运用。系统从事件上报、基于人、机、料、法 、环的RCA分析、事件整改、效果评估实现了结构化、标准化、智能化的管理和分析,满足医院可追溯化、全流程闭环管理要求,满足等级医院评审细则要求,大力提高医院不良事件上报的效率,保障事件分析的准确性,促进医疗安全的提高,避免同类事件再次发生,改善整个医院医疗安全,从而实现医院安全医疗的目标。
23 3
|
2天前
|
JSON 前端开发 搜索推荐
BoostCompass( http_server 模块 | 项目前端代码 )
BoostCompass( http_server 模块 | 项目前端代码 )
26 4
|
2天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
2天前
|
Dart 前端开发 Android开发
【Flutter前端技术开发专栏】Flutter中的平台特定代码实现
【4月更文挑战第30天】Flutter旨在实现跨平台移动应用开发,但有时需针对iOS或Android编写特定代码。平台通道是关键机制,允许Dart代码与原生代码交互。通过`MethodChannel`等实现跨平台通信,然后在iOS和Android上响应调用。条件编译则在编译时决定特定平台代码。本文展示了如何在Flutter中处理平台特定功能,包括示例代码和总结。
【Flutter前端技术开发专栏】Flutter中的平台特定代码实现
|
2天前
|
Dart 前端开发 Android开发
【Flutter前端技术开发专栏】Flutter与原生代码的集成与交互
【4月更文挑战第30天】本文探讨了如何在Flutter中集成和交互原生代码,以利用特定平台的API和库。当需要访问如蓝牙、特定支付SDK或复杂动画时,集成原生代码能提升效率和性能。集成方法包括:使用Platform Channel进行通信,借助现有Flutter插件,以及Android和iOS的Embedding。文中通过一个电池信息获取的例子展示了如何使用`MethodChannel`在Dart和原生代码间传递调用。这些技术使开发者能充分利用原生功能,加速开发进程。
【Flutter前端技术开发专栏】Flutter与原生代码的集成与交互
|
2天前
|
前端开发 开发者
【专栏】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。
【4月更文挑战第29天】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。它包括Block(独立功能单元)、Element(Block的子元素)和Modifier(表示状态或变体)。BEM的特点包括命名一致性、模块化设计、清晰结构和可复用性,适用于代码组织、样式管理、组件化开发和团队协作。虽然命名较长和学习成本是其局限性,但BEM在提升代码质量和效率方面具有显著优势,是前端开发的重要工具。
|
2天前
|
前端开发 JavaScript 开发者
前端技术栈:探索现代Web开发的核心要素与代码实践
前端技术栈:探索现代Web开发的核心要素与代码实践
24 1
|
2天前
|
SQL 前端开发 JavaScript
前端vite+vue3结合后端node+koa——实现代码模板展示平台(支持模糊搜索+分页查询)
前端vite+vue3结合后端node+koa——实现代码模板展示平台(支持模糊搜索+分页查询)
36 4
|
2天前
|
前端开发 安全 开发工具
前端场景的代码部署方式都有那些?
【4月更文挑战第17天】本文分析了四种常见的前端代码部署方式:FTP/SFTP、Git、Docker和云服务平台部署。FTP/SFTP简单易用但效率低;Git提供版本控制,适合自动化部署,但有学习成本;Docker确保环境一致性,高效扩展,但较复杂;云服务平台弹性伸缩,高可用,但可能产生依赖和成本。选择部署方式应综合考虑项目需求、技术能力和成本。
22 0
|
2天前
|
缓存 前端开发 JavaScript
年度代码翻车现场 |前端代码评审问题总结
代码评审于技术团队的工程师文化建设非常有意义,它是形成团队统一代码风格最有效的方式,作者把自己团队在一年的CR中常见的那些小问题做了一些梳理,希望能对大家起到一点小帮助。
219379 4