应优先使用 beforeinput 事件阻止数字输入,因其可取消且不受输入法干扰;次选 keydown 并需判断 key/code 及组合键;input 事件仅作兜底清洗。

可以在文本输入框的 input 或 keydown 事件中调用 preventDefault(),阻止数字字符被插入。但要注意:直接在 input 事件中调用 preventDefault() 无效(该事件是冒泡阶段且不可取消),应优先使用 keydown 或 beforeinput。
使用 keydown 事件拦截数字按键
这是最常用、兼容性好的方式。监听 keydown,判断按下的键是否为数字键(包括主键盘区和小键盘区),匹配则阻止默认行为:
- 检测
event.key是否为 '0'–'9',或event.code是否以 'Digit' 或 'Numpad' 开头 - 注意:需同时处理中文输入法下可能触发的按键(如用户正在输入中文,按数字键可能只是候选编号,不应拦截)
- 建议加上
event.ctrlKey/event.metaKey判断,避免误拦 Ctrl+V 等组合操作
更精准:用 beforeinput 替代 keydown
beforeinput 事件在浏览器实际插入内容前触发,且可取消,语义更准确:
- 监听
beforeinput,检查event.data(即将插入的字符串)是否包含数字 - 若包含,调用
event.preventDefault()即可阻止插入 - 相比
keydown,它不依赖按键码,不受输入法状态干扰,也无需区分小键盘 - 注意兼容性:IE 不支持,但现代 Chrome/Firefox/Safari 均支持
补充:输入后清理(兜底方案)
仅靠事件拦截不能覆盖所有情况(如粘贴含数字的文本、拖入、语音输入等),建议结合 input 事件做二次过滤:
- 监听
input,获取当前input.value - 用正则
value.replace(/\d/g, '')清除所有数字 - 将清洗后的值重新赋给
input.value,并手动同步光标位置(否则光标会跳到末尾) - 此步非必须,但能提升健壮性
不复杂但容易忽略细节,关键是选对事件时机、兼顾输入法与粘贴场景。

















