input type="tel" 本身不保证唤起纯数字拨号键盘,需配合 inputmode="tel" 和 pattern="[0-9#s+-()]" 才能在 ios 和主流 android 浏览器中稳定唤起带 * # 的拨号键盘。

在 H5 中,input type="tel" 本身**不保证**唤起纯数字拨号键盘(如 iOS 的「电话键盘」或 Android 的「数字键盘」),实际唤起的键盘类型取决于系统、浏览器和输入法。但可以通过组合属性显著提高唤起数字/拨号键盘的概率。
关键:添加 inputmode 和 pattern
现代移动端浏览器(尤其是 iOS Safari 16.4+、Chrome Android)支持 inputmode 属性,它是比 type="tel" 更精准控制键盘类型的声明方式:
-
inputmode="numeric":明确要求数字键盘(带 . 和空格,适合金额、编号等) -
inputmode="decimal":带小数点的数字键盘 -
inputmode="tel":专门用于电话号码,iOS 会优先调用「电话键盘」(含 * # 键),Android 多数浏览器也倾向显示带符号的数字键盘
同时配合 pattern="[0-9*#]*"(或更宽松的 [0-9s+-()*#]*)可进一步提示浏览器这是电话输入场景,增强键盘匹配度。
推荐写法(兼顾兼容性与效果)
以下代码在 iOS 和主流 Android 浏览器中基本都能唤起带 * # 的拨号键盘:
<input type="tel" inputmode="tel" pattern="[0-9*#\s\+\-\(\)]*" placeholder="请输入手机号">
说明:
-
type="tel"保留语义和基础兼容(老版本浏览器 fallback) -
inputmode="tel"是核心——告诉浏览器“这是电话输入”,iOS 直接触发拨号键盘 -
pattern中的字符集允许常见电话符号,避免输入法因校验拦截符号键 - 无需
maxlength或minlength干预键盘类型,但建议按业务限制长度(如手机号 11 位)
注意避坑点
以下做法反而可能干扰键盘唤起:
- 只用
type="number":会唤起纯数字键盘(无 * #),且可能自动过滤非数字字符,不适合电话 - 加
inputmode="numeric"+type="tel":iOS 可能忽略type="tel",降级为普通数字键盘(缺失 * #) - 设置
inputmode="text"或不设:必然唤出全键盘 - 用 JavaScript 强制替换输入内容(如实时删除非数字):可能导致光标跳动、输入体验差,不解决键盘唤起问题
补充:iOS 特别提示
iOS 对 inputmode="tel" 支持较好,但需确保页面在「标准模式」下运行(即有正确 viewport 声明):
<meta name="viewport" content="width=device-width, initial-scale=1.0">
若页面被识别为「App 模式」(如通过 PWA 添加到主屏幕),部分 iOS 版本可能弱化键盘优化,此时 inputmode="tel" 仍有效,但建议保持 viewport 声明完整。











