<input type="tel"> 仅提供语义化与移动端数字键盘优化,不校验格式、不阻止非法字符、checkValidity() 恒为 true;业务校验须依赖 pattern、inputmode 或 JavaScript。
HTML 的 <input type="tel"> 不会自动校验电话格式,也不触发原生拨号,它只是语义化提示——浏览器和键盘据此优化体验,但业务校验必须自己写 JS 或后端做。
type="tel" 不能当表单验证用它不阻止用户输入任意字符(比如字母、空格、括号),checkValidity() 方法永远返回 true,提交时也不会报错。iOS 键盘虽会弹出数字+符号布局,但 Android 行为不统一,部分国产键盘甚至完全无视该类型。
form.checkValidity() 返回 true,但后端收到 "123-abc-456"
pattern 属性或监听 input 事件做正则过滤pattern 和 inputmode 怎么配合用才靠谱pattern 能让浏览器在提交时触发原生提示(但仅限支持该特性的浏览器),inputmode 则更底层地影响软键盘行为,两者叠加比单用 type="tel" 更可控。
pattern 示例:<input type="tel" pattern="[0-9]{11}" title="请输入11位手机号"> —— 注意:正则不带 /^...$/,且只对 submit 有效,change 或 blur 不触发inputmode="numeric" 比 type="tel" 在 Android 上更稳定唤起纯数字键盘;inputmode="tel" 支持度较差,慎用pattern 提示样式不友好,文字常被截断;Chrome 会显示 title 内容,但无法自定义样式用户粘贴、长按删除、IME 输入(比如中文输入法下输数字)都会打破简单正则匹配逻辑,纯靠 pattern 或 oninput 替换容易误伤。
立即学习“前端免费学习笔记(深入)”;
input 事件里直接 value = value.replace(/[^0-9]/g, '') —— 光标会跳到末尾,破坏用户体验setSelectionRange 保存并恢复光标位置,或改用 beforeinput(但兼容性差,iOS Safari 不支持)170/171/166/199 等号段已放开,建议用运营商号段库或至少匹配 ^1[3-9]d{9}$,并预留国际号码入口(比如加 +86 前缀)真正上线时,type="tel" 只是起点,不是终点。键盘行为、粘贴逻辑、光标控制、号段更新——这些细节没处理好,用户在真实场景中一试就崩。