inputmode 对 contenteditable 无效,仅对 input、textarea 生效;需用透明 input 劫持焦点并配合 inputmode 控制键盘,真机测试必不可少。

inputmode 对在线编辑器没用,别往 contenteditable 元素上加
它只对可提交的表单控件(input、textarea)生效,而 contenteditable 是富文本容器,浏览器根本不读它的 inputmode 属性。你加了 inputmode="decimal" 或 inputmode="none",iOS Safari 和 Android Chrome 都会直接忽略——这不是 bug,是规范限定。
想让编辑器弹数字键盘?得用“假输入框”劫持焦点
真实做法是:在 contenteditable 区域外,叠加一个透明、不可见但可聚焦的 <input type="text">,并用 inputmode 控制它的键盘;用户点击编辑区时,JS 把焦点移到这个 input 上,再同步光标位置和内容。
- 必须用
type="text",type="number"会触发微调按钮、禁粘贴,且 iOS 上小数点变逗号 - 目标是纯数字输入(如页码、编号)→
inputmode="numeric"+pattern="[0-9]*" - 目标是金额/带小数参数 →
inputmode="decimal"+oninput="this.value = this.value.replace(/[^0-9.]/g, '')" - 别用
inputmode="none":它不阻止输入,只藏键盘——用户点进去后无响应,体验断层
中文输入场景下,inputmode 只影响顶部功能键,不影响拼音本身
比如你在数字输入流程里切到拼音模式输“一二三”,inputmode="numeric" 完全拦不住——它只提示键盘把 0–9 放主区,不锁输入法。真正要过滤,得靠 blur 时正则校验或提交前拦截。
- 用户粘贴 “+86 138****1234” 或 “12.5%” 依然能进,
inputmode从不干预内容 - 中文拼音下
inputmode="email"的 @ 键基本消失,iOS Safari 几乎无视该值 - 如果编辑器支持多语言混输(如中英文编号),
inputmode="text"是唯一合理兜底
真机测试比任何文档都管用,尤其要测 vivo、华为、OPPO
Chrome DevTools 模拟器显示“*# 键已出现”,不代表用户手里的 vivo X100 能看到;iOS Safari 16.4+ 对 inputmode="decimal" 支持有限,部分机型仍 fallback 到全键盘。国产安卓输入法(Jovi、iFlyIME、百度输入法)普遍只认 type="tel" 或 type="number",对 inputmode 视而不见。
- 必测组合:
type="text"+inputmode="numeric"+ 真机长按粘贴 - 别信“兼容性表格”,vivo 和华为的系统键盘行为在不同系统版本间波动极大
- 如果发现某机型始终弹全键盘,立刻降级为
type="tel"(仅限手机号)或放弃inputmode,改用 JS 弹出自定义数字面板
实际最常被忽略的一点:你写的 inputmode 值,从来不是给用户看的,而是给输入法开发者看的“建议”。它不保证任何行为,也不参与任何校验逻辑——哪怕你加了十层 pattern 和 oninput 过滤,只要没在真机上验证过粘贴、切换输入法、横竖屏切换这三件事,就等于没做。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











