Files
cmautobuy/docs/task/56-修复拖选密码时弹窗意外关闭.md
T
2026-08-09 16:32:12 +08:00

2.8 KiB

56 Admin:修复拖选密码时弹窗意外关闭

  • 类型:缺陷
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 Admin 四模块可用闭环
  • 状态:已完成
  • 日期:2026-08-09
  • Gitea 工单:#56

背景与目标

用户在密码输入框内按住鼠标拖选内容,移到弹窗外的灰色遮罩后松开时,浏览器会把 合成的 click 目标设为遮罩。原公共逻辑只判断最终目标,因而误关弹窗并丢失输入。

目标是区分“真正点击遮罩”和“从弹窗内容拖到遮罩”:前者继续关闭,后者保留弹窗 和输入内容。

最终方案

  • 公共弹窗在 pointerdown 时记录手势是否从遮罩本身开始。
  • 最终 click 只有同时满足“目标是遮罩”和“手势从遮罩开始”才关闭。
  • pointercancel 清理记录,避免取消的手势影响下一次操作。
  • 带 data-modal-close 的关闭/取消按钮仍直接关闭,Esc 行为不变。
  • 该修复位于公共逻辑,对新增用户、重置密码以及其他公共弹窗统一生效。
  • 增加静态回归守卫,并使用项目实际 app.js 在 Chrome 中验证真实指针事件。

实际实现与建单方案一致,没有修改密码规则、表单提交、数据库或服务端接口。

改了哪些

  • admin/static/js/app.js:增加遮罩手势起点判断和取消状态清理。
  • admin/main_test.go:增加公共弹窗拖选防误关闭的静态回归守卫。
  • docs/admin/05-ui-specification.md:记录公共弹窗遮罩关闭的手势边界。

验收结果

验收标准 结果
从密码框拖到遮罩松开时弹窗保持打开 通过
拖选后输入内容保持不变 通过
直接点击遮罩仍关闭弹窗 通过
关闭按钮和取消按钮仍关闭弹窗 通过
Esc 仍关闭弹窗 通过
公共弹窗统一使用修复后的逻辑 通过
不改变表单和服务端行为 通过
Go 静态检查和全量测试通过 通过
Go 1.23.0 构建和无缓存测试通过 通过

测试

  • Chrome 真实指针事件:输入框内按下并拖到遮罩松开,弹窗和密码值保留; 遮罩直点、取消、叉号、Esc 分别验证仍能关闭。
  • 执行的命令:cd admin; gofmt -w main_test.go; go vet ./...; go test ./...
  • 执行的命令:$env:GOTOOLCHAIN="go1.23.0"; go build ./...; go test ./... -count=1; Remove-Item Env:GOTOOLCHAIN
  • 结果:go version go1.23.0 windows/amd64;浏览器回归、构建和所有测试通过。
  • 没验证到的部分:未在用户当前浏览器和实际业务数据环境中人工操作;Chrome 已使用项目实际 app.js 完成等价指针事件验证。

相关提交

  • ff75b27 fix: 防止拖选内容误关闭弹窗 (#56)