# CSV Lite 插件右键菜单问题排查与重构全记录 ## 背景 在开发 CSV Lite 插件的过程中,遇到了表格右键菜单(context menu)在 UI/UX 上表现异常、事件处理混乱、菜单关闭不及时等一系列问题。为提升用户体验和代码可维护性,我们对菜单功能进行了彻底重构。本文详细记录了整个排查、修复与重构的过程。 --- ## 1. 问题现象 - 右键菜单弹出后,**点击菜单项第一次不会消失,第二次才消失**。 - 菜单项 hover 效果偶尔失效。 - 菜单关闭后高亮未能及时清除。 - 控制台报错 `addClass/removeClass is not a function` 或 `tableEl.addEventListener is not a function`。 - 工具栏等 UI 元素偶尔消失。 --- ## 2. 初步排查 ### 2.1 事件监听与 DOM 结构 - 检查菜单项点击事件,发现菜单关闭逻辑依赖于 `addClass/removeClass`,但项目中并未实现这两个方法。 - 事件监听器绑定和解绑时机混乱,可能导致多次绑定或未解绑。 ### 2.2 代码实现问题 - 右键菜单相关代码分散,UI 与数据操作耦合严重。 - 菜单项点击后,`closeMenu()` 并未总是被及时调用。 - 绑定菜单的时机不对,`tableEl` 可能还未渲染。 --- ## 3. 修复与重构过程 ### 3.1 替换 addClass/removeClass - 将所有 `addClass/removeClass` 替换为标准的 `classList.add/classList.remove`,保证样式切换生效。 ### 3.2 菜单关闭逻辑梳理 - 确保菜单项点击后立即关闭菜单,并清除高亮。 - 保证 ESC/点击外部也能关闭菜单。 ### 3.3 彻底重构菜单栏功能 - 新增 `MenuManager` 类,专门负责菜单的创建、显示、关闭。 - 菜单项通过参数传递,点击后自动关闭并调用回调。 - 只在表格渲染后(即 `refresh()` 里)绑定右键菜单,确保 `tableEl` 已经是 `