let composing = false;
input.addEventListener('compositionstart', () => composing = true);
input.addEventListener('compositionend', () => composing = false);
input.addEventListener('keydown', e => {
if (e.key === 'Enter' && !composing && !e.isComposing) submit();
});
用拼音输入法打「张伟」,还没选字就按了回车,姓名栏提交上去的是 zhangwei,后台多了一条这样的用户记录。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:输入法组字期间按回车是确认候选词,keydown 里拿到的 key 同样是 Enter。代码没有判断组字状态,把确认候选当成了提交。
这次卡住的地方就在「输入法回车提交」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
处理上按这个顺序:在 compositionstart 和 compositionend 里维护组字标志,keydown 先看它;或者直接判断 event.isComposing 和 keyCode 229,命中就跳过提交;提交前再比对输入框最终值,值变了才发请求。
确认没问题再收工,拼音没选字时按回车只确认候选,选完字再按一次才提交,姓名列不再出现拼音。
