C6.27.4Consistent candidate window dismissal设计研究
候选窗口消失时机需要一致,否则会遗留浮层
别名: 候选窗残留 · 浮层未关闭 · IME 幽灵窗口
概念解释
候选窗应在组字结束、焦点离开、或用户明确取消时立刻消失。若 Esc、点击外部、切换窗口、上屏成功这几条路径里只有一部分会关窗,就会留下一块幽灵浮层:词已经上屏,列表还停在原处,继续吃点击、继续遮挡。消失时机不一致比位置算错更难复现,因为它取决于哪一条退出路径被走到。
机制
候选窗往往是输入法进程里的独立顶层窗口,生命周期由 IME 消息驱动,不是网页 DOM 的卸载。应用若自己处理了失焦却没通知 IME,或 Web 组合事件(compositionend)没发全,窗口就成了孤儿。全屏切换、虚拟桌面跳转、远程桌面重连,都是消息容易丢的边界。残留窗口的命中测试仍在,用户点“空白处”其实点在几个小时前的候选上。与遮挡正在编辑的文本不同:文本遮挡发生在组字中,残留发生在组字后。
怎么研究
列出退出路径:上屏、Esc、点外部、Alt-Tab、关笔记本盖、浏览器翻页、iframe 销毁,逐条看窗口是否还在。自动化抓顶层窗口列表,组字结束后断言 IME 候选窗句柄为零。跨进程(浏览器渲染进程 vs IME)要分别测。现场日志里“透明挡点击”类工单,优先怀疑残留而不是命中区域算错。
边界
有的输入法故意让候选在上屏后短暂停留以便连续选词,那是设计,但必须在下一次击键或超时后仍关闭。触屏键盘收起若与候选脱钩,可能只收键盘不收候选。崩溃后的残留要靠输入法看门狗,应用层清不掉。无障碍工具注入的焦点变化可能漏发 compositionend。
怎么落地
- 把“关闭候选窗”做成所有退出路径的同一函数,上屏、失焦、取消、页面卸载都走它。
- 监听 compositionend 与窗口失活,超时仍可见则强制销毁。
- 不要在页面里用 CSS 藏一个假候选条却不关系统 IME 窗,造成双份。
- 验证:每条退出路径各做十次,用窗口枚举确认组字结束后没有遗留的候选顶层窗;再点击原窗口位置,确认点击落到下面的应用。