autocapitalize="none" 是验证码输入框的必配项,必须与 type="text" 和 inputmode="numeric" 配合使用,以防止首字母大写干扰;仅设 inputmode 或 pattern 无效,type="number" 会忽略该属性,且需配合 JS 过滤粘贴等非键盘输入。

autocapitalize="none" 是验证码输入框的必配项
动态生成验证码输入框时,autocapitalize="none" 不是可选项,而是防止用户误输大写字母的第一道防线。iOS Safari 默认对 type="text" 启用句首大写(即 sentences 行为),若不显式关闭,用户在输入 “1234” 前可能先敲出 “A”,导致首位错位或校验失败。
常见错误是只设 inputmode="numeric" 或 pattern="[0-9]*",但这些不影响键盘首字母逻辑——数字键盘虽无大小写键,但部分 Android 输入法(如三星键盘)仍会在切换回英文模式时恢复大写状态,而 autocapitalize="none" 能强制压制该行为。
-
autocapitalize="off"也有效,但none是更明确、W3C 文档推荐的写法 - 必须写在每个
<input>元素上,不能写在父容器或 JS 模板字符串外层 - 若用 Vue/React 动态绑定,确保传入的是字符串
"none",而非布尔值或 undefined
type="text" + inputmode="numeric" 才真正兼容 autocapitalize
type="number" 或 type="tel" 会直接忽略 autocapitalize,这是 iOS 和 Android WebView 的硬性限制。验证码虽为数字,但必须用 type="text" 保属性生效,再靠 inputmode="numeric" 唤起数字键盘——二者缺一不可。
实测中,type="number" 在 iOS 上不仅禁用 autocapitalize,还会导致粘贴多位数字后光标跳到末尾、退格异常等问题;而 type="text" 配合 inputmode="numeric" 既保留属性控制力,又兼顾软键盘体验。
立即学习“前端免费学习笔记(深入)”;
- 别加
autocorrect="off":它会连带禁用autocapitalize(尤其在旧版 WebKit 中) - 避免
spellcheck="false":虽不影响autocapitalize,但可能干扰某些输入法的数字联想 - 若需限制输入内容,用
pattern="[0-9]{1}"+ JS 监听input事件做过滤,而非依赖 type 属性
JS 动态插入时容易漏掉属性继承链
用 document.createElement('input') 或模板字符串生成验证码输入框时,autocapitalize 极易被遗漏——它不像 class 或 id 那样有默认继承机制,且浏览器不会报错或警告。
典型翻车场景:封装一个 createCodeInput() 函数,但只设置了 el.setAttribute('type', 'text'),忘了 el.setAttribute('autocapitalize', 'none');或者用 innerHTML 插入,却因转义问题把属性名写成 autoCapitalize(大小写错误)或带空格(如 autocapitalize = "none")。
- 推荐统一用
Object.assign(el, { type: 'text', autocapitalize: 'none', inputmode: 'numeric' }) - 若用字符串拼接,检查最终 HTML 是否渲染出
autocapitalize="none"(Safari 开发者工具 Elements 面板可确认) - 真机调试时,观察键盘左下角 Shift 键是否灰显:灰显 = 生效;可点击 = 被覆盖或未设置
它不解决粘贴和 IME 输入,得靠 JS 补一手
autocapitalize 只影响键盘按键触发的首字母状态,对粘贴(paste)、拖拽、语音输入、中文拼音输入法(IME)完全无效。用户仍可粘贴 “abcd” 或用拼音输入法打出 “shiyong” 后选词,绕过所有键盘提示。
所以动态生成验证码框后,必须同步加 JS 控制:
- 监听
input事件(不是change),用e.target.value = e.target.value.replace(/[^0-9]/g, '')过滤非数字 - 若需保持光标位置,记得在修改 value 后调用
setSelectionRange() - 别用
text-transform: uppercase:它只是视觉伪装,提交时仍是小写,验证码比对必然失败
最常被忽略的是:autocapitalize 对中文用户基本无感——拼音键盘不响应它,而国内验证码场景恰恰以中文用户为主。这时候,JS 过滤和后端校验才是真正的兜底。



















