关键操作应在释放而非按下时触发,以便用户中途取消
别名: 抬起触发 · 按下取消 · pointer cancellation
概念解释
指针在目标上按下时还没有承诺;抬起(up-event)时如果仍在目标内,才执行。按下之后可以把指针滑出热区再松开,动作作废。这叫用释放来触发,好让人中途取消。按下当下就开火,滑走来不及,一次落点错误直接变成命令。
机制
一次点击在时间上拆成 down 和 up。把执行绑在 down,取消窗口是零:接触的瞬间状态已经变了。绑在 up,down 和 up 之间的位移是一条逃生通道——热区外抬起 = 没有激活。运动不稳定的人常常在按下之后才发现落点偏了,逃生通道用的是已经发生的接触,不要求重新瞄准第二次。
这条防护管的是「对着目标按下、但决定放弃」的那一次。它不管手指本意是滚动、途经按钮;也不管误触发之后要怎么收回已经提交的结果。按下触发把取消从动作里删掉,只留下事后补救。
怎么研究
在可点控件上记录 pointerdown / pointerup / click 发生时控件是否仍命中测试、以及 down 与 up 之间是否离开过热区。比较「down 执行」和「up 执行」两种实现里,滑出取消的成功率。
自变量:执行绑在哪一事件、热区与视觉是否一致、滑出后是否仍监听。 因变量:滑出后仍被激活的比例、取消意图被尊重的比例。
用真实手指或指针,不要只用合成 click():很多自定义控件把逻辑挂在 mousedown,测试脚本点 click 会漏。
边界
需要按住才成立的交互(钢琴键、对讲、游戏开火)本来就是 down 开始、up 结束,取消模型不同,不要改成「抬起才出声」。拖动手势的 down 是拖的起点,不是提交。键盘激活通常在 keyup 或 click 合成,和指针的 down/up 不是同一条时间线。极短的点按里 down 与 up 几乎重合,取消窗口小,但仍应存在:只要滑出就不该执行。
怎么落地
- 按钮、链接、提交的副作用放在 pointerup 或 click(浏览器默认的抬起合成),不要写在 pointerdown / touchstart。
- 抬起时做命中测试:已经离开热区就不要执行;视觉按下态在滑出时要取消,给人「已经放弃」的反馈。
- 验证:在按钮上按下,滑到按钮外再松开。任何已经提交、已经展开、已经播放的结果,都说明绑在了按下。