当前版本:v1.8.1
- 每次非修复式更新(含新功能、体验优化)必须同步更新 README.md 和 CHANGELOG.md。
- GitHub 上的提交记录必须详细,包含:问题描述 → 根因分析 → 修复措施。
- 每次非修复式更新完成后,由我审查通过后说"部署"再执行 git push(含推送仓库和标签)以及 Pages rebuild。未经审查不得将代码上传至 GitHub。
原生 HTML + CSS + JavaScript,零依赖。
- 不添加注释
- 遵循现有代码模式
isLocked/类似函数缺失 —renderHist()中引用了isLocked()但该函数从未定义。若未来发现历史区域或相关功能崩溃,优先检查renderHist等渲染函数中是否存在引用但未定义的标识符。- 逐级检查
ReferenceError— 当一个功能看似正常但另一功能异常(如导出无代码),检查是否存在某项功能崩溃后阻断init()后续代码执行。可用浏览器的"Pause on exceptions"定位。 AudioContext自动播放策略 — 浏览器要求 AudioContext 在用户手势后才能resume()。resume()返回 Promise,必须await才能确保后续振荡器正常播放。未 await 会导致需要两次点击才发声。
- 每次非修复式更新完成后,必须由用户审查通过并说"部署"才执行
git push。 - 提交信息必须包含:问题描述 → 根因分析 → 修复措施三部分。
- 发布时创建对应版本 tag(如
v1.7.0)并通过gh api触发 Pages rebuild。 - 所有页面加载时的错误均会阻断
init()后续流程,因此init()中的每步操作都必须稳定无异常。
- 拖拽平移后
click事件抑制 —mouseup过后浏览器会触发click。若拖拽平移了画布,需用panMoved标记 +_suppressClick标志在onMouseUp中设置,onCanvasClick中检查和清除,否则平移后松手会误取色。 disabled替代display:none避免布局抖动 — 用display:none显隐按钮会导致父容器高度突变、界面"拉扯"。改用disabled属性保持占据空间,配合:disabledCSS 灰态即可。- DOM
replaceWith触发同步blur事件 —input.replaceWith(otherNode)会在移除input时同步派发blur。Escape 取消路径需设取消标记(如_hexCancel),在blur中检查并跳过提交逻辑。 - CSS 动画与 DOM 全量重建冲突 —
renderHist()用innerHTML = ''重建全部元素,动画类(favorited)在新元素上从初始态开始,不会播放动画。解决方案:先用classList.toggle在旧元素上即时切换,再setTimeout(renderHist, 150)延迟重建,给浏览器留出动画播放窗口。 selectColor()的副驾驶作用 —selectColor(color)(saveToHist 默认 true)会执行addHist+playPickSound+saveSel+updateStatus+updateExportBtn。撤销或恢复等场景需显式传selectColor({...}, false)阻止历史重复追加,并单独调用saveSel()持久化当前选中色。