C6.27.4Consistent candidate window dismissal设计研究

候选窗口消失时机需要一致,否则会遗留浮层

别名: 候选窗残留 · 浮层未关闭 · IME 幽灵窗口

概念解释

候选窗应在组字结束、焦点离开、或用户明确取消时立刻消失。若 Esc、点击外部、切换窗口、上屏成功这几条路径里只有一部分会关窗,就会留下一块幽灵浮层:词已经上屏,列表还停在原处,继续吃点击、继续遮挡。消失时机不一致比位置算错更难复现,因为它取决于哪一条退出路径被走到。

机制

候选窗往往是输入法进程里的独立顶层窗口,生命周期由 IME 消息驱动,不是网页 DOM 的卸载。应用若自己处理了失焦却没通知 IME,或 Web 组合事件(compositionend)没发全,窗口就成了孤儿。全屏切换、虚拟桌面跳转、远程桌面重连,都是消息容易丢的边界。残留窗口的命中测试仍在,用户点“空白处”其实点在几个小时前的候选上。与遮挡正在编辑的文本不同:文本遮挡发生在组字中,残留发生在组字后。

怎么研究

列出退出路径:上屏、Esc、点外部、Alt-Tab、关笔记本盖、浏览器翻页、iframe 销毁,逐条看窗口是否还在。自动化抓顶层窗口列表,组字结束后断言 IME 候选窗句柄为零。跨进程(浏览器渲染进程 vs IME)要分别测。现场日志里“透明挡点击”类工单,优先怀疑残留而不是命中区域算错。

边界

有的输入法故意让候选在上屏后短暂停留以便连续选词,那是设计,但必须在下一次击键或超时后仍关闭。触屏键盘收起若与候选脱钩,可能只收键盘不收候选。崩溃后的残留要靠输入法看门狗,应用层清不掉。无障碍工具注入的焦点变化可能漏发 compositionend。

怎么落地

  • 把“关闭候选窗”做成所有退出路径的同一函数,上屏、失焦、取消、页面卸载都走它。
  • 监听 compositionend 与窗口失活,超时仍可见则强制销毁。
  • 不要在页面里用 CSS 藏一个假候选条却不关系统 IME 窗,造成双份。
  • 验证:每条退出路径各做十次,用窗口枚举确认组字结束后没有遗留的候选顶层窗;再点击原窗口位置,确认点击落到下面的应用。

延伸

  • 同组C6.27.1 候选词条通常悬浮在光标附近,容易遮挡正在编辑的文本 · C6.27.2 候选窗口位置需要根据光标离屏幕边缘的距离动态翻转 · C6.27.3 候选窗口遮挡输入框下方的其他控件时会阻断后续操作
  • 相邻C6.12 输入法候选 · C6.25 输入法状态与切换
  • 站内检索IME dismiss · orphan overlay · compositionend

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/C6.27.4