为什么keypress事件无法捕获输入的字符?

闲人树珂 阅读 96

在给输入框做实时验证时发现,用keypress事件监听输入,event.charCode返回的值总不正确,比如输入字母a会得到97,但转成字符串却变成undefined…

尝试过这样写:


input.addEventListener('keypress', function(event) {
  const char = String.fromCharCode(event.charCode);
  console.log(char); // 输入"a"时控制台显示""
});

换成keydown事件反而能正确获取keyCode,但不确定这样改是否符合规范?其他同学写的类似功能却能正常显示字符,是不是和浏览器版本有关?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
♫馨予
♫馨予 Lv1
你遇到的问题不是浏览器版本问题,是 event.charCode 在现代浏览器里早就被废弃了,而且很多场景下根本不会触发。

keypress 这个事件本身就属于过时 API,Chrome 从 89 版开始就默认不触发非字符键的 keypress 了(比如数字、字母在某些输入法下也可能不触发),更别说移动端 Safari 早就基本不支持了。

你看到 event.charCode 是 97,但 String.fromCharCode(event.charCode) 变成空字符串,大概率是因为 event.charCode 实际上是 0(或者 undefined),而 String.fromCharCode(0) 返回的是 'x00',显示出来就像空字符串。

正确做法别用 keypress,直接用 input 事件,或者用 keydown + event.key:

input.addEventListener('input', function(event) {
const char = event.data; // 这才是你刚输入的那个字符
console.log(char);
});

或者如果你非要监听键盘(比如要拦截非法按键),用 keydown:

input.addEventListener('keydown', function(event) {
if (event.key.length === 1) {
console.log(event.key); // 'a', 'B', '1' 这样
}
});

复制过去试试:

input.addEventListener('input', e => console.log(e.data));

这个方案兼容所有现代浏览器,包括 iOS Safari 和 Android Chrome,实测有效。
点赞 1
2026-02-24 17:15
Zz振巧
Zz振巧 Lv1
keypress事件早就被废弃了,不同浏览器表现不一致,换成input事件最靠谱。直接上代码:

input.addEventListener('input', function(event) {
const value = event.target.value;
console.log(value.slice(-1)); // 获取最后输入的字符
});

如果非要用键盘事件,推荐keydown配合event.key,简单粗暴:

input.addEventListener('keydown', function(event) {
console.log(event.key); // 直接输出按下的字符
});

检查一下你的浏览器版本,老古董该升级了。
点赞 11
2026-02-14 17:53