laoyang
257c38e16a
修复中文输入法下 , / . 选词失效:认全角标点 + beforeinput 兜底
用户实测:切到「, 和 .」模式后,中文输入法下按逗号/句号,仍被当普通字符输进
搜索框,没能选词。根因是上一版判定只认半角 —— `e.key === ','` 或
`e.code === 'Comma'`,而中文输入法上屏的是全角「,」(U+FF0C) /「。」(U+3002),
且此时 e.code 不一定是 'Comma'/'Period'(取决于浏览器与输入法),于是漏判。
- isComma / isPeriod 改为以 e.key 的字符为主判据,半角 + 全角都认
(全角句号另兼容全角句点 .U+FF0E),e.code 仅作辅助。
- 新增 beforeinput 兜底:字符即将插入文本框前触发,e.data 就是要插入的字符,
是拦全角标点最可靠的一道 —— 有些输入法下标点根本不走可靠的 keydown。
命中就 preventDefault(不插入)并移动选中项;仅「下拉打开 + punct/both」下生效,
没有下拉时放行(逗号句号照常输入)。
- 新增 IME 组合态保护:打拼音时 keydown 带 isComposing(或 keyCode=229),
这些按键属于输入法自己,不能当选词键拦下。
- keydown 与 beforeinput 可能对同一次按键都触发 → 加 punctByKeyDown 去重闸门,
防止「跳两格」;抽出 moveSelection() 供两条路径共用。
测试(jsdom 59/59,arrows/punct/both + IME 专项各一遍):
- 核心③用「全角字符 + code 为空」的事件形态断言(上一版测试人为把 code 设成
'Comma',恰好掩盖了这个 bug —— 本次一并修正测试盲区)。
- 覆盖 beforeinput 兜底、IME 组合态不误判、keydown+beforeinput 去重不跳两格。
反向验证三变体:A 回车套第一条 → 挂核心①;B 判定改回只认半角 → 挂核心③全角;
C 删 beforeinput 兜底 → 挂兜底断言。三者均精确命中对应断言。
e2e 128/128;线上部署 0 FAIL(82 条静态断言);线上几何 25/25;直连核验 app.js 就位。
2026-09-28 21:01:22 +08:00
..
2026-09-28 20:01:25 +08:00
2026-09-28 15:48:35 +08:00
2026-09-28 15:48:35 +08:00
2026-09-28 21:01:22 +08:00
2026-09-28 16:43:10 +08:00