在iOS上,<input type="number"/> 没有显示数字键盘

97
根据苹果公司的文档,当我设置一个类型为number的输入元素时,应该会出现数字键盘。
<input type="number"/>

number: 一个用于指定数字的文本字段。在iOS 3.1及更高版本中会弹出数字键盘。

看起来几乎不可能出错。然而,当我在我的iPhone或模拟器上查看这个简单的代码片段(两者都是iOS6),数字键盘没有出现,而是出现了标准的字母键盘。

http://jsfiddle.net/Cy4aC/3/

我到底在这里搞砸了什么?

enter image description here


作为参考,我的基于Android的手机也可以做到这一点。谢谢你问这个问题。+1 - Niet the Dark Absol
6个回答

175

您需要指定模式:

<input type="number" pattern="\d*"/>
作为一个数字可以是负数或带有小数点的类型,因此键盘上应该有 -.,,除非你指定只接受数字的模式。

图片描述


1
是的!谢谢。苹果文档似乎不准确。它关于 type="number" 的说明是 "指定输入类型为 \d* 或 [0-9]* 等同于使用此类型。" 但这似乎完全不正确。它称其为错误的东西(type != pattern),并声称两者都是多余的,而实际上需要两者才能产生所描述的效果... 哦,苹果 :( - Alex Wayne
8
我正在使用 React 的 JSX 语法,需要使用两个反斜杠,例如:<input type="number" pattern="\\d*" /> - styfle
2
这确实可以工作,但似乎模式不应该支持数字字段。https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number#Pattern_validation - Antfish
1
@evolutionxbox 谢谢,但我尝试了他们的建议:“..在iOS设备上,使用值为[0-9]*的模式属性将带出数字键盘。这仅适用于此确切模式 - 您不能允许任何额外字符。<label for="creditcard">信用卡号码:</label> <input pattern="[0-9]*" type="text" name="creditcard"> ”.. 在iPad mini(IOS 12)上,这不起作用。键盘会弹出数字,但您可以立即切换到字母,并且该字段会接受它们。 - Daniel Schmidt
6
功能正常,但不显示小数点按钮,有什么建议?在输入金额时,需要使用小数点。 - OmChoudhary
显示剩余7条评论

21

从ios 12.2版本开始(发布于2019年3月25日),这个解决方案可以使用,并且它是最简单的实现方法。

<input type="number" inputmode="decimal"/>

使用 input="tel" 时,这将仅呈现数字键盘,不含 #+* 字符。


虽然它通过W3C验证时会出现“警告”,但在IOS 14.4上,它不会像pattern =“\ d *”那样在键盘上显示您收到的短信代码。尽管使用pattern =“\ d *”会导致W3C验证错误:( - Roberto Ibarra Rabadán

5

我不确定这是否是你想要的,但输入类型为 "tel" 将给你带来 "电话号码键盘"。


这对于手机键盘确实有效,但它也允许其他疯狂的字符,如 *#;,。我只想要数字。而根据文档,type="number" 应该可以工作... - Alex Wayne
1
好的,你在问题中提到的就是苹果所谓的数字键盘... - pIkEL
这就是我想要的:http://f.cl.ly/items/0P0s1b3A1S3s170F1g2Q/Screen%20Shot%202013-01-21%20at%201.55.31%20PM.png 没有手机之类的东西,只有数字。 - Alex Wayne
这是一个很棒的小技巧。我需要一个只包含数字的邮政编码输入,以便从中获取数据。 - SerKnight

3
根据我的经验,不同浏览器之间的表现非常不一致。iOS 在支持我的用例时反复无常。通常我只想要默认显示数字键盘。上次我检查时,使用 input type="number" 可以正确地弹出数字键盘,但 "size" 属性被忽略了,这会严重影响我的移动端格式。我给所有输入框添加了一个属性,以便默认使用数字键盘,并且在浏览器检测到支持的情况下,使用 jQuery 更改任何属性(例如 type="number")。这样我就不必回头更新各个输入框,而且只能在受支持的浏览器中应用它。
如果主要移动操作系统有一个“默认键盘”属性,那将是很好的。比如用户正在输入地址或邮编?通常这些都以数字开头,所以默认显示数字键盘,但允许任何文本输入,这是有帮助的。
至于验证,我不能依赖浏览器来支持特定输入类型的验证,所以我使用 JavaScript 和服务器端验证。

1

问候。我知道这个问题很旧,但我觉得这是一个非常受欢迎的解决方案,决定发表一篇答案。

以下是我创建的一个解决方案,用于处理iPad键盘以及几乎任何内容。

此外,这种方法不需要使用数字类型的输入,在我看来非常丑陋。

下面是一个可工作的版本。

关于苹果iPad键盘按键的想法...

我必须创建一个keyPress事件处理程序,以捕获和抑制iPad上似乎无法由keyDown事件处理或模棱两可的按键???!

// Bind keydown event to all input type=text in form.
$("form input[type=text]").keydown(function (e) {

// Reference to keyCodes...
var key = e.which || e.keyCode;
// Reference to shiftKey...
var shift_key = e.shiftKey;
// Reference to ctrlKey...
var ctrl_key = e.ctrlKey;
// Reference to altKey...
var alt_key = e.altKey;


// When user presses the shiftKey...
if(e.shiftKey) {

//...supress its click and whatever key follows after it.
console.log(e.shiftKey + ' and ' + key + ' supressed.');

// Deny
return false;

// ONLY Allow Numbers, Numberpad, Backspace & Tab
} else if ( (key >= 48 && key <=57) || (key >= 96 && key <=105) || (key >= 8 && key <=9) ) {

// Allow
return true;

} else {

// Deny every other key and/or shift + key combination NOT explicitly declared.
return false;
}

});


// KeyPresss to handle remaining iPAD keyboard keys!
// These keys don't seem to be handled by the keyDown event or are ambiguous???!
// Bind keypress event to all input type=text in form.
$("form input[type=text]").keypress(function (e) {

// Reference to keyCodes...
var key = e.which || e.keyCode;
// Reference to shiftKey...
var shift_key = e.shiftKey;
// Reference to ctrlKey...
var ctrl_key = e.ctrlKey;
// Reference to altKey...
var alt_key = e.altKey;

switch (key) {

// Character -> ^
case 94:
return false;

// Character -> #
case 35:
return false;

// Character -> $
case 36:
return false;

// Character -> @
case 64:
return false;

// Character -> &
case 38:
return false;

// Character -> *
case 42:
return false;

// Character -> (
case 40:
return false;

// Character -> )
case 41:
return false;

// Character -> %
case 37:
return false;

// Character -> !
case 33:
return false;

}


});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form action="">

<label for="text1">Numbers, Numberpad, Backspace & Tab ONLY:</label>
<input id="text1" type="text" placeholder="0" min="0" input pattern="[0-9]*" inputmode="numeric" value="" maxlength="4">

</form>


0

在阅读和尝试了很多想法之后,我发现没有一种方法可以准确地显示只有数字键盘和逗号或点。

最终,我只使用了<input type="number">和一个onkeyup处理程序,在这个输入框中我做了类似于这样的事情:

var previousValue = localStorage.getItem('myInputId');
if (input.getAttribute('type') === "number" && input.validity && input.validity.badInput) {
    input.value = previousValue || "";
}
localStorage.setItem('myInputId', input.value);

这可以防止用户输入错误字符,如果存在有效性错误,则通过将值替换为先前的值来实现(我不知道这是iOS对象还是标准)

请注意,我没有测试过此代码片段,因为我在我的一侧有更复杂的东西,但我希望您能理解这个想法

使用此解决方案:

  • 在iOS上:用户拥有完整的经典键盘,但默认情况下打开数字键盘,无法输入错误字符。
  • 在Android上,数字键盘完美。
  • 未来我们可以希望iOS会触发适合数字的好键盘,并且永远不会调用javascript部分。

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