news 2026/3/14 17:43:45

用jQuery实现表格的新增与删除

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用jQuery实现表格的新增与删除

在后台管理系统、表单录入页面等前端开发场景中,表格是数据展示与交互的核心载体,而 “动态新增 / 删除表格行” 是高频且基础的业务需求 —— 小到商品订单明细录入,大到员工信息批量编辑,都离不开这一功能。本文将从业务场景拆解、核心原理剖析、代码优化实现、拓展方案落地四个维度,手把手教你用 jQuery 实现企业级标准的表格行动态增删功能,代码兼顾可读性、可维护性与用户体验,适配新手学习与生产环境直接复用。

一、精准拆解业务需求(从 “能用” 到 “好用”)

我们不仅要实现基础功能,更要贴合实际业务场景的交互逻辑,核心需求如下:

  1. 新增行:点击 “新增表格行” 按钮,在表格末尾追加一行,序号自动递增,默认内容可自定义;
  2. 删除行:每行配备删除按钮,点击后弹出确认弹窗(防止误操作),删除后剩余行序号自动重排;
  3. 空状态处理:删除最后一行时,表格显示 “暂无数据” 提示,提升空状态用户体验;
  4. 样式与交互:符合现代 UI 设计规范,按钮、表格有 hover 反馈,适配不同屏幕尺寸;
  5. 可拓展性:预留行内编辑、数据收集接口,满足后续业务迭代需求。

二、企业级完整实现代码(开箱即用)

html

预览

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>jQuery 动态增删表格行(企业级方案)</title> <!-- 引入 jQuery 库(优先CDN,兼容本地备用) --> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <script> // 降级处理:CDN加载失败时加载本地jQuery window.jQuery || document.write('<script src="../js/jquery-3.7.1.min.js"><\/script>'); </script> <style> /* 基础样式重置:消除浏览器默认差异 */ * { margin: 0; padding: 0; box-sizing: border-box; } body { padding: 30px; font-family: "Inter", "Microsoft Yahei", sans-serif; background-color: #f8fafc; } /* 表格容器:适配响应式 */ .table-container { width: 90%; max-width: 1000px; margin: 0 auto; } /* 表格样式:企业级视觉规范 */ #myTable { width: 100%; border-collapse: collapse; margin: 20px 0; background-color: #fff; border-radius: 8px; overflow: hidden; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } #myTable th { background-color: #f1f5f9; color: #1e293b; font-weight: 600; padding: 16px; text-align: center; border-bottom: 2px solid #e2e8f0; } #myTable td { padding: 16px; text-align: center; border-bottom: 1px solid #e2e8f0; color: #334155; } #myTable tr:hover { background-color: #f8fafc; transition: background-color 0.2s ease; } /* 空状态提示 */ .empty-tip { height: 80px; line-height: 80px; color: #94a3b8; text-align: center; } /* 新增按钮样式:符合交互规范 */ .add-btn { display: block; width: 160px; height: 44px; line-height: 44px; text-align: center; background-color: #3b82f6; color: #fff; border-radius: 8px; margin: 0 auto 20px; cursor: pointer; border: none; font-size: 15px; transition: all 0.2s ease; } .add-btn:hover { background-color: #2563eb; transform: translateY(-1px); } .add-btn:active { transform: translateY(0); } /* 删除按钮样式 */ .del-btn { padding: 6px 16px; background-color: #ef4444; color: #fff; border: none; border-radius: 6px; cursor: pointer; font-size: 13px; transition: background-color 0.2s ease; } .del-btn:hover { background-color: #dc2626; } /* 响应式适配:移动端优化 */ @media (max-width: 768px) { .table-container { width: 100%; overflow-x: auto; } #myTable { min-width: 600px; } .add-btn { width: 140px; height: 40px; line-height: 40px; } } </style> </head> <body> <div class="table-container"> <!-- 新增按钮 --> <button class="add-btn" id="addTableRow">新增表格行</button> <!-- 表格容器 --> <table id="myTable"> <thead> <tr> <th>序号</th> <th>内容</th> <th>操作</th> </tr> </thead> <tbody id="tableBody"> <!-- 初始行 --> <tr> <td>1</td> <td>默认内容</td> <td><button class="del-btn">删除</button></td> </tr> </tbody> </table> </div> <script> // jQuery 入口函数:确保DOM加载完成 $(function() { // 缓存DOM节点:减少重复选择器查询,提升性能 var $tableBody = $("#tableBody"); var $addBtn = $("#addTableRow"); // 初始化空状态检查 checkEmptyState(); // 1. 新增表格行核心逻辑 $addBtn.on("click", function() { // 获取当前行数,计算新序号 var rowCount = $tableBody.find("tr").length + 1; // 构建新行(模板化,便于后续维护) var newTr = $(` <tr> <td>${rowCount}</td> <td>新增内容</td> <td><button class="del-btn">删除</button></td> </tr> `); // 移除空状态提示(如果存在) $tableBody.find(".empty-tip").remove(); // 追加新行 $tableBody.append(newTr); }); // 2. 删除表格行逻辑(事件委托:兼容动态元素) $tableBody.on("click", ".del-btn", function() { // 确认删除:防止误操作 if (!confirm("确定要删除这一行吗?")) { return; } // 删除当前行 $(this).closest("tr").remove(); // 重新排序序号 resetRowIndex(); // 检查空状态 checkEmptyState(); }); // 工具函数:重置表格行序号 function resetRowIndex() { $tableBody.find("tr").each(function(index) { $(this).find("td:first").text(index + 1); }); } // 工具函数:检查并处理表格空状态 function checkEmptyState() { var rowNum = $tableBody.find("tr").length; if (rowNum === 0) { $tableBody.html('<div class="empty-tip">暂无数据,点击"新增表格行"添加</div>'); } } // 拓展函数:收集表格数据(供表单提交使用) window.collectTableData = function() { var dataList = []; $tableBody.find("tr").each(function() { var $tds = $(this).find("td"); dataList.push({ index: $tds.eq(0).text(), content: $tds.eq(1).text() }); }); return dataList; }; }); </script> </body> </html>

三、核心原理深度拆解(知其然更知其所以然)

1. 性能优化:DOM 节点缓存

javascript

运行

var $tableBody = $("#tableBody"); var $addBtn = $("#addTableRow");
  • 传统写法中多次使用$("#tableBody")会重复查询 DOM,缓存节点可减少 80% 以上的 DOM 查询开销;
  • 命名规范:缓存的 jQuery 对象前缀加$,便于区分普通变量,提升代码可读性。

2. 事件委托:解决动态元素绑定失效问题

javascript

运行

$tableBody.on("click", ".del-btn", function() { ... })
  • 核心原理:利用事件冒泡机制,将点击事件绑定到静态存在的父元素(tbody),而非动态创建的删除按钮;
  • 对比原生绑定:若直接用$(".del-btn").click(),新增行的删除按钮因初始化时不存在,点击会完全失效;
  • 性能优势:仅绑定一个事件到父元素,而非为每个按钮绑定事件,减少内存占用。

3. 工具函数封装:提升代码可维护性

将 “重置序号”“检查空状态” 等逻辑封装为独立函数,符合 “单一职责原则”:

  • resetRowIndex():专注处理序号重排,后续修改序号规则只需改这一个函数;
  • checkEmptyState():统一处理空状态展示,便于后续修改空状态文案 / 样式;
  • 函数命名语义化,新手也能快速理解功能。

4. 交互体验优化:细节决定用户体验

  • 确认删除弹窗confirm()拦截误操作,符合企业级产品交互规范;
  • 空状态提示:删除最后一行时显示友好提示,避免表格空白导致用户困惑;
  • 响应式适配:移动端表格横向滚动,按钮尺寸适配,兼容手机 / 平板 / PC;
  • 按钮动效:hover 时轻微上移、active 时复位,符合现代交互设计趋势。

5. 鲁棒性保障:jQuery 降级处理

javascript

运行

window.jQuery || document.write('<script src="../js/jquery-3.7.1.min.js"><\/script>');
  • CDN 可能因网络问题加载失败,增加降级逻辑可保证功能在离线 / CDN 故障时仍可用;
  • 这是企业级项目的标配,避免因第三方资源问题导致功能瘫痪。

四、企业级拓展方案(适配复杂业务场景)

1. 行内编辑功能(核心拓展)

将静态文本改为可编辑输入框,满足数据录入需求:

javascript

运行

// 改造新增行逻辑:内容列改为输入框 var newTr = $(` <tr> <td>${rowCount}</td> <td><input type="text" value="新增内容" class="edit-input"></td> <td><button class="del-btn">删除</button></td> </tr> `); // 同步修改数据收集函数 window.collectTableData = function() { var dataList = []; $tableBody.find("tr").each(function() { var $tds = $(this).find("td"); dataList.push({ index: $tds.eq(0).text(), // 读取输入框值 content: $tds.eq(1).find(".edit-input").val() }); }); return dataList; };

2. 批量操作:全选 / 批量删除

html

预览

<!-- 新增全选列 --> <thead> <tr> <th><input type="checkbox" id="selectAll"></th> <th>序号</th> <th>内容</th> <th>操作</th> </tr> </thead> <!-- 新增批量删除按钮 --> <button class="add-btn" style="background: #f97316;" id="batchDelBtn">批量删除选中行</button>

javascript

运行

// 全选/取消全选 $("#selectAll").on("click", function() { var isChecked = $(this).prop("checked"); $tableBody.find("tr").each(function() { $(this).find("td:first input").prop("checked", isChecked); }); }); // 批量删除 $("#batchDelBtn").on("click", function() { var $checkedRows = $tableBody.find("tr:has(input:checked)"); if ($checkedRows.length === 0) { alert("请选择要删除的行"); return; } if (confirm(`确定要删除选中的 ${$checkedRows.length} 行吗?`)) { $checkedRows.remove(); resetRowIndex(); checkEmptyState(); } });

3. 数据校验:防止空内容提交

javascript

运行

// 提交前校验 window.validateTableData = function() { var isValid = true; $tableBody.find("tr").each(function(index) { var content = $(this).find("td:eq(1)").text().trim(); if (content === "" || content === "新增内容") { alert(`第 ${index + 1} 行内容不能为空,请填写后提交`); isValid = false; return false; // 终止遍历 } }); return isValid; };

四、生产环境避坑指南(90% 开发者会踩的坑)

常见问题根本原因解决方案
删除按钮点击无反应直接绑定事件到动态元素改用事件委托,绑定到静态父元素(如 tbody)
序号重排遗漏部分行选择器范围错误确保resetRowIndex()只遍历tbody下的tr,排除空状态提示
移动端表格变形未做响应式适配给表格容器加overflow-x: auto,设置表格最小宽度
jQuery 未定义CDN 加载失败增加降级逻辑,优先 CDN 后本地文件
数据收集为空空状态提示被误判为行收集数据时过滤.empty-tip元素

五、性能与可维护性优化建议

  1. 减少 DOM 操作:新增行时先移除空状态提示,再追加新行,避免多次修改 DOM;
  2. 代码模块化:复杂场景下可将表格逻辑封装为独立的 jQuery 插件,示例:

    javascript

    运行

    $.fn.dynamicTable = function(options) { // 插件逻辑:新增、删除、序号重置等 }; // 使用:$("#myTable").dynamicTable({/* 配置项 */});
  3. 注释规范:关键函数、复杂逻辑添加注释,便于团队协作维护;
  4. 兼容性:如需兼容 IE 浏览器,需将模板字符串改为String.concat(),并补充 ES6 垫片。

总结

  1. 核心逻辑:动态增删表格行的核心是「DOM 节点操作 + 事件委托」,事件委托是解决动态元素绑定失效的唯一方案;
  2. 企业级标准:需兼顾性能(DOM 缓存)、体验(空状态、确认弹窗)、鲁棒性(降级处理)、可维护性(函数封装);
  3. 拓展思路:基于核心逻辑可快速拓展行内编辑、批量操作、数据校验等功能,适配复杂业务场景。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/11 22:45:38

用Z-Image-Turbo做了个AI封面生成器,效果惊艳

用Z-Image-Turbo做了个AI封面生成器&#xff0c;效果惊艳 你有没有遇到过这种情况&#xff1a;写完一篇技术文章&#xff0c;却卡在最后一步——找不到一张合适的封面图&#xff1f;找免费图怕侵权&#xff0c;自己设计又不会PS&#xff0c;外包制作成本太高……直到我遇见了 …

作者头像 李华
网站建设 2026/3/12 3:59:40

原来这么简单!Open-AutoGLM手机自动化初体验

原来这么简单&#xff01;Open-AutoGLM手机自动化初体验 摘要&#xff1a;本文带你用最轻快的方式上手智谱开源的 Open-AutoGLM 手机 AI 助理框架。不讲原理、不堆参数&#xff0c;只聚焦“怎么连”“怎么动”“怎么用”&#xff0c;从第一次连接手机到成功执行指令&#xff0c…

作者头像 李华
网站建设 2026/3/11 22:57:08

IQuest-Coder-V1与Qwen-Coder对比评测:复杂工具使用场景实战

IQuest-Coder-V1与Qwen-Coder对比评测&#xff1a;复杂工具使用场景实战 1. 引言&#xff1a;当代码模型走进真实开发战场 你有没有遇到过这样的情况&#xff1a;写一个功能&#xff0c;不仅要调用API&#xff0c;还要解析日志、操作数据库、生成配置文件&#xff0c;甚至要和…

作者头像 李华
网站建设 2026/3/9 22:32:30

Whisper-large与SenseVoiceSmall对比:情感识别能力谁更强?

Whisper-large与SenseVoiceSmall对比&#xff1a;情感识别能力谁更强&#xff1f; 在语音识别技术不断演进的今天&#xff0c;越来越多的模型不再满足于“听清”用户说了什么&#xff0c;而是进一步追求“听懂”背后的语气、情绪和环境信息。尤其是在客服质检、内容审核、智能…

作者头像 李华
网站建设 2026/3/14 13:49:59

AI开发者必看:Qwen3-4B-Instruct开源模型部署趋势与优化策略

AI开发者必看&#xff1a;Qwen3-4B-Instruct开源模型部署趋势与优化策略 1. Qwen3-4B-Instruct-2507&#xff1a;新一代轻量级文本生成模型的崛起 在当前大模型快速迭代的背景下&#xff0c;阿里推出的 Qwen3-4B-Instruct-2507 正逐渐成为AI开发者的热门选择。这款基于40亿参…

作者头像 李华