js 表单,表格 增 删

js实现学生信息表案例--详细教程 2.点击链接,要删除的是对应数组里面的这个数据,而不是删除dom节点,如何找到这个数据?遍历数组,动态生成tr,里面填写对应的td数据,并追加给tbody。: 这个案例,减少了dom操作,采取操作数据的形式,增加和删除都是针对于数组的操作,然后根据数据渲染页面。3.注意书写的位置,应该放到新增数据的前面,阻止默认行为的后面。2.创建新的对象,里面存储 表单获取过来的数据。2.点击录入,根据相关数据,生成对象,追加到数组里面。4.点击删除按钮,删除的是对应数组里面的数据。5.再次根据数组的数据,渲染页面。 阅读详情

html结构,css样式

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>学生信息管理</title>
  <link rel="stylesheet" href="css/index.css" />
</head>

<body>
  <h1>新增学员</h1>
  <form class="info" autocomplete="off">
    姓名:<input type="text" class="uname" name="uname" />
    年龄:<input type="text" class="age" name="age" />
    性别:
    <select name="gender" class="gender">
      <option value="男">男</option>
      <option value="女">女</option>
    </select>
    薪资:<input type="text" class="salary" name="salary" />
    就业城市:<select name="city" class="city">
      <option value="北京">北京</option>
      <option value="上海">上海</option>
      <option value="广州">广州</option>
      <option value="深圳">深圳</option>
      <option value="曹县">曹县</option>
    </select>
    <button class="add">录入</button>
  </form>

  <h1>就业榜</h1>
  <table>
    <thead>
      <tr>
        <th>学号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>薪资</th>
        <th>就业城市</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- 
        <tr>
          <td>1001</td>
          <td>欧阳霸天</td>
          <td>19</td>
          <td>男</td>
          <td>15000</td>
          <td>上海</td>
          <td>
            <a href="javascript:">删除</a>
          </td>
        </tr> 
        -->
    </tbody>
  </table>
 
  <script src="./js/index.js"></script>
</body>

</html>
* {
  margin: 0;
  padding: 0;
}

a {
  text-decoration: none;
  color:#721c24;
}
h1 {
  text-align: center;
  color:#333;
  margin: 20px 0;
 
}
table {
  margin:0 auto;
  width: 800px;
  border-collapse: collapse;
  color:#004085;
}
th {
  padding: 10px;
  background: #cfe5ff;
  
  font-size: 20px;
  font-weight: 400;
}
td,th {
  border:1px solid #b8daff;
}
td {
  padding:10px;
  color:#666;
  text-align: center;
  font-size: 16px;
}
tbody tr {
  background: #fff;
}
tbody tr:hover {
  background: #e1ecf8;
}
.info {
  width: 900px;
  margin: 50px auto;
  text-align: center;
}
.info  input, .info select {
  width: 80px;
  height: 27px;
  outline: none;
  border-radius: 5px;
  border:1px solid #b8daff;
  padding-left: 5px;
  box-sizing: border-box;
  margin-right: 15px;
}
.info button {
  width: 60px;
  height: 27px;
  background-color: #004085;
  outline: none;
  border: 0;
  color: #fff;
  cursor: pointer;
  border-radius: 5px;
}
.info .age {
  width: 50px;
}

方法1.直接对dom进行操作

/**
 * 第一种方法:对dom进行操作
 */

const tbody = document.querySelector('tbody')

const uname = document.querySelector('.uname')
const age = document.querySelector('.age')
const gender = document.querySelector('.gender')
const salary = document.querySelector('.salary')
const city = document.querySelector('.city')

const info = document.querySelector('.info')
info.addEventListener('submit', function(e){
    e.preventDefault()
    // 非空判断
    if(uname.value.trim().length === 0 || age.value.trim().length === 0 || salary.value.trim().length === 0){
        alert('内容不能为空')
        return
    }
    
    // 检查年龄是否为有效数字
    const ageValue = age.value.trim();
    if (ageValue.length === 0 || isNaN(ageValue) || parseInt(ageValue) <= 0) {
        alert('年龄必须是一个有效的正整数');
        return;
    }

    // 检查薪资是否为有效数字
    const salaryValue = salary.value.trim();
    if (salaryValue.length === 0 || isNaN(salaryValue) || parseFloat(salaryValue) <= 0) {
        alert('薪资必须是一个有效的正数');
        return;
    }

    const trs =document.querySelectorAll('tbody tr')

    const tr = document.createElement('tr')
    tr.innerHTML = `
        <td>${trs.length + 1}</td>
        <td>${uname.value}</td>
        <td>${age.value}</td>
        <td>${gender.value}</td>
        <td>${salary.value}</td>
        <td>${city.value}</td>
        <td>
            <a href="javascript:" data-id=${trs.length + 1}  onclick='del(${trs.length + 1})'>删除</a>
        </td>
    `
    tbody.appendChild(tr)

    // uname.value = ''
    // age.value = ''
    // gender.value = '男'
    // salary.value = ''
    // city.value = '北京'
    this.reset()
})

function del(id) {
    // 找到对应的 tr 元素并移除
    const link = document.querySelector(`[data-id="${id}"]`);
    if (link) {
        const tr = link.closest('tr'); // 找到最近的 tr 元素
        if (tr) {
            tbody.removeChild(tr); // 从 tbody 中移除 tr
        }
    }

    //重新排序
    const rows = tbody.querySelectorAll('tr');
    rows.forEach((row, index) => {
        row.querySelector('td').textContent = index + 1; // 更新学号
        row.querySelector('a').setAttribute('data-id', index + 1); // 更新 data-id
        row.querySelector('a').setAttribute('onclick', `del(${index + 1})`); // 更新 onclick
    });
}

方法2.对数组进行操作 - 黑马pink老师

 // 获取元素
    const uname = document.querySelector('.uname')
    const age = document.querySelector('.age')
    const gender = document.querySelector('.gender')
    const salary = document.querySelector('.salary')
    const city = document.querySelector('.city')
    const tbody = document.querySelector('tbody')
    // 获取所有带有name属性的 元素
    const items = document.querySelectorAll('[name]')
    // 声明一个空的数组, 增加和删除都是对这个数组进行操作
    const arr = []

    // 1. 录入模块
    // 1.1 表单提交事件
    const info = document.querySelector('.info')
    info.addEventListener('submit', function (e) {
      // 阻止默认行为  不跳转
      e.preventDefault()
      // console.log(11)

      // 这里进行表单验证  如果不通过,直接中断,不需要添加数据
      // 先遍历循环
      for (let i = 0; i < items.length; i++) {
        if (items[i].value === '') {
          return alert('输入内容不能为空')
        }
      }
      // 创建新的对象
      const obj = {
        stuId: arr.length + 1,
        uname: uname.value,
        age: age.value,
        gender: gender.value,
        salary: salary.value,
        city: city.value
      }
      // console.log(obj)
      // 追加给数组里面
      arr.push(obj)
      // console.log(arr)
      // 清空表单  重置 
      this.reset()
      // 调用渲染函数
      render()
    })


    // 2. 渲染函数 因为增加和删除都需要渲染
    function render() {
      // 先清空tbody 以前的行 ,把最新数组里面的数据渲染完毕 
      tbody.innerHTML = ''
      // 遍历arr数组
      for (let i = 0; i < arr.length; i++) {
        // 生成 tr 
        const tr = document.createElement('tr')
        tr.innerHTML = `
          <td>${arr[i].stuId}</td>
          <td>${arr[i].uname}</td>
          <td>${arr[i].age}</td>
          <td>${arr[i].gender}</td>
          <td>${arr[i].salary}</td>
          <td>${arr[i].city}</td>
          <td>
            <a href="javascript:" data-id=${i}>删除</a>
          </td>
        `
        // 追加元素  父元素.appendChild(子元素)
        tbody.appendChild(tr)
      }
    }


    // 3. 删除操作
    // 3.1 事件委托 tbody
    tbody.addEventListener('click', function (e) {
      if (e.target.tagName === 'A') {
        // 得到当前元素的自定义属性 data-id
        // console.log(e.target.dataset.id)
        // 删除arr 数组里面对应的数据
        arr.splice(e.target.dataset.id, 1)
        console.log(arr)
        // 从新渲染一次
        render()
      }
    })

方法3:数组+localstorage

      const tbody = document.querySelector('tbody')

      // 1.读取数据
      const arr = JSON.parse(localStorage.getItem('data')) || []

      // 2.渲染: map(arr -> arr), join(arr -> str)
      function render() {
        const newArr = arr.map((e,i)=>{
          return `
          <tr>
            <td>${e.stuId}</td>
            <td>${e.uname}</td>
            <td>${e.age}</td>
            <td>${e.gender}</td>
            <td>${e.salary}</td>
            <td>${e.city}</td>
            <td>
              <a href="javascript:" data-id='${i}'>删除</a>
            </td>
          </tr> 
          `
        })
        tbody.innerHTML = newArr.join('')
      }
      render()

      // 3.新增
      const info = document.querySelector('.info')
      const attrs = info.querySelectorAll('[name]')
      info.addEventListener('submit', function(e){
        e.preventDefault()

        const student = {}
        //新数据的id应该是是最后一条数据的id加一,但是如果没有数据,则直接赋值为1
        student.stuId = arr.length ? arr[arr.length - 1].stuId + 1 : 1 
        for (let index = 0; index < attrs.length; index++) {
          const attr = attrs[index];
          if(attr.value === '') return alert('输入内容不能为空')
          student[attr.name] = attr.value
        }
        arr.push(student)
        localStorage.setItem('data', JSON.stringify(arr))
        this.reset()

        render()
      })
    
      // 4.删除
      const table = document.querySelector('table')
      table.addEventListener('click', function (e) {
        if(e.target.tagName === 'A') {
          const isDel = confirm('你确定删除吗')
          if(isDel){
            const id = e.target.dataset.id
            arr.splice(id, 1)
            render()
            localStorage.setItem('data', JSON.stringify(arr))
          }
        }
      })

学生信息管理系统 页面设计 这是一个网页模板,里面有10多个页面,没有采用前端框架 立即下载

相关推荐

双极性步进电机驱动技术:从H桥电路到精准控制

本文深入解析了双极性步进电机驱动技术的核心,从H桥电路的基础原理讲起,阐述了其作为实现电机正反转和精准控制的关键。文章详细介绍了H桥的工作模式、防共态导通设计,并对比了L298N、DRV8825及TMC2209等主流集成驱动芯片的选型。进一步探讨了通过微步进与电流矢量控制实现平滑、静音运行的高级技术,并提供了基于STM32的实战代码与避坑指南,帮助开发者从理论到实践全面掌握精准运动控制。

tea88的博客 598

通过javascript+html+css实现学生信息表案例【全】

选择出有name属性的标签。的常量,它引用了具有三个属性(

2301_77451464的博客 801

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 648

创建新增学员表格(JS)

考验我们的创建节点插入节点的能力

2301_81045156的博客 1028

HT7533与1117稳压芯片动态特性对比:实测分析与优化策略

本文深入对比了HT7533与1117稳压芯片的动态特性,包括电压过冲和瞬态响应能力,并提供了实测数据与优化策略。HT7533适合低功耗设备,而1117在大电流和稳定性要求高的场景表现更优。文章还分享了PCB布局和电容选择的实用建议,帮助工程师根据项目需求选择合适的稳压芯片。

weixin_28454475的博客 611

Kali下RTL8812AU网卡5G抓包精准适配指南

WiFi监听模式是无线安全测试的基础能力,其核心在于网卡驱动对802.11a/n/ac协议栈的完整支持。RTL8812AU系列USB无线网卡因成本低、兼容性广被广泛用于渗透测试,但其芯片版本碎片化(如VA/VC/ACM)与Linux内核演进(6.1~6.5)存在严重适配断层,导致5GHz频段Beacon帧捕获失败、信道切换异常、注入功能残缺等典型问题。技术价值在于突破‘即插即用’幻觉,建立从USB设备ID识别、固件版本校验到射频寄存器级补丁的全链路可控流程。典型应用场景包括CTF无线赛题实战、红蓝对抗中的W

weixin_33783283的博客 763

HTML+CSS+JavaScript 学生信息表

登录页+管理用户页+学生信息页。

weixin_46041602的博客 594

UniDexGrasp++算法实战:无需预生成姿态的灵巧抓取测试指南

本文详细解析了UniDexGrasp++算法在灵巧抓取测试中的实战应用,该算法无需预生成姿态即可实现高效抓取,特别适合处理形状不规则的物体。文章涵盖了环境配置、数据集优化、训练流程及实际测试中的调参技巧,帮助开发者快速掌握这一ICCV 2023提出的先进算法。

weixin_29045585的博客 279

利用JavaScript实现学生信息表格

【代码】利用JavaScript实现学生信息表格。

W2399755751的博客 853

从Palantir到AI时代:Forward Deployed Engineer模式的深度解析

《从Palantir到AI时代:FDE模式的创新与挑战》摘要:Palantir开创的前置部署工程师(FDE)模式正在成为AI创业公司的标配。该模式通过现场工程师深入了解客户需求,填补产品与实际应用间的鸿沟,颠覆了传统SaaS规模化路径。核心优势在于将定制化服务转化为产品发现机制,特别适合高度异质化的AI市场。成功关键在于平衡定制与标准化,通过合同价值增长、产品杠杆效应等独特指标衡量成效。FDE人才需要兼具领域洞察力与快速原型能力。这一模式表明,在AI等新兴领域,深入客户现场可能比单纯追求技术突破更能创造商业

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 4546

半小时搞定Yolov5安装配置及使用(详细过程)

Yolov51. 下载Yolov52. 安装Yolov5 在下载配置Yolov5前,先要安装好Anaconda环境,可参考之前博文:最新Anaconda3的安装配置及使用教程(详细过程) 1. 下载Yolov5 首先下载Yolov5源码: Yolov5 Github地址:https://github.com/ultralytics/yolov5 直接git clone到本地工作目录,等待下载完成: Yolov5代码目录架构: 2. 安装Yolov5 源码下完后,下面开始安装Yolov5所需模块,

HowieXue 薛永浩的博客 12万+

HBuilderX使用vue完成切换登录和table的增删改查!

在下思路:①创建邮箱的form表单、②复制完成跟用户登录相同的操作(因为一个是用户、一个是邮箱,在下选择创两个不同数据(也可以将数据加载在一个表中))、③给两个form表单添加 v-if=" " v-else-if ="t" v-else=" " 表示判断,其中的值为true则相当于添加了一个style="display:block" 就显示,若值为false相当于添加了一个style="display:none"所以form就隐藏。双向绑定数据,用vue对象获取到的数据进行各个方法实现!

qq_64113194的博客 2280

Android 11.0 app添加校验锁(输入密码才能进入app)

11.0定制化开发中客户要求给app添加锁,就是点击app 图标时,会弹出Dialog,需要输入密码才能进入app中,就是应用校验锁, 最开始想到在Launcher3中实现,但是如果更换了默认Launcher 又不行了 所以最终还是得拦截app启动Activity 从这里入手了 Launcher与APP是在两个不同的进程中,他们之间的通信是通过Binder完成的,点击Launcher上的某个APP,这时会调用Launcher的startActivitySafely方法。 public boolean sta

安卓兼职framework和app工程师的博客 1953

Vue 04 前端查询、表格列表、分页

04 表格增删改查 □ 改没实现 效果图 实现说明 element-ui 表单:el-form 表格:el-table 分页:el-pagination mytable.vue <template> <div> <el-form :inline="true" :model="add" class="demo-form-inline"> <el-form-item label="id"> <el-in

xl十一的博客 1104

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JavaScript 小实例 - 表单输入内容检测,对页面的增删改

JavaScript 小实例 - 表单输入内容检测,对页面的增删改 效果体验地址:https://xpwi.github.io/js/JavaScript01/jsForm.html 功能: 1.向页面写入数据 2.删除页面数据 + 删除提示【确实】才删除 3.获取表单输入的内容,并简单验证 4.打开一个新的窗口 <!DOCTYPE html> <html lang="en"...

weixin_30496431的博客 186

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

js实现表格的增 删 改 查

效果图在最下面哦 <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=device-width,initial-scale=1.0"> <ti...

m0_46639176的博客 2523

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Js 点击新增一行数据表格,并且实现表单提交

1,这里是html 代码 <form class="layui-form" id="form"> <input type="button" class="layui-btn" id="btn_addtr" value="增报价单"> <table id="dynamicTable"> <tbody> <tr>

myNameIsOwen的博客 2776

增、删、查、改

增、删、查、改 文献MVC 编程模式MVC 是三种 ASP.NET 编程模式中的一种。MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:· Model(模型)表示应用程序核心(比如数据库记录列表)。· View(视图)显示数据(数据库记录)。· Controller(控制器)处理输入(写入数据库记录)。MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制在MVC中我们学习了很多知识点,但是主要重点的还是离

weixin_47260385的博客 1681

Table自增表格

自增表格的作用就是可以让你任意的新增数据,不管是多条还是单条。在软件功能编辑的方面非常有用。 如何设置自增表格: 先在一个table里面设置好表头,然后设置表头所对应的列的内容,如: 颜色 尺码 商品编码 商品条码 ...

weixin_44546452的博客 1121

JavaScript DOM的增、删操作,并实时显示到表格中(JS代码含详细注释)

JavaScript DOM的增、删操作,并实时显示到表格中一、说明二、实现代码三、一点备注 一、说明 给所有的a标签绑定事件 判断点击的del属于哪一行数据 删除当前行的tr节点 获取添加表中的所有input数据 添加tr和td节点 向新建的td节点中添加数据(数据来源与4.) 给新建的行中的a标签绑定事件 二、实现代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

aolyu的博客 532

Vue中使用Element 表单点击按钮实现增行删行操作

首先使用model绑定表单数据,使用v-for遍历snForm下的数组;删行: 使用splice方法删除对应index的行。在Vue中使用form表单点击增行删行操作。增行: 点击按钮新增一条sn进去。

qq_58671311的博客 1698

001动态表格添加数据存入数据库(增、删、回显)ajax

展示: 图例说明:这个表格在模态框表单中,提交表单,将数据插入数据库。 需求说明:我的情景是一对多,表单填主表数据,表格写从表数据。页面为主表的数据列表,后边为编辑按钮,点击编辑弹出模态框(当然页面也有添加按钮,点击同样弹出模态框,实现新建功能) 技术栈:ajax、js、javaweb的表现层controller、H5、(bootsrap不重要) 现在说一下代码的实现: 增加: 模态框里有内容和...

高谷深陵 2049

通过CSS,H5,JavaScript实现表格表单的随机选择,和简单的随机点名。

目录一、表格表单的随机选择效果展示(表单内容可以根据自己需要进行修改)1.H5的布局第一步:第二步:2.CSS布局3.JS的布局第一步:第二步:第三步:二、简单的随机点名效果展示(可以自己修改内容)1.H5布局2.CSS布局3.JS布局第一步:第二步:三、可以自己暂停的随机点名可以给整个表格内容设置一个内边距,里面的文字可以自己添加,这里用了英文乱码,没有任何的其他意义,知识一个展示效果。可以给整个表格内容设置一个内边距,里面的文字可以自己添加,这里用了英文乱码,没有任何的其他意义,知识一个展示效果。可以给

yzq0820的博客 5934

JS中创建信息表单,将信息内容插入到表格中

实现功能: 1.上部添加的信息,点击提交后插入到下方表格 2.单行、多行、全部删除 3.重置、全选 **CSS:** /* 全局字体 */ * { font-size: 16px; } /* 全局列高度 */ td { height: 30px; } /* 全局居中 */ table{ margin: 0px auto; } /* 删除全部按钮 */ #d...

米斯特尔.W 6481

WEB入门二 表格和表单

学习内容Ø表格的作用和制作Ø表单的制作能力目标Ø掌握表格的创建Ø掌握设置表格的常用属性;Ø理解表单的作用Ø熟练掌握表单常用元素本章简介表格对于网页制作而言极其重要,其最明显的优点是能够以行列整齐的形式来显示文本、数字、图片信息。而且,表格还可以用于固定文本或图像的显示位置。经常上网的用户会发现表格被大量

张晨光老师的播客 9687

Vue.js实现表格数据增、删、改、查效果

Vue.js实现表格数据增、删、改、查效果 代码如下所示:(注意需引入jquery) index

CodingNoob 4833
上一篇: css 去除各种标签的默认样式
下一篇: Javascript 正则表达式
前端开发洋洋
博客等级 码龄3年 77粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值