iPhone / iOS:为邮政编码呈现 HTML 5 键盘

Posted

技术标签:

【中文标题】iPhone / iOS:为邮政编码呈现 HTML 5 键盘【英文标题】:iPhone / iOS : Presenting HTML 5 Keyboard for Postal Codes 【发布时间】:2014-10-15 00:27:11 【问题描述】:

有几种技巧可以在移动设备上为 html 5 输入显示不同的键盘(即<input> 标签)。

例如,有些记录在 Apple 的网站上,Configuring the Keyboard for Web Views。

这些对于可用性来说非常有用,但是在输入国际邮政编码(主要是数字,但允许使用字母)时,我们留下了一些糟糕的选择。大多数人建议使用pattern="\d*" 技巧来显示数字键盘,但这不允许输入字母。

type="number" 输入类型显示常规键盘,但转换为数字布局:

这适用于 ios 设备,但它会让 Chrome 认为输入必须是数字,甚至会更改输入的行为(向上/向下递增和递减值)。

有什么方法可以让 iOS 默认为数字布局,但仍允许字母数字输入?

基本上,我想要 type="number" 的 iOS 行为,但我希望该字段的行为类似于桌面浏览器上的常规文本字段。这可能吗?

更新:

嗅探 iOS 的用户代理并使用 type="number" 输入类型不是一个选项。 type="number" 不适用于字符串值(如邮政编码),它还有其他副作用(如去除前导零、逗号分隔符等),使其不太适合邮政编码。

【问题讨论】:

我没有这个问题的答案,但我想知道 iOS 8 自定义键盘的新功能是否可以提供帮助。邮政编码优化的自定义键盘在这里会很有帮助。问题可能是如何从 WebView 抬起键盘。 我想我终于找到了满足您所有要求的解决方案。从去年开始,我已经将我的答案更新为,我认为,更好的东西。 ***.com/a/31619707/806956 @AaronGray 谢谢。已经接近了,但因为似乎在 iPhone 上禁用了字母字符,所以这仍然是一个未完成的问题。 啊,我明白了。 :-) 【参考方案1】:

这行得通吗?

HTML:

<input type="tel" pattern="[0-9]*" novalidate>

这应该会在 android/iOS 手机浏览器上为您提供漂亮的数字键盘,在桌面浏览器上禁用浏览器表单验证,不显示任何箭头微调器,允许前导零,并允许在桌面浏览器和 iPad 上使用逗号和字母.

Android / iOS 手机:

桌面:

iPad:

【讨论】:

这似乎是最好的选择,但是这仍然不完全符合美国标准,因为键盘不提供 Zip+4 系统所需的破折号字符。也就是说,不需要或大量使用 Zip+4...en.wikipedia.org/wiki/ZIP_Code 我真的很喜欢它作为一个合理的通用解决方案,并自己使用它。一个警告是 novalidate 正式只是
s 而不是 字段的受支持属性。有些浏览器确实在输入级别支持它们——我没有全面检查。最简单的替代方法是“不验证”整个表单——当然这可能会产生不受欢迎的副作用。
【参考方案2】:

通过 Google 快速搜索发现 this *** question。

HTML

<input type="text">

javascript

$('input[type="text"]').on('touchstart', function() 
   $(this).attr('type', 'number');
);

$('input[type="text"]').on('keydown blur', function() 
   $(this).attr('type', 'text');
);

在验证表单之前切换输入类型,显示正确的键盘而不会弄乱值。如果您只希望它在 iOS 上运行,您可能必须使用用户代理。

*** on detecting iOS

【讨论】:

这绝对令人作呕,但也是我能找到的解决这个问题的最佳方法。我需要洗个澡。 这行得通,但它也会在您每次单击该框时清除表单。经过一些修改,这可能是最好的答案。【参考方案3】:

浏览器目前没有正确的方法来表示邮政编码和信用卡号等数字代码。最好的解决方案是使用type='tel',它会为您提供一个数字键盘,并能够在桌面上添加任何字符。

键入 textpattern='\d*' 会给你一个数字键盘,但仅限于 iOS。

有一个 HTML5.1 提议的一个名为 inputmode 的属性,它允许您指定键盘而不考虑类型。但是目前没有任何浏览器支持。

我还建议您查看 Webshim polyfill 库,其中包含用于这些类型输入的 polyfill method。

【讨论】:

pattern='/d' 对我不起作用,但 pattern='[0-9]*' 起作用。无论如何感谢您的提示 应该是pattern="\d*" 谈到输入模式..我可以将 type="text" 和 inputmode="numeric" 放在信用卡号的相同输入字段中,如下所示: 还是不符合语义甚至可能导致问题?【参考方案4】:

iOS 11 中对此问题的更新。您只需将模式属性 (pattern="[0-9]*") 添加到具有数字类型的任何输入中即可获取数字键盘。

以下按预期工作。

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

这也有效。

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

@davidelrizzo 发布了部分答案,但来自 @Miguel Guardo 和 @turibe 的 cmets 提供了更全面的图片,但很容易错过。

【讨论】:

数字下面有字母吗? @Martian2049 是的。这是一个完整的 DTMF 键盘。【参考方案5】:

这将使 ios 键盘的数字侧默认显示,并保持切换到字母侧的能力。当 html 输入类型发生变化时,设备会更改键盘以匹配适当的类型。

(function ($) 
    var control = $('#test2');
    var field = $('#test1');

    control.bind('click', function () 
        if (control.is(':checked')) 
            field.attr('type', 'text');
         else 
            field.attr('type', 'number');
        
    )
(jQuery));

<input type="number" id="test1" value="123" />
<input id="test2" type="checkbox" />Change


替代演示:http://jsfiddle.net/davidcondrey/dbg1L0c0/3/embedded/result/

如果你想要大数字格式键盘(电话风格),你可以相应地调整代码,它仍然有效:

(function ($) 
    var control = $('#test2');
    var field = $('#test1');

    control.bind('click', function () 
        if (control.is(':checked')) 
            field.attr('type', 'text');
         else 
            field.attr('type', 'tel');
        
    )
(jQuery));

<input type="tel" id="test1" value="a" />
<input id="test2" type="checkbox" />Change

【讨论】:

【参考方案6】:

试试这个:

<input type="text" name="postalcode" class="js-postal">
<script src="https://code.jquery.com/jquery-2.1.1.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() 
  if('ontouchstart' in window)  // ensure we are in touch device.

    $('input.js-postal').on('focus', function() 
      var $this = $(this);

      // memorize current value because...
      var val = $this.val(); 
      // this may cause reset value.
      $this.attr('type', 'number'); 

      setTimeout(function() 
        // Asynchronously restore 'type' and value
        $this.attr('type', 'text');
        $this.val(val);
      , 0);
    );
  
);
</script>

我知道这是非常老套的方式,但这显然有效。 不过,我还没有在 Android 设备上进行过测试。

请注意,这在$this.attr('type', 'number') 时可能会导致一些明显的故障,因为这会在input 包含非数字字符时重置值。

基本想法是从this answer 偷来的:)

【讨论】:

【参考方案7】:

为什么不检查 HTTP 请求的标头(用户代理),并将数字布局提供给 iOS 设备,同时将字母数字布局提供给其余设备?

【讨论】:

嗅探 iOS 的用户代理并使用 type="number" 输入类型不是一个好的选择。 type="number" 不适用于字符串值(如邮政编码),它还有其他副作用(如去除前导零、逗号分隔符等),使其不太适合邮政编码。更不用说,嗅探用户代理会使实现变得脆弱。

以上是关于iPhone / iOS:为邮政编码呈现 HTML 5 键盘的主要内容,如果未能解决你的问题,请参考以下文章

为啥 iphone Simulator 不能正确呈现 HTML5 页面?

iOS开发中控制器切换方式Modal

iframe 内容未在 iOs5 iPad/iPhone 的滚动下呈现

iPhone,iOS 8:如何呈现比原始视图控制器更小的 ViewController?

iOS 11 iPhone X 模拟器 TabBar 图标和标题呈现在顶部相互覆盖

IOS-OC 编码建议