电话:用于文字输入的数字键盘


177

有没有一种方法可以强制数字键盘在电话上显示<input type="text">?我刚刚意识到<input type="number">HTML5中是用于“浮点数”的,因此它不适用于信用卡号,邮政编码等。

我想模拟的数字键盘功能<input type="number">,以接受采用浮点数以外的数字值的输入。也许有另一种合适的input类型吗?


邮政编码仍然没有很好的答案。我在这里再次要求专门为国际邮政代码这个问题:stackoverflow.com/questions/25425181/...
瑞安McGeary

我想出了一种黑手党的方法来做这个..sort of:stackoverflow.com/a/25599024/1922144
davidcondrey 2014年

截至2015年中,有一种更好的方法:stackoverflow.com/a/31619311/806956
Aaron Gray

Answers:


206

你可以的<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

11
只要您只需要数字值,此方法就起作用。需要'。'的浮点数 (对于某些区域,则为“,”),因为它们的键盘不包含这些字符,因此无法输入。
DrHall 2014年

2
如果我需要使用。(点),我该如何使用?此模式仅显示[0-9]

15
<input type =“ text” pattern =“ \ d *”>在android上不起作用?我在ios上测试并成功工作,但在android上却没有工作。我该如何解决
kamal 2015年

157

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

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

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

在此处输入图片说明

它还可以通过向上/向下箭头按钮和键盘友好的向上/向下箭头键递增来提供预期的桌面行为:

在此处输入图片说明

在以下代码段中尝试一下:

<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-数字键盘/


1
HTML5 type="number" 规范指出,不得指定以下内容属性,并且这些内容属性不适用于该元素:... inputmode
Tgr

2
@Tgr Ahh,好收获。该规范似乎希望人们使用<input type="text" inputmode="numeric">,并且希望移动浏览器查看inputmode以确定它显示的是小键盘还是完整的键盘。由于没有浏览器支持inputmode,因此我不确定如何在桌面浏览器和移动浏览器上实现它。例如:桌面浏览器会允许输入字母<input type="text" inputmode="numeric">吗?如果是这样,那就是一个问题。<input type="number">防止这种情况,只允许数字。也许我们必须等到浏览器开始执行它,然后我们才能更新此答案。
亚伦·格雷

2
支持type="number"不错的,但是它可能会显示一个微调框,对于信用卡号等意义不大。
Tgr

2
,具有类型=“数字”在屁股X(一个痛苦,如果输入的是无效的,你将无法获得在JS的输入值,你不能得到光标的位置,等等
Nicu的苏尔都语

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 '17

61

我发现,至少对于类似“密码”的字段,这样做 <input type="tel" />最终会生成最真实的面向数字的字段,并且还具有不进行自动格式化的好处。例如,在我最近为希尔顿开发的移动应用程序中,我最终完成了以下工作:

具有输入标签的iPhone Web应用程序显示器,其电话类型为TEL,与类型编号相对应会产生非常体面的数字键盘,该类型编号是自动格式化的,并且输入配置不太直观

...我的客户印象深刻。

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


4
我的问题不是自动格式化,而是验证。输入类型会number在许多浏览器中强制使用严格的数字规则。如果用户添加空格(或逗号)以分隔成千上万,则不会从输入中获得任何值。是的,即使在JavaScript中input.value也将为空。类型的输入tel不限于特定格式,因此用户仍然可以输入任何内容,并且验证是一个单独的过程(供开发人员处理)。
Nux

我如何在此键盘中使用小数
Anto 2015年

11

使用type="email"type="url"将至少为您在某些手机(例如iPhone)上提供键盘。对于电话号码,您可以使用type="tel"


9

使用调<input type="text" pattern="\d*">出数字键盘存在危险。在firefox和chrome上,模式中包含的正则表达式使浏览器验证对该表达式的输入。如果它与模式不匹配或留为空白,则会发生错误。请注意其他浏览器中的意外操作。


6
novalidate在容器中添加属性form element应处理自动验证问题。确保自己进行一些验证。
Justus Romijn 2014年


4

我认为type="number"最适合语义网页。如果只想更改键盘,可以使用type="number"type="tel"。在这两种情况下,iPhone均不限制用户输入。用户仍然可以输入(或粘贴)他/她想要的任何字符。唯一的变化是显示给用户的键盘。如果您不希望有其他限制,则需要使用JavaScript。


8
我的问题是type =“ number”仅应用于浮点数-因此没有信用卡,邮政编码或许多其他数字(仅字符串)。我希望既有一种语义编码方式,又能使键盘显示正确。我认为适当的类型应该是输入type =“ text”,但随后会显示错误的键盘。如果您可以指示我使用一些JavaScript来做到这一点,则可以解决这两个问题。
塔米

2
type="number"用于浮动。type="text"用于字符串。您真正想要的是整数。我认为float比string更接近整数。你怎么看?
Cat Chen

6
要提防类型为“ number”的一件事是Chrome至少会强制输入为数字-这会破坏用空格输入的信用卡号(例如)
John Carter

8
@therefromhere它还将邮政编码转换019201920
ceejayoz

它也将陷入困境,如果用户在他们的浏览器不同的语言组stackoverflow.com/questions/5345095/...
dalore

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'(如果您执行自定义验证)

ps,以防万一您实际上想要浮点数,如果您想达到的精度,将加“。”。到安卓

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


0

您可以这样尝试:

<input type="number" name="input">
<input type="submit" value="Next" formnovalidate="formnovalidate">

但请注意:如果您输入的内容中包含数字以外的内容,则不会将其传输到服务器。


0

我找不到在所有情况下都对我最有效的类型:我需要默认为数字输入(例如,输入“ 7.5”),但在某些时候还允许文本(例如,“ pass”)。用户希望使用数字小键盘(例如,输入7.5),但偶尔需要输入文本(例如,“通过”)。

相反,我所做的是在表单中添加了一个复选框,并允许用户在type =“ number”和type =“ text”之间切换我的输入(id =“ inputSresult”)。

<input type="number" id="result"... >
<label><input id="cbAllowTextResults" type="checkbox" ...>Allow entry of text results.</label>

然后,我将一个点击处理程序连接到该复选框,该复选框根据是否选中上述复选框在文本和数字之间切换类型:

$(document).ready(function () {
    var cb = document.getElementById('cbAllowTextResults');
    cb.onclick = function (event) {
        if ($("#cbAllowTextResults").is(":checked"))
            $("#result").attr("type", "text");
        else
            $("#result").attr("type", "number");

    }
});

这对我们来说很好。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.