手机:数字键盘用于文本输入

254
有没有办法在手机上强制显示数字键盘,用于 <input type="text">?我刚意识到 HTML5 中的 <input type="number"> 是用于“浮点数”,因此不适用于信用卡号码、邮政编码等。
我想模拟 <input type="number"> 的数字键盘功能,用于接受除浮点数以外的数字值。也许还有其他适当的 input 类型吗?

仍然没有一个很好的答案适用于邮政编码。我专门为国际邮政编码重新提出了这个问题:https://dev59.com/s18e5IYBdhLWcg3wucb- - Ryan McGeary
我想出了一个巧妙的方法来做这件事...有点像这样:https://dev59.com/s18e5IYBdhLWcg3wucb-#25599024 - davidcondrey
截至2015年中期,有一种更好的方法来完成这个任务:https://dev59.com/XW025IYBdhLWcg3wKSiP#31619311 - Aaron Gray
更早的相关问题:https://dev59.com/1HA75IYBdhLWcg3wT3H8 - Jon Schneider
16个回答

260

截至2015年中期,我认为这是最佳解决方案:

<input type="number" pattern="[0-9]*" inputmode="numeric">

这将为您在Android和iOS上提供数字键盘:

enter image description here

同时,它还为您提供了预期的桌面行为,包括上下箭头按钮和友好的上/下箭头键增量:

enter image description here

在此代码片段中尝试一下:

<form>
  <input type="number" pattern="[0-9]*" inputmode="numeric">
  <button type="submit">Submit</button>
</form>

通过将type="number"pattern="[0-9]*结合使用,我们可以得到一个在任何地方都适用的解决方案。而且,它还能与未来的HTML 5.1提出的inputmode属性兼容。

注意:使用模式将触发浏览器本地表单验证。您可以使用novalidate属性禁用此功能,或者您可以使用title属性自定义验证失败时的错误消息。


如果您需要输入前导零、逗号或字母(例如国际邮政编码),请查看这个略有不同的变体


致谢和更多阅读:

http://www.smashingmagazine.com/2015/05/form-inputs-browser-support-issue/ http://danielfriesen.name/blog/2013/09/19/input-type-number-and-ios-numeric-keypad/


2
HTML5中的type="number"规范指出:“以下内容属性不得指定,也不适用于该元素:...inputmode” - Tgr
2
@Tgr 哦,发现得好。规范似乎希望人们使用<input type="text" inputmode="numeric">,并且它希望移动浏览器查看inputmode以确定它是否显示数字键盘或全键盘。由于没有浏览器支持inputmode,我不确定它将如何在桌面和移动浏览器上实现。例如:桌面浏览器是否允许在<input type="text" inputmode="numeric">中输入字母?如果是这样,那就有问题了。<input type="number">可以防止这种情况,只允许输入数字。也许我们必须等到浏览器开始实现它,然后我们才能更新这个答案。 - Aaron Gray
2
type="number"的支持还算不错,但它可能会显示一个微调器,这对于信用卡号码等并不太合适。 - Tgr
2
有 type="number" 真是让人头疼 X(. 如果输入无效,你将无法在 JS 中获取输入的值,也无法获取光标位置等。 - Nicu Surdu
2
This attribute applies when the value of the type attribute is text, search, tel, url, email, or password, otherwise it is ignored. - Michael Laffargue
显示剩余7条评论

255

您可以使用 <input type="text" pattern="\d*">,这将导致数字键盘出现。

有关更多详细信息,请参见iOS 的文本、Web 和编辑编程指南

<form>
  <input type="text" pattern="\d*">
  <button type="submit">Submit</button>
</form>


23
如果你只需要数字键盘,但不想进行验证(例如在Chrome中),你可以在表单上加上novalidate属性。 <form ... novalidate> - Brian
4
我发现\d*无效,需要使用[0-9]。请注意,这将与 type='numeric' 一起使用。根据链接的文档参考邮政编码,建议使用此方法。 - Brett Ryan
12
只要你只需要数字值,这个方法就有效。由于键盘不包含'.'(或某些区域的',')这些字符,因此无法输入需要'.'的浮点数。 - DrHall
3
如果我需要使用“.”(点),我该如何使用它?这个模式仅显示[0-9]。 - user3152748
25
“<input type="text" pattern="\d*">在安卓上无法使用?我在iOS上测试成功了,但在安卓上却不行。该怎么解决呢?” - kamal
显示剩余4条评论

69

我发现,至少对于类似“密码”的字段,使用<input type="tel" />这样的方法会生成最真实的数字字段,而且它还具有无自动格式化的优点。比如,在我最近为希尔顿开发的一个移动应用中,我最终选择了这种方式:

iPhone Web Application Display with an Input Tag Having a Type of TEL which Produces a very Decent Numeric Keyboard as Opposed to Type Number which is Autoformatted and Has a Somewhat Less Intuitive Input Configuration

......我的客户印象非常好。

<form>
  <input type="tel" />
  <button type="submit">Submit</button>
</form>


4
对我来说问题不在于自动格式化,而是验证。在许多浏览器中,number 类型的输入会强制使用严格的数字规则。如果用户添加空格(或逗号)以分隔千位数,您将无法从输入中获取任何值。是的,在 JavaScript 中,input.value 也将为空。tel 类型的输入不限于特定的格式,因此用户仍可以输入任何内容,并且验证是一个单独的过程(由开发人员处理)。 - Nux
1
我该如何在这个键盘中使用十进制数? - Anto
这对我来说将是完美的解决方案,因为我只是想确保在移动设备上显示数字键盘(并且我有自己的自定义输入验证),但我担心使用type="tel"会产生意想不到的影响。在不存储电话号码数据的输入框上使用type="tel"是否会有任何潜在问题?(它将主要是数字数据,但可能包含其他字符) - undefined

30
<input type="text" inputmode="numeric">

使用Inputmode,您可以向浏览器提供提示。


文档:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Global_attributes/inputmode - blackgreen
1
这应该是现代公认的答案。 - undefined

15

在某些手机上,如iPhone上使用type="email"type="url"会给你提供一个特定的键盘。而对于电话号码,可以使用type="tel"


13

11

使用 <input type="text" pattern="\d*"> 来唤起数字键盘存在风险。在Firefox和Chrome浏览器中,pattern属性中所包含的正则表达式会导致浏览器对输入内容进行验证。如果输入内容不符合该模式或为空,则会出现错误。请注意其他浏览器中可能会发生意外的行为。


6
在包含的“表单元素”上添加“novalidate”属性可以解决自动验证问题。请确保自己进行一些验证。 - Justus Romijn

4

我认为最好的解决方案是:

对于整数,可在 Android 和 iPhone 上唤出 0 到 9 的数字键盘

<label for="ting">
<input id="ting" name="ting" type="number" pattern="[\d]*" />

您可能还想这样做,以隐藏Firefox/Chrome/Safari中的旋转器,大多数客户认为它们看起来很丑。
 input[type=number]::-webkit-inner-spin-button,
 input[type=number]::-webkit-outer-spin-button {
      -webkit-appearance: none;
      margin: 0;
 }

 input[type=number] {
      -moz-appearance:textfield;
 }

如果您正在进行自定义验证,请在表单元素中添加novalidate='novalidate'。

提示:如果您确实需要浮点数,请按照所需精度进行调整,Android将添加“。”。

<label for="ting">
<input id="ting" name="ting" type="number" pattern="[\d\.]*" step="0.01" />

3

我认为在语义化网页中,type="number" 是最好的选择。如果你只想改变键盘类型,可以使用 type="number" 或者 type="tel"。在这两种情况下,iPhone 不会限制用户输入。用户仍然可以输入(或粘贴)任何字符。唯一的变化是显示给用户的键盘。如果你需要更多的限制,就需要使用 JavaScript。


9
我的问题是,type="number" 只能用于浮点数,所以不能用于信用卡、邮政编码或其他仅限数字的字符串。我希望有一种语义化的编码方式,并能显示正确的键盘。我认为适当的类型应该是 input type="text",但这样会显示错误的键盘。如果您可以指向一些 JavaScript 代码,那么这两个问题都可以解决。 - Tami
2
type="number" 是用于浮点数的。type="text" 是用于字符串的。你真正想要的是整数。我认为浮点数比字符串更接近整数。你觉得呢? - Cat Chen
6
type="number" 的一个需要注意的地方是,至少在 Chrome 中,它会强制输入为数字 - 这会导致输入带有空格的信用卡号码出现问题(例如)。 - John Carter
8
这个功能还可以将类似于“01920”的邮政编码转换为“1920”。 - ceejayoz
如果用户在浏览器中设置了不同的语言,它也会出现问题。https://dev59.com/_G435IYBdhLWcg3wjw3S - dalore

3

有一种简单的方法可以实现这种行为(例如,如果我们想在输入字段中使用文本格式,但仍然希望显示数字键盘):

查看此屏幕截图

我的输入:

<input inputMode="numeric" onChange={handleInputChange} />

提示:如果你想要这种行为(逗号分隔数字),那么请按照 handleInputChange 的实现方式进行操作(这是基于 React 的,所以也提到了状态)

在此处查看 React 代码


3
请勿将代码以图像形式发布。请在帖子中复制并粘贴代码本身。 - kiner_shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接