停止与发送原地互换要加点击守卫

**「停止」和「发送」放在同一个位置原地互换时,点击停止的瞬间状态已切回 idle、按钮已换成发送,鼠标抬起(click 事件)就落在发送按钮上,把草稿误发出去。修法:离开「发送中」状态后加一段点击守卫(如 500ms),只挡鼠标点击提交,不挡 Enter 发送。**

机制

click 在 mousedown/mouseup 都完成才派发,而按钮的身份在 mousedown 与 mouseup 之间已经改变 → 用户按下的是停止,触发的是发送。这是同一坐标承载两种语义动作的固有竞态,不是偶发 bug。

修法取舍

  • 加时间窗守卫最简单,代价是「停止后极短时间内无法点击发送」(Enter 不受影响)。
  • 更彻底的做法是让两个动作不共享同一命中区(位置分离,或保持元素身份只换内容)。
  • 一般化:任何「同一控件原地切换语义」的交互(播放/暂停、开始/停止、展开/收起)都要考虑这个竞态。

相关