为什么 keypress 事件在 Vue 里监听不到方向键?
我最近在用 Vue 做一个简单的键盘控制功能,想用 keypress 监听方向键(比如左、右箭头),但发现完全没反应。查了文档说 keypress 只对能产生字符的按键有效,那是不是意味着方向键根本不会触发 keypress?但我试过换成 keydown 就可以,只是不太确定该不该换,会不会有兼容性问题?
下面是我写的代码:
<template>
<input @keypress="handleKeyPress" placeholder="按方向键试试" />
</template>
<script>
export default {
methods: {
handleKeyPress(e) {
console.log('按下了:', e.key);
}
}
}
</script>
keypress 监听不到方向键是正常的浏览器行为,不是 Vue 的问题。keypress 事件的设计初衷是监听能产生字符输入的按键,比如字母、数字、符号这些。方向键、Shift、Ctrl、Esc 这些功能键都不会触发 keypress。
放心换成 keydown 吧,兼容性完全没问题。keydown 是所有按键都能监听到,而且浏览器支持非常广泛,从 IE6 时代就有了,不用担心。
改成这样就行:
顺便说一句,Vue 还支持按键修饰符,写起来更简洁。比如只监听上下方向键可以这样写:
@keydown.up或@keydown.down,方向键对应的修饰符是.up、.down、.left、.right。简单总结一下就是:keypress 已经过时了,MDN 都标注为废弃状态,以后统一用 keydown 就完事了。