当前位置: 首页 > news >正文

事件(二)实战案例

员工信息管理系统

我们当前的目标非常简单,实现功能即可,代码好看不好看不重要,能跑起来不报错就行😶。如果有改正建议欢迎来私聊。

完整功能流程

  1. 页面加载

    • 初始化员工数据
    • 调用 renderTable() 渲染表格
  2. 新增员工

    • 点击"新增员工"按钮
    • 显示弹窗,清空输入框
    • 输入员工信息
    • 点击"保存"
    • 创建新员工对象并添加到数组
    • 重新渲染表格
  3. 编辑员工

    • 点击某行的"编辑"按钮
    • 显示弹窗,填入该员工信息
    • 修改信息
    • 点击"保存"
    • 更新数组中的员工对象
    • 重新渲染表格
  4. 删除员工

    • 点击某行的"删除"按钮
    • 弹出确认对话框
    • 确认后从数组中移除该员工
    • 重新渲染表格
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}table {border: 1px solid #000;}table th {border: 1px solid black;}table td {border: 1px solid black;}.mask {position: fixed;top: 0;right: 0;width: 100%;height: 100%;background-color: #000;opacity: 0.2;}.ipt-box {position: fixed;left: 40%;top: 40%;margin: auto;background-color: #fff;width: 230px;height: 180px;padding: 30px;}</style>
</head><body><div class="box"><h1>员工信息表</h1><button id="add">新增员工</button><br></div><table><thead><tr><th>工号</th><th>姓名</th><th>部门</th><th>职位</th><th>年龄</th><th>薪资</th><th>操作</th></tr></thead><tbody></tbody></table><!-- 弹窗 --><div class="mask" hidden></div><div class="ipt-box" hidden>姓名<input type="text" name="name"></input><br>部门<input type="text" name="department"></input><br>职位<input type="text" name="position"></input><br>年龄<input type="text" name="age"></input><br>薪资<input type="text" name="salary"></input><br><button id="save">保存</button><button id="cancel">取消</button></div><script>// 变量及数据let mask = document.querySelector('.mask');let iptBox = document.querySelector('.ipt-box');let name = document.querySelector('[name="name"]');let department = document.querySelector('[name="department"]');let position = document.querySelector('[name="position"]');let age = document.querySelector('[name="age"]');let salary = document.querySelector('[name="salary"]');let num = 3let editIndex = -1;//当前修改的是哪一条let employees = [{ employeeId: 'EMP001', name: '张三', department: '技术部', position: '工程师', age: 28, salary: 8000 },{ employeeId: 'EMP002', name: '李四', department: '销售部', position: '销售员', age: 25, salary: 6000 },{ employeeId: 'EMP003', name: '王五', department: '人事部', position: '专员', age: 30, salary: 7000 }]// // 渲染// let str = ``;// for (let i = 0; i < employees.length; i++) {//   str += `<tr>//       <td>${employees[i].employeeId}</td>//       <td>${employees[i].name}</td>//       <td>${employees[i].department}</td>//       <td>${employees[i].position}</td>//       <td>${employees[i].age}</td>//       <td>${employees[i].salary}</td>//       <td>//   <button class="btn1">编辑</button>//         <button class="btn2">删除</button>//       </td>//       </tr>//     `;// }// document.querySelector('tbody').innerHTML = str;// // 删除// document.querySelector('tbody').addEventListener('click', function (e) {//   if (e.target.classList.contains('btn2')) {//     e.target.parentNode.parentNode.remove();//   }// });// 1.渲染数据function renderTable(arr) {let htmlStr = '';arr.forEach(function (item) {htmlStr += `<tr><td>${item.employeeId}</td><td>${item.name}</td><td>${item.department}</td><td>${item.position}</td><td>${item.age}</td><td>${item.salary}</td><td><button class="btn1">编辑</button><button class="btn2">删除</button></td></tr>`;})document.querySelector('table tbody').innerHTML = htmlStr;}renderTable(employees)// 2.新增// 2.1点击显示窗口add.onclick = function () {editIndex = -1; // 设置为新增模式// 清空输入框name.value = ''department.value = ''position.value = ''age.value = ''salary.value = ''mask.hidden = false;iptBox.hidden = false;}// 2.2点击遮罩隐藏窗口mask.onclick = function () {mask.hidden = true;iptBox.hidden = true;}// 2.3保存提交按钮save.onclick = function () {if (editIndex < 0) {// 新数据let userObj = {employeeId: 'EMP' + ++num,name: name.value,department: department.value,position: position.value,age: age.value,salary: salary.value};// 数组列表新增employees.push(userObj);// 数据变了,重新调用函数渲染renderTable(employees)alert('保存成功');} else {let editObj = employees[editIndex]//找到目标editObj.name = name.valueeditObj.department = department.valueeditObj.position = position.valueeditObj.age = age.valueeditObj.salary = salary.valuealert('修改成功')editIndex = -1// 数据变了,重新调用函数渲染renderTable(employees)}// 清空输入框name.value = ''department.value = ''position.value = ''age.value = ''salary.value = ''// 隐藏窗口mask.hidden = trueiptBox.hidden = true}// 3.编辑和删除// 事件委托document.querySelector('table tbody').addEventListener('click', function (e) {if (e.target.classList.contains('btn1')) {// 是编辑框// 显示窗口mask.hidden = falseiptBox.hidden = false// 找到这一行的数据let tr = e.target.closest('tr')// console.log(tr);let td1 = tr.querySelectorAll('td')[0].innerTextlet td2 = tr.querySelectorAll('td')[1].innerTextlet td3 = tr.querySelectorAll('td')[2].innerTextlet td4 = tr.querySelectorAll('td')[3].innerTextlet td5 = tr.querySelectorAll('td')[4].innerTextlet td6 = tr.querySelectorAll('td')[5].innerTextconsole.log(td1, td2, td3, td4, td5, td6);// 找到对应条件的数据的索引editIndex = employees.findIndex(item => {return item.employeeId === td1&& item.name === td2&& item.department === td3&& item.position === td4&& item.age == td5&& item.salary == td6})// 赋值输入框name.value = td2department.value = td3position.value = td4age.value = td5salary.value = td6}// 删除document.querySelector('tbody').addEventListener('click', function (e) {if (e.target.classList.contains('btn2')) {confirm('确定要删除吗?')e.target.parentNode.parentNode.remove();}});})</script>
</body></html>

http://www.dtcms.com/a/314151.html

相关文章:

  • Do-Calculus:因果推断的演算基础与跨领域应用
  • 17.6 超拟人大模型CharacterGLM技术解析:92.7%角色一致性+虚拟偶像互动提升300%,如何吊打GPT-4?
  • Maya 2024安装指南及安装包下载
  • UILabel设置字重
  • Coze Loop:开源智能体自动化流程编排平台原理与实践
  • Ethereum: 深度解析Web3世界的合规之门, ERC-1400证券型代币标准
  • Oracle ASH的手册
  • Linux定制篇-Tomcat的安装和配置
  • Druid学习笔记 03、Druid的AstNode类详解与其他产品测试体验
  • 【精品项目】进阶版贪吃蛇:现代Web技术打造的经典游戏重生
  • 从零认识OpenFlow
  • TCP为什么采用三次握手而不是二次握手
  • 使用 Marian 进行机器翻译详解及对应案例
  • 在安卓中使用 FFmpegKit 剪切视频并添加文字水印
  • Android进程基础:Zygote
  • (JAVA)自建应用调用企业微信API接口,设置企业可信IP
  • 开疆智能ModbusTCP转Profient网关连接ER机器人配置案例
  • DPDK中的TCP头部处理
  • 第五篇: 深入解析基于 SQLAlchemy 的聊天记录持久化模块:`message_model` 与数据库操作封装
  • 高速信号设计之 PCIe6.0 篇
  • Windows中Idea或者其他开发工具如何使用Google Sans Code - 码农开源等宽字体
  • 数据结构:如何判断一个链表中是否存在环(Check for LOOP in Linked List)
  • JSqlParser学习笔记 快速使用JSqlParser
  • 从exec到Shell:深度解析Linux进程等待,程序替换与自主Shell实现
  • 电脑一键重装系统win7/win10/win11无需U盘(无任何捆绑软件图文教程)
  • OBS 基础 21 充满某个源的策略
  • Android GPU测试
  • 电子电气架构 ---智能电动汽车嵌入式软件开发过程中的block点
  • 【Linux指南】软件安装全解析:从源码到包管理器的进阶之路
  • 移动端生产网页设计误区:工业级操作场景下的手势交互创新