Claude Code 全栈实战:从零开发一个任务管理系统
2026/6/10 8:19:05
在前端开发中,动态表格是一个非常基础且高频的需求,比如后台管理系统的列表操作、数据展示页面的行管理等。本文将带大家从零开始,使用原生 JavaScript实现一个支持行添加、行删除、隔行变色的动态表格,全程不依赖任何框架,深入理解 DOM 操作与事件处理的核心逻辑。
我们需要实现的动态表格具备以下功能:
<thead>定义表头,<tbody>承载动态行;document.createElement()动态生成行、单元格、按钮;appendChild()实现节点的层级挂载;<tbody>绑定点击事件,处理删除逻辑;classList.add()/classList.remove()操作元素类名。innerHTML拼接 HTML,而是通过createElement创建<tr>、<td>、<button>等节点,再通过appendChild挂载到父节点上,避免 XSS 风险;<tbody>绑定点击事件,通过事件对象e.target判断点击的是否为删除按钮,实现动态元素的事件处理;html
预览
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>原生JS动态表格</title> <style> table { border-collapse: collapse; margin-top: 10px; width: 400px; } th, td { border: 1px solid #333; padding: 8px 12px; text-align: center; } .blue-bg { background-color: #cce5ff; } button { padding: 4px 8px; cursor: pointer; } </style> </head> <body> <button onclick="selectAll()">新增行</button> <table class="student"> <thead> <tr> <th>序号</th> <th>数字</th> <th>操作</th> </tr> </thead> <tbody> <!-- 动态行将插入这里 --> </tbody> </table> <script> // 初始化序号与数字 let currentIndex = 0; let num = 100; /** * 新增行函数 */ function selectAll() { // 1. 获取tbody容器 const tbody = document.querySelector('tbody'); // 2. 创建tr行节点 const tr = document.createElement('tr'); // 3. 创建序号单元格 const tdIndex = document.createElement('td'); tdIndex.textContent = currentIndex + 1; tr.appendChild(tdIndex); // 4. 创建数字单元格 const tdNum = document.createElement('td'); num += 100; tdNum.textContent = num; tr.appendChild(tdNum); // 5. 创建操作单元格(包含删除按钮) const tdWork = document.createElement('td'); const delBtn = document.createElement('button'); delBtn.textContent = '删除'; tdWork.appendChild(delBtn); tr.appendChild(tdWork); // 6. 将行添加到tbody tbody.appendChild(tr); // 7. 更新序号 currentIndex++; // 8. 重新渲染隔行变色 renderRowStyle(); } /** * 事件委托 - 处理删除逻辑 */ document.querySelector('.student tbody').addEventListener('click', function(e) { // 判断点击的是否为删除按钮 if (e.target.tagName === 'BUTTON' && e.target.textContent === '删除') { // 获取当前行并移除 const targetTr = e.target.parentElement.parentElement; targetTr.remove(); // 重新渲染隔行变色 renderRowStyle(); } }); /** * 渲染隔行变色样式 */ function renderRowStyle() { // 获取所有行 const trList = document.querySelectorAll('tbody tr'); // 遍历所有行,重置样式并重新设置 for (let i = 0; i < trList.length; i++) { trList[i].classList.remove('blue-bg'); // 偶数行(索引+1为偶数)添加蓝色背景 if ((i + 1) % 2 === 0) { trList[i].classList.add('blue-bg'); } } } </script> </body> </html><table>标签搭建表格,<thead>定义表头的 “序号、数字、操作” 三列,<tbody>用于承载动态生成的行;border-collapse: collapse合并表格边框,让表格更美观;.blue-bg类定义隔行变色的背景色;初始化变量
javascript
运行
let currentIndex = 0; // 记录当前序号 let num = 100; // 记录初始数字两个变量分别用于控制新增行的序号递增和数字累加。
新增行函数selectAll()
<tbody>容器,作为动态行的父节点;document.createElement()依次创建<tr>行、<td>单元格、<button>删除按钮;textContent设置单元格和按钮的文本内容,数字以 100 为步长累加;appendChild()将子节点依次挂载到父节点上,形成tbody → tr → td的层级结构;renderRowStyle()函数,重新渲染隔行变色样式。事件委托实现删除功能
javascript
运行
document.querySelector('.student tbody').addEventListener('click', function(e) { if (e.target.tagName === 'BUTTON' && e.target.textContent === '删除') { const targetTr = e.target.parentElement.parentElement; targetTr.remove(); renderRowStyle(); } });<tbody>上;e.target判断触发事件的元素是否为删除按钮;parentElement向上查找,获取当前行<tr>并调用remove()方法移除;renderRowStyle()重新校准样式。隔行变色函数renderRowStyle()
javascript
运行
function renderRowStyle() { const trList = document.querySelectorAll('tbody tr'); for (let i = 0; i < trList.length; i++) { trList[i].classList.remove('blue-bg'); if ((i + 1) % 2 === 0) { trList[i].classList.add('blue-bg'); } } }.blue-bg类,避免样式残留;i+1是否为偶数,若是则添加.blue-bg类,实现隔行变色;currentIndex在删除行后不会重置,若需要删除行后序号重新连续,可在renderRowStyle()函数中遍历行并重新设置序号;<tbody>中添加 “暂无数据” 的提示行,提升用户体验。本文通过原生 JavaScript 实现了动态表格的增删与隔行变色,核心是掌握DOM 动态创建、事件委托和样式重绘这三个知识点。这些知识点是前端开发的基础,也是学习 Vue、React 等框架的前置条件 —— 框架的底层原理正是基于这些原生 API 封装而来。
localStorage),刷新页面后数据不丢失;