事件委托实战:用 30 行代码实现可排序表格(zh.javascript.info 教程任务解析)
文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载导读本文基于《现代 JavaScript 教程》zh.javascript.info事件委托章节的可排序表格任务完整拆解如何只用一个挂在table上的点击处理程序让表格按任意列数字 / 字符串排序。你将从任务定义、源码实现到原理剖析掌握事件委托event delegation、event.target、dataset特性读取与Array.prototype.sort在真实 UI 场景中的组合用法并理解为什么容器一个监听器能替代每个表头一个监听器。任务背景它从属于事件委托章节本任务是 03-event-delegation 章节下编号为3-sortable-table的配套练习隶属于 2-ui 部分的事件板块2-events。同章节还有隐藏消息委托1-hide-message-delegate、滑动树2-sliding-tree、行为提示框4-behavior-tooltip等练习共同目的是把《事件委托》正文中的模式落到真实交互上。在正文中核心算法被概括为三步在容器container上放一个处理程序在处理程序中检查源元素event.target如果事件发生在我们感兴趣的元素内则处理该事件。本任务正是这一算法在表格排序上的典型应用容器是table感兴趣的元素是表头th处理动作是按该列重排行。任务定义点击表头按列排序完整任务原文见 task.md要求如下使表格可排序点击th元素时按对应列对表格排序每个th通过特性attribute声明列的类型例如data-typenumber与data-typestring排序函数必须依据类型进行排序数字列按数值大小字符串列按字典序只支持string和number两种类型表格可以有任意数量的行和列示例中为 5 行 2 列。任务给出的起始 HTML 结构与 source.view/index.html 一致table idgrid thead tr th>grid.onclick function(e) { if (e.target.tagName ! TH) return; let th e.target; // cellIndex 是 th 的序号 // 0 代表第一列 // 1 代表第二列以此类推 sortGrid(th.cellIndex, th.dataset.type); }; function sortGrid(colNum, type) { let tbody grid.querySelector(tbody); let rowsArray Array.from(tbody.rows); // compare(a, b) 比较两行供排序使用 let compare; switch (type) { case number: compare function(rowA, rowB) { return rowA.cells[colNum].innerHTML - rowB.cells[colNum].innerHTML; }; break; case string: compare function(rowA, rowB) { return rowA.cells[colNum].innerHTML rowB.cells[colNum].innerHTML ? 1 : -1; }; break; } // 排序 rowsArray.sort(compare); tbody.append(...rowsArray); }配套的表格 HTML5 行 2 列Age 为数字、Name 为字符串table idgrid thead tr th>grid.onclick function(e) { if (e.target.tagName ! TH) return; ... };监听器挂在table idgrid上点击表格内任意位置包括td内的文本、表头都会因事件冒泡到达这里e.target是实际被点击的最深层元素。只有当它确实是th时才继续——这是正文中if (target.tagName ! TD) return;模式的直接复刻因为th内部没有嵌套子元素示例中表头只有纯文本所以这里直接判断tagName即可无需像正文示例那样使用closest(td)向上查找。若日后表头里放进图标、span等嵌套元素则应改用th.closest(th)并配合grid.contains(th)校验规避正文中提到的嵌套表格穿透问题。第 2 步读取列号与类型let th e.target; sortGrid(th.cellIndex, th.dataset.type);th.cellIndexth元素自带的行内序号属性0 表示第一列、1 表示第二列……无需自己遍历children数位置这是实现任意列通用排序的关键th.dataset.typeHTML 中data-typenumber特性会通过dataset自动映射为th.dataset.typedata-*转驼峰命名一行代码拿到列类型。第 3 步按类型构造比较器switch (type) { case number: compare function(rowA, rowB) { return rowA.cells[colNum].innerHTML - rowB.cells[colNum].innerHTML; }; break; case string: compare function(rowA, rowB) { return rowA.cells[colNum].innerHTML rowB.cells[colNum].innerHTML ? 1 : -1; }; break; }数字列innerHTML会被-运算符隐式转为数字a - b返回负数 / 零 / 正数正好满足Array.prototype.sort对比较函数返回负值则 a 在前的约定保证按数值升序字符串列用直接比较字符串按 Unicode 字典序返回1或-1相等时无碍因为示例数据没有重复名为什么不直接对单元格文本排序这里比较的是整行rowA/rowB通过rowA.cells[colNum]取出目标列的单元格——排序后行整体移动各列数据始终对齐不会出现只排了一列、其他列错位的经典 bug。第 4 步排序并写回 DOMlet rowsArray Array.from(tbody.rows); rowsArray.sort(compare); tbody.append(...rowsArray);tbody.rows是 HTMLCollection类数组必须先Array.from转成真数组才能调用sortappend(...rowsArray)把排序后的行一次性追加回tbodyDOM 中已经存在的元素被重新 append 时会自动从原位置移动到新位置因此无需先remove再插入排序只涉及 5 个tr的 DOM 重排开销极小且天然支持任意行数。为什么事件委托在这里是正确选择对照正文总结的收益清单本任务逐条印证简化初始化并节省内存若表格有 50 列常规写法需要 50 个onclick处理程序委托写法始终只有 1 个grid.onclick与列数无关更少的代码DOM 修改友好后续用innerHTML批量增删行、甚至动态增删th监听器依然有效无需重新绑定数据与行为分离data-type特性让列的类型成为标记的一部分排序引擎对列内容无感知扩展新列只需写一个th>赞分享文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载相关推荐en.javascript.info 事件委托实战手写一个点击表头即可排序的可排序 HTML 表格en.javascript.info 事件委托实战手写一个点击表头即可排序的可排序 HTML 表格 本篇指南围绕 Modern JavaScript Tuto文档/教程前端JavaScript 事件委托实战基于事件委托实现可折叠树形菜单Sliding TreeJavaScript 事件委托实战基于事件委托实现可折叠树形菜单Sliding Tree 事件委托Event Delegation是 DOM 事件处理文档/教程前端表格单元格点击编辑实战用事件委托与 focus 构建可编辑表格单元格表格单元格点击编辑实战用事件委托与 focus 构建可编辑表格单元格 导读 本文基于 Modern JavaScript Tutorial本仓库 2 ui/文档/教程前端上一篇Clair v4 HTTP API v1 实战指南OpenAPI 规范、端点与客户端接入下一篇从游戏卡顿到流畅体验DLSS Swapper如何帮你掌控图形技术升级创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Midway 标签组件 @midwayjs/tags 使用指南:从内存到 MySQL 的通用标签系统实战

Midway 标签组件 @midwayjs/tags 使用指南:从内存到 MySQL 的通用标签系统实战

后端微服务云原生 【免费下载链接】midway 🍔 A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate w…

2026/10/13 11:05:00 阅读更多 →
k0s 节点重装指南:通过 k0sctl 迁移 containerd data-dir 并将节点重新接入集群

k0s 节点重装指南:通过 k0sctl 迁移 containerd data-dir 并将节点重新接入集群

云原生容器编排边缘计算 【免费下载链接】k0s k0s - The Zero Friction Kubernetes 项目地址: https://gitcode.com/gh_mirrors/k0/k0s 点击查看 免费下载 本指南讲解如何借助 k0sctl 对集群中的节点执行"重装(reinstall)"&#x…

2026/10/13 11:04:59 阅读更多 →
AlgoNote 算法通关手册:LeetCode 343 整数拆分——动态规划五步法经典题解

AlgoNote 算法通关手册:LeetCode 343 整数拆分——动态规划五步法经典题解

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod…

2026/10/10 1:53:55 阅读更多 →

最新新闻

Windows下MySQL安装配置与卸载全攻略:从版本选择到残留清理

Windows下MySQL安装配置与卸载全攻略:从版本选择到残留清理

如果你也在Windows上折腾过MySQL,应该能理解那种感受:下载页面一堆版本不知道选哪个,安装到一半卡住,装完了服务起不来,或者换版本时残留文件清不干净,重装总报错。这些坑我基本都踩过一遍,花了…

2026/10/13 11:04:15 阅读更多 →
Thingsboard接入Modbus协议的工程实践与稳定架构设计

Thingsboard接入Modbus协议的工程实践与稳定架构设计

1. 项目概述:为什么一个工业协议接入模块值得单独深挖?“Thingsboard modbus协议”——这六个字背后,不是一句轻飘飘的配置说明,而是一条横跨工业现场与云端管理的真实数据链路。我第一次在某智能配电柜远程监控项目里碰上这个组合…

2026/10/13 11:04:15 阅读更多 →
MySQL与Redis缓存一致性实战:从原理到架构选型

MySQL与Redis缓存一致性实战:从原理到架构选型

做后端这几年,我算是把“缓存和数据库数据对不上”这件事踩透了。团队经常半夜被叫醒,一查原因,十有八九是 Redis 里的旧数据还在服务,而 MySQL 里的记录早就改了。这问题听着朴素,真要讲清楚,背后牵扯到读…

2026/10/13 11:04:15 阅读更多 →
电商数据分析实战:从CLV到营收预测的完整链路

电商数据分析实战:从CLV到营收预测的完整链路

这种预测需求,在如今做电商数据分析的人手里,几乎每周都会撞上一次:老板在周会上盯着营收曲线,问"下个月能不能回到峰值""这批流失客户还值不值得砸券召回";运营拿着用户分群报表,却不…

2026/10/13 11:04:15 阅读更多 →
SpringBoot直连Hive:JDBC接入全流程与常见坑详解

SpringBoot直连Hive:JDBC接入全流程与常见坑详解

最近在给一个数据平台做数据接口,需要让SpringBoot服务通过JDBC直连Hive,把数仓里的离线结果表实时捞过来给前端展示。这个说起来好像就是连个数据库,但实际操作中,Hive和MySQL这些传统关系型数据库在驱动、依赖、协议、会话管理上…

2026/10/13 11:04:15 阅读更多 →
Java全栈演唱会售票系统开发与高并发优化实践

Java全栈演唱会售票系统开发与高并发优化实践

1. 项目概述与核心价值演唱会售票系统是连接演出主办方与观众的关键数字化桥梁。这个基于Java技术栈的全栈解决方案,通过SpringBoot/SSM后端Vue前端uniapp多端的组合架构,实现了从票务管理、在线选座到移动端购票的完整闭环。我在实际票务系统开发中发现…

2026/10/13 11:03:11 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →