隔行换色总结
功能效果展示:

第一种思路:
使用数组,将数组的内容渲染到页面上,序号也就是将数组的下标输出到第一个td上,将数组的内容输出到第二个td上,(使用``拼接字符串)
具体操作:
1.HTML 结构搭建
- 首先,让我们来看一下 HTML 代码。我们创建了一个基本的表格结构,<table>标签定义了整个表格,cellspacing="0"属性用于消除表格单元格之间的间距。
- <thead>标签内包含了表格的头部信息,这里有一行<tr>,其中三个<th>标签分别定义了 “序号”“内容”“操作” 三个表头。
- <tbody>标签则是表格主体内容的容器,初始时,我们预留了它作为动态生成表格行的区域,注释掉了一个示例的<tr>行,这行只是为了展示结构,实际运行时将由 JavaScript 动态生成。
- 最后,还有一个<button>按钮,其类名为add,并绑定了一个点击事件οnclick="addData()",用于触发添加数据行的操作。
html:
<table cellspacing="0"><thead><tr><th>序号</th><th>内容</th><th>操作</th></tr></thead><tbody><!-- <tr><td>1</td><td>data</td><td><button class="del">删除</button></td></tr> --></tbody></table><button class="add" onclick="addData()">添加行</button>
css:
2.CSS 样式美化
- 为了让表格看起来更加美观和易于阅读,我们添加了一些 CSS 样式。
- *选择器用于清除所有元素的默认内外边距,确保表格布局的一致性。
- table选择器虽然目前只注释掉了设置边框的代码,但为后续可能的整体表格样式调整预留了空间。
- th选择器为表头单元格设置了内边距和较粗的边框,使其更加醒目。
- td选择器为普通单元格设置了适当的内边距和较细的边框,区分表头与内容单元格的视觉效果。
<style>* {margin: 0;padding: 0;}table {/* border: black 2px solid; */}th {padding: 5px 20px 5px 20px;border: 2px solid black;}td {padding: 5px 20px 5px 20px;border: 1px solid black;}</style>
js:
3.JavaScript 功能实现
- 初始化变量:
- 我们定义了一个数组arr,并初始化为[100],这个数组将用于存储表格中的数据。
- 获取页面中的<tbody>元素,并赋值给变量body,后续将通过它来操作表格主体内容。
- 获取类名为add的按钮元素,并赋值给变量add
- 表格渲染函数apply:
- apply函数负责将数组中的数据渲染到表格中。它首先初始化一个空字符串str,用于存储生成的 HTML 代码片段。
- 通过for循环遍历数组arr,在每次循环中,使用模板字符串生成一个<tr>行的 HTML 代码。这里利用三元运算符${i%2!==0?'style="background-color: aqua;"':''}根据i的奇偶性为<tr>行设置不同的背景颜色,奇数行背景色为aqua,偶数行保持默认。
- 然后将当前行的序号i + 1、数组中的数据arr[i]以及一个带有删除功能的<button>按钮(点击时调用delData(${i})函数)分别插入到对应的<td>元素中。
- 循环结束后,将生成的完整 HTML 字符串str赋值给body.innerHTML,从而实现表格的渲染。
- 添加数据函数addData:
- addData函数用于实现添加数据行的功能。它首先将变量num的值增加 100,这里的num用于生成新的数据值。
- 然后将新生成的num值通过arr.push(num)方法添加到数组arr中,并在控制台打印数组arr,方便查看数据更新情况。
- 最后调用apply函数,重新渲染表格,使新添加的数据能够及时显示在页面上。
- 删除数据函数delData:
- delData函数接收一个参数index,该参数表示要删除的数据在数组中的索引。
- 它通过arr.splice(index, 1)方法从数组arr中移除指定索引位置的数据。
- 同样调用apply函数,重新渲染表格,实现删除数据行后页面的实时更新。
let arr = [100];let body = document.getElementsByTagName('tbody')[0];let add = document.getElementsByClassName('add')[0];console.log(add);function apply() {let str = "";for (i = 0; i < arr.length; i++) {str +=`<tr ${i%2!==0?'style="background-color: aqua;"':''}><td>${i+1}</td><td>${arr[i]}</td><td><button class="del" onclick="delData(${i})">删除</button></td></tr>`;}body.innerHTML = str;}apply();let num = 100;// 添加函数function addData() {num += 100;console.log(num);arr.push(num);console.log(arr);apply();}// 删除function delData(index){arr.splice(index,1);apply();}
以上是第一种思路:
第二种思路中,html和css是一致的,所以我们就只讲js中的具体操作。

dataNum:初始值为 100,用于为新添加的行提供数据。
// 添加函数function addData() {let tr = document.createElement('tr');let tdNum = document.createElement('td');let tdData = document.createElement('td');let tdDel = document.createElement('td');// let num = document.createTextNode();let data = document.createTextNode(dataNum);let delText = document.createTextNode("删除");let del = document.createElement('button');del.appendChild(delText);tdDel.appendChild(del);// tdNum.appendChild(num);tdData.appendChild(data);tr.appendChild(tdNum);tr.appendChild(tdData);tr.appendChild(tdDel);console.log(tr);body.appendChild(tr);dataNum += 100;rowColor();numOrder();}// 序号函数function numOrder() {let trNum = body.children;console.log(trNum);for (i = 0; i < trNum.length; i++) {console.log(i);trNum[i].children[0].innerHTML = i+1;}rowColor();}// 颜色函数function rowColor() {let trNum = body.children;for (i = 0; i < trNum.length; i++) {if (i % 2 !== 0) {console.log(document.getElementsByTagName('tr')[i]);document.getElementsByTagName('tr')[i+1].style.backgroundColor = "red";}else{document.getElementsByTagName('tr')[i+1].style.backgroundColor = "white";}}}// 删除函数body.addEventListener('click', function(e) {console.log(e.target.innerText);if (e.target.innerText == "删除") {body.removeChild(e.target.parentElement.parentElement);}rowColor();numOrder();})
-
添加函数
addData:- 创建一个新的表格行
tr以及三个单元格tdNum、tdData和tdDel。 - 创建文本节点
data和delText,分别表示数据和 “删除” 按钮的文本。 - 创建 “删除” 按钮
del,并将delText添加到按钮中。 - 将
data添加到tdData中,将del添加到tdDel中。 - 将三个单元格添加到
tr中,并将tr添加到表体body中。 dataNum增加 100,以便下次添加行时使用新的数据。- 调用
rowColor和numOrder函数,更新表格的颜色和序号。
- 创建一个新的表格行
-
序号函数
numOrder:- 获取表体中的所有行
trNum。 - 遍历这些行,为每行的第一个单元格设置序号,序号从 1 开始。
- 调用
rowColor函数,更新表格的颜色。
- 获取表体中的所有行
-
颜色函数
rowColor:- 获取表体中的所有行
trNum。 - 遍历这些行,根据行的索引奇偶性设置不同的背景颜色,奇数行为红色,偶数行为白色。
- 获取表体中的所有行
-
删除函数:
- 为表体添加点击事件监听器。
- 当点击的元素文本为 “删除” 时,删除对应的行。
- 调用
rowColor和numOrder函数,更新表格的颜色和序号。
相关文章:
隔行换色总结
功能效果展示: 第一种思路: 使用数组,将数组的内容渲染到页面上,序号也就是将数组的下标输出到第一个td上,将数组的内容输出到第二个td上,(使用拼接字符串) 具体操作: …...
使用Docker Desktop进行本地打包和推送
使用Docker Desktop进行本地打包和推送 一、Docker Desktop配置二、IDEA配置1.下载Docker插件2.在“Settings”中,配置“Docker”3.选择“Docker Registry”,配置远程仓库。 三、POM配置 一共有三个地方需要配置 一、Docker Desktop配置 在Docker Deskt…...
MTO和MTS不同模式制造业数字化转型的“三座大山“:MES/ERP/PLM系统集成技术全解析
1.导言:制造业的数字化转型与集成系统的作用 在工业4.0浪潮的推动下,制造业正处于深刻的数字化转型之中。这场变革的核心在于利用先进技术,如物联网(IoT)、人工智能(AI)、大数据分析和云计算&a…...
Redis主从复制:告别单身Redis!
目录 一、 为什么需要主从复制?🤔二、 如何搭建主从架构?前提条件✅步骤📁 创建工作目录📜 创建 Docker Compose 配置文件🚀 启动所有 Redis🔍 验证主从状态 💡 重要提示和后续改进 …...
数据库管理工具实战:IDEA 与 DBeaver 连接 TDengine(二)
五、DBeaver 连接 TDengine 实战 5.1 安装 DBeaver 下载安装包:访问 DBeaver 官方网站(https://dbeaver.io/download/ ),根据你的操作系统选择合适的安装包。如果是 Windows 系统,下载.exe 格式的安装文件࿱…...
ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射
DAY21.1 Java核心基础 ORM Object Relationship Mapping 对象关系映射 面向对象的程序到—关系型数据库的映射 比如java – MySQL的映射 ORM框架就是实现这个映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底层就是Hiber…...
简历EasyExcel相关
系列博客目录 文章目录 系列博客目录1.在easyExcel的基础上,应用多线程对数据进行分块有用吗为什么使用多线程对数据进行分块有用?实现方式示例:多线程与 EasyExcel 导出结合的基本思路解释:注意事项:总结:…...
C#调用Lua方法1+C#调用Lua方法2,3
xLua中Lua调用C#代码 原因:C#实现的系统,因为Lua可以调用,所以完全可以换成Lua实现,因为Lua可以即时更改,即时运行,所以游戏的代码逻辑就可以随时更改。 实现和C#相同效果的系统,如何实现&#…...
stable diffusion 量化加速点
文章目录 一、导出为dynamic shape1)函数讲解(函数导出、输出检查)2)代码展示二、导出为static shape1)函数讲解(略)2)代码展示三、序列化为FP32测速1)测速2)代码四、序列化为FP16测速1)测速2)代码同上五、发现并解决解决CLIP FP16溢出,并测速1)如何找到溢出的算子…...
NO.77十六届蓝桥杯备战|数据结构-单调队列|质量检测(C++)
什么是单调队列? 单调队列,顾名思义,就是存储的元素要么单调递增要么单调递减的队列。注意,这⾥的队列和普通的队列不⼀样,是⼀个双端队列。单调队列解决的问题 ⼀般⽤于解决滑动窗⼝内最⼤值最⼩值问题,以…...
通过发票四要素信息核验增值税发票真伪-iOS发票查验接口
发票是企业经济间往来的重要凭证,现如今,随着经济环境的日益复杂,发票造假现象屡禁不止,这使得增值税发票查验成为企业必须高度重视的工作。人工智能时代,发票查验接口犹如一道坚固的防线,助力企业财务守护…...
区块链是怎么存储块怎么找到前一个块
前言:学习区块链的过程中在想怎么管理区块链呢 📌 推荐项目回顾: 👉 Jeiwan 的 blockchain_go 项目 GitHub 地址:https://github.com/Jeiwan/blockchain_go ❓它是怎么存储区块 & 找前一个区块的? 项…...
超详解glusterfs部署
glusterfs部署 GlusterFS 是一个开源的分布式文件系统,旨在提供高性能、高可用性和可扩展性,适用于存储大量数据。它通过将多个存储节点组合成一个统一的文件系统,允许用户透明地访问分布在不同节点上的数据。 主要组件 存储砖块ÿ…...
总结一下常见的EasyExcel面试题
说一下你了解的POI和EasyExcel POI(Poor Obfuscation Implementation):它是 Apache 软件基金会的一个开源项目,为 Java 程序提供了读写 Microsoft Office 格式文件的功能,支持如 Excel、Word、PowerPoint 等多种文件格…...
【JAVA】十、基础知识“类和对象”干货分享~(三)
目录 1. 封装 1.1 封装的概念 1.2 访问限定符 public(公开访问) private(私有访问) 1.3 包 1.3.1 包的概念 1.3.2 导入包中的类 1.3.3 自定义包 2. static成员 2.1 static变量(类变量) 2.1.1 sta…...
DeepSeek+SpringAI家庭AI医生
文章目录 项目架构项目开发内容项目用户用例图项目地址开发环境大模型使用本地:Ollama部署DeepSeek离线与在线api大模型客户端使用 数据库脚本代码deepseek创建定制医生模型 内网互通原则云服务器类型 项目架构 项目开发内容 项目用户用例图 项目地址 FamilyAIDoct…...
PyTorch:解锁AI新时代的钥匙
(前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站)。 揭开PyTorch面纱 对于许多刚开始接触人工智能领域的朋友来说,PyTorch这个名字或许既熟悉又陌生。…...
C++第14届蓝桥杯b组学习笔记
1. 日期统计 小蓝现在有一个长度为 100100 的数组,数组中的每个元素的值都在 00 到 99 的范围之内。数组中的元素从左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4…...
解锁工业通信:Profibus DP到ModbusTCP网关指南!
解锁工业通信:Profibus DP到ModbusTCP网关指南! 在工业自动化领域,随着技术的不断进步和应用场景的日益复杂,不同设备和系统之间的通讯协议兼容性问题成为了工程师们面临的一大挑战。尤其是在Profibus DP和Modbus/TCP这两种广泛应…...
每日一题(小白)字符串娱乐篇16
分析题意可以了解到本题要求在一串字符串中找到所有组合起来排序递增的字符串。我们可以默认所有字符在字符串中的上升序列是1,从第一个字符开始找,如果后面的字符大于前面的字符就说明这是一个上序列那么后面字符所在的数组加一,如果连接不上…...
面试算法高频01
题目描述 验证回文串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true示例 2: 输入: "race a car" 输出: falseimport…...
如何深刻理解Reactor和Proactor
前言: 网络框架的设计离不开 I/O 线程模型,线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。目前主流的网络框架,在网络 IO 处理层面几乎都采用了I/O 多路复用方案(又以epoll为主),这是服务端应对高并发的性能利器。 …...
java基础 数组Array的介绍
Array 数组定义一维数组多维数组动态数组常见方法Arrays排序1.sort() 排序 2.parallelSort() 排序 查找:binarySearch()填充:fill()比较:equals() 和 deepEquals()复制:copyOf() 和 copyOfRange()转换为列表:asList()转…...
Elixir语言的函数定义
Elixir语言的函数定义 Elixir是一种基于Erlang虚拟机(BEAM)的函数式编程语言,因其并发特性及可扩展性而受到广泛欢迎。在Elixir中,函数是程序的基本构建块,了解如何定义和使用函数对于掌握这门语言至关重要。本文将深…...
我的NISP二级之路-02
目录 一.数据库 二.TCP/IP协议 分层结构 三.STRIDE模型 四.检查评估与自评估 检查评估 自评估 五.信息安全应急响应过程 六.系统工程 七.SSE-CMM 八.CC标准 九.九项重点工作 记背: 一.数据库 关于数据库恢复技术,下列说法不正确的是:…...
k8s1.24升级1.28
0、简介 这里只用3台服务器来做一个简单的集群,当前版本是1.24.17目标升级到1.28.17 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 因为1.24已经更换过了容器运行时,所以之后的升级相对就会简单&am…...
常见的微信个人号二次开发功能
一、常见开发功能 1. 好友管理 好友列表维护 添加/删除好友 修改好友信息(备注、标签等) 分组管理 创建/编辑/删除标签 好友分类与筛选 2. 消息管理 信息发送 支持多类型内容:文本、图片、视频、文件、小程序、名片、URL链接等 附加功…...
unity的dots中instantiate克隆对象后,对象会在原位置闪现的原因和解决
原因 在Entity中有两个位置信息,一个是local transform。一个是local to world 其中local transform负责具体位置,local to world 负责渲染位置,即图像的渲染的位置是根据local to world的。 local to world 的更新是引擎自己控制的&#x…...
去中心化固定利率协议
核心机制与分类 协议类型: 借贷协议(如Yield、Notional):通过零息债券模型(如fyDai、fCash)锁定固定利率。 收益聚合器(如Saffron、BarnBridge):通过风险分级或博弈论…...
Java面试黄金宝典31
1. 什么是封锁协议 定义:封锁协议是在运用封锁机制时,为了保证事务的一致性和隔离性,对何时申请封锁、持锁时间以及何时释放封锁等问题制定的规则。它可防止并发操作引发的数据不一致问题,如丢失修改、不可重复读和读 “脏” 数据…...
