安卓端Chrome触发keydown事件时keyCode、which始终返回229问题求助
问题成因
该问题是安卓版Chrome浏览器符合标准的已知行为:keyCode与which本身属于已被Web标准废弃的API,不同浏览器的实现逻辑本身就存在差异。当浏览器检测到当前按键由输入法进行处理(比如使用拼音、五笔等带联想的非原生英文输入法、正在进行组合输入)时,按照W3C规范会返回固定值229标识当前输入尚未完成,安卓Chrome的实现逻辑中默认会触发该机制,因此所有按键都会返回229,而火狐安卓、iOS各浏览器的输入处理逻辑不同,因此不会触发该问题。
解决方案
- 优先使用标准推荐的
KeyboardEvent.key或KeyboardEvent.code属性替代废弃的keyCode、which:KeyboardEvent.key返回按下按键对应的实际字符,比如按小写a返回"a",按回车键返回"Enter"KeyboardEvent.code返回物理按键的固定标识,比如无论大小写、输入法状态,按下键盘左侧的A键都会返回"KeyA"
以上两个属性在所有主流移动端浏览器都有完善兼容,不会出现返回229的异常问题,修改后的代码示例如下:
@HostListener('keydown', ['$event']) onKeyDown(evt: KeyboardEvent) { console.log('按键字符 : ' + evt.key); console.log('物理按键标识 : ' + evt.code); // 示例:判断是否按下回车键 if (evt.key === 'Enter') { // 对应业务逻辑 } .... } - 若业务场景需要获取用户输入的完整内容,可监听
input事件或者compositionend事件:compositionend会在输入法组合输入完全结束后触发,input事件会在输入框内容发生变化时触发,两种事件都可以拿到准确的输入结果,无需依赖键盘事件的keyCode属性。
内容的提问来源于stack exchange,提问作者GPiter
相关产品推荐
相关产品推荐

