为什么keypress事件无法捕获输入的字符?
在给输入框做实时验证时发现,用keypress事件监听输入,event.charCode返回的值总不正确,比如输入字母a会得到97,但转成字符串却变成undefined…
尝试过这样写:
input.addEventListener('keypress', function(event) {
const char = String.fromCharCode(event.charCode);
console.log(char); // 输入"a"时控制台显示""
});
换成keydown事件反而能正确获取keyCode,但不确定这样改是否符合规范?其他同学写的类似功能却能正常显示字符,是不是和浏览器版本有关?
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,实测有效。
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); // 直接输出按下的字符
});
检查一下你的浏览器版本,老古董该升级了。