【问题标题】:<input type="number"/> is not showing a number keypad on iOS<input type="number"/> 在 iOS 上没有显示数字键盘
【发布时间】:2013-01-05 00:58:35
【问题描述】:

根据Apple's documentation,当我设置一个类型为number 的输入元素时,我应该得到一个数字键盘。

<input type="number"/>

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

看起来该死的几乎不可能搞砸。但是,当我在我的 iPhone 或模拟器(均为 iOS6)上查看这个简单的小提琴时,数字键盘不会出现,而是使用标准的字母键盘。

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

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

【问题讨论】:

  • 作为参考,我的 Android 手机也可以这样做。谢谢你问这个。 +1

标签: ios html


【解决方案1】:

你需要指定模式:

<input type="number" pattern="\d*"/>

由于number 可以为负数或带浮点数,因此键盘中应该可以使用 -., , 除非您指定仅数字模式。

【讨论】:

  • 是的!谢谢你。那么苹果文档似乎并不准确。它说type="number" “指定输入类型 \d* 或 [0-9]* 等同于使用这种类型。” 这似乎并不完全正确。它称之为错误的东西(类型!=模式)并声称当两者都需要具有所描述的效果时它们是多余的......哦苹果:(
  • 我在 React 中使用 JSX 语法并且必须使用两个反斜杠,例如:&lt;input type="number" pattern="\\d*" /&gt;
  • 这确实有效,但看起来不应该在数字字段上支持模式。 developer.mozilla.org/en-US/docs/Web/HTML/Element/input/…
  • 可以确认,W3C验证器给我一个错误;输入类型需要是文本
  • 工作正常,但不显示 decimal( . ) 按钮,知道该怎么做吗?输入金额时,需要小数
【解决方案2】:

从 ios 12.2(2019 年 3 月 25 日发布)开始,此解决方案将起作用,并且实现起来最简单

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

这将只显示数字键盘,而没有使用 input="tel" 附带的 #+* 字符

【讨论】:

  • 虽然它通过了带有“警告”的 W3C 验证,但在 IOS 14.4 上,它不会像 pattern="\d*" 那样显示您在键盘上收到的 SMS 代码。尽管使用 pattern="\d*" 你会得到一个 W3C 验证错误:(
【解决方案3】:

我不确定这是否是您想要的,但输入 type = "tel" 将为您提供“电话号码键盘”。

【讨论】:

  • 这确实适用于手机键盘,但它也允许其他疯狂,如 *#;,。我只想要数字。根据文档,type="number" 应该可以工作...
  • 好吧,你上面的问题是苹果称之为数字键盘的东西......
  • 是我想要的:f.cl.ly/items/0P0s1b3A1S3s170F1g2Q/… 没有电话的东西,只有数字。
  • 这是很棒的小技巧。需要一个邮政编码输入,它只是我需要数据的数字。
【解决方案4】:

根据我的经验,这在浏览器之间非常不一致。 iOS 在为我的用例正确支持这一点之间来回走动。我通常只希望默认显示的键盘是数字键盘。上次我检查时,使用 input type="number" 正确调出数字键盘,但忽略了“size”属性,这严重影响了我的移动格式。我为所有我希望默认使用数字键盘的输入添加了一个属性,当浏览器检测到它可以正常工作时,我使用 jQuery 来更改任何属性(即 type="number")。这样我就不必返回并更新各个输入,并且只允许我在受支持的浏览器中应用它。

如果主要的移动操作系统除了输入类型之外还有一个“默认键盘”属性,那就太好了。如果用户输入地址或邮政编码怎么办?通常那些以数字开头,因此默认显示数字键盘但允许任何文本是有帮助的。

就验证而言,我不能依赖浏览器来支持对特定输入类型的验证,所以我使用 javascript 和服务器端验证。

【讨论】:

    【解决方案5】:

    您好。我知道这个问题很老,但我觉得这是一个非常受欢迎的解决方案,并决定发布一个答案。

    这是我创建的解决方案,用于解决 iPad 键盘问题以及几乎任何东西。

    此外,这种方法不需要您使用 number 类型的输入,在我看来这很丑陋。

    您可能会在下面找到一个工作版本。

    对 Apple 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>

    【讨论】:

      【解决方案6】:

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

      我在这个输入上只使用了&lt;input type="number"&gt;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对象还是标准)

      请注意我没有测试这段代码 sn-p,因为我身边有更复杂的东西,但我希望你能明白

      有了这个解决方案:

      • 在 iOS 上:用户有一个完整的经典键盘,但默认打开数字,不能写错字符。
      • 在 Android 上,数字键盘非常完美。
      • 未来我们可以希望 iOS 能够触发良好的数字键盘,并且永远不会调用 javascript 部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-30
        • 2016-11-10
        • 2019-06-04
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        • 2015-04-20
        • 2021-05-14
        相关资源
        最近更新 更多