【问题标题】:Force iOS numeric keyboard with custom / currency pattern使用自定义/货币模式强制 iOS 数字键盘
【发布时间】:2013-11-10 04:19:28
【问题描述】:

是否有可能强制 iOS 设备显示数字键盘同时使用自定义模式作为输入类型

我的输入模式:

<input id="price" class="numeric" pattern="\d+((\.|,)\d{1,2})?" name="price" 
title="" data-mini="true" data-clear-btn="true" autocomplete="off" autofocus />

我想输入一个像“14.99”这样的货币值,然后在 iOS 设备上显示一个可以访问数字的键盘

<input type='number' />
<input pattern='[0-9]*' />
<input pattern='[\d]*' />

都缺少小数点符号和/或在添加小数点符号时未验证为数字。另一种方法可能是在正确位置创建小数点符号的 javascript 函数,例如按此顺序按 1->2->9->9 在 keypress() 0.01->0.12->1.29->12.99 上创建, 但这要求输入字段为type='text' --> 这里明显的问题是,当聚焦输入字段时会显示文本键盘。

我该如何解决这个问题?

编辑

环境:

  • JQM 1.3.2
  • jQuery 1.8.2

【问题讨论】:

    标签: javascript ios jquery-mobile keyboard


    【解决方案1】:

    无法对https://stackoverflow.com/a/19998430/6437391 发表评论,因此作为单独的答案发布...

    这与https://stackoverflow.com/a/19998430/6437391 的想法相同,但不是切换类型,而是切换模式。

    当值与数字格式不匹配时,这具有不清除焦点文本字段上的值的效果,例如,如果值具有分隔符 (1,234.56)。

    $('input[type="text"]').on('touchstart', function() {
      $(this).attr('pattern', '[0-9]*');
    });
    
    $('input[type="text"]').on('focus', function() {
      $(this).attr('pattern', actualpattern);
    });
    

    【讨论】:

      【解决方案2】:

      目前,JavaScript 是唯一的解决方案。这是最简单的方法(使用 jQuery):

      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');
      });
      

      这个想法很简单。输入以 type="text" 开始并以 type="text" 结束,但在 touchstart 事件中它会短暂变为 type="number"。这会导致出现正确的 iOS 键盘。一旦用户开始输入任何输入或离开该字段,输入再次变为 type="text",从而绕过验证。

      这种方法有一个缺点。当用户返回到已填写的输入时,输入将丢失(如果未验证)。这意味着用户将无法返回并编辑以前的字段。在我的情况下,这并不是那么糟糕,因为用户可能希望以不同的值反复使用计算器,因此自动删除输入将为他们节省几个步骤。但是,这可能并不适用于所有情况。

      Mobile Safari 似乎支持电子邮件、号码、搜索、电话和 url 的新 HTML5 输入类型属性。这些将切换显示的键盘。查看类型属性。

      例如,您可以这样做:

      <input type="number" />
      

      当输入框有焦点时,会显示数字键盘(就像用户使用全键盘并点击“123”按钮一样。

      如果你真的只想要数字,你可以指定:

      <input type="tel" />
      

      然后用户会得到电话号码拨号键盘。

      我知道这适用于 Mobile Safari——我只假设它适用于 UIWebView。

      http://conecode.com/news/2011/12/mobile-safari-uiwebview-input-types/

      【讨论】:

      • 我认为这个解决方案是解决这个特定问题的最简单方法。谢谢!
      • 我想你的意思是把第二个事件监听器放在输入的[type="number"]
      • 要非常非常小心: 1. iPhone 和 iPad 的行为可能不同(例如 type=text pattern="[0-9]*" 在 iPad 上效果很好,但在 iPhone 上只显示数字键盘) 2.我认为您的解决方案在 iOS8 和 3 中已损坏。有时屏幕上的输入显示您输入了某些内容,但 input.value 返回空白。 4. 我尝试使用超时,但即使超时时间为 0 毫秒,用户也可以在超时触发之前快速输入内容(在速度较慢的 iPhone 4 上)。
      • 这似乎在 iphone 上可以使用,但在 android 手机上却无法使用。第一次敲击数字时,键盘会消失,并且不会输入数字。知道如何解决这个问题吗?
      • 此解决方案在 Android 中存在问题,每个 keydown 事件似乎都会将键盘放下。如果我找到解决方案会在这里发布
      【解决方案3】:

      我认为您可以使用我向Ranjan 建议的相同方法。

      使用像缓冲区这样的文本字段。首先,您需要检测键盘何时出现并检查第一响应者是否是 webview。然后你成为一个 textview 作为第一响应者。

      当您在 webview 的输入中设置文本时,您可以添加一些逻辑来验证数字。

      Here 是我的示例项目与解决方案的链接,在您的情况下,您不需要更改 inputView。但是方法是一样的,在中间使用一个人。

      【讨论】:

      • 这个问题是关于网站,而不是 iOS 应用程序。
      • ¯_(ツ)_/¯ 从那以后桥下流了很多水,我不记得为什么回答了。
      【解决方案4】:

      我做了这个小 sn-p 来实现你想要的,我已经在 iPhone 5 v7.0.3 上测试了它

      我使用e.which 读取输入的CharCode,然后将其推入一个数组(before),该数组表示小数点前的数字和另一个数组(after)将 (before) 数组中的值移动到小数点之后。

      由于我的编程技能,它可能看起来很复杂。

      1) Code demo - 2) Currency conversion demo

      HTML:

      <input type="tel" id="number" />
      

      JS

      变量和函数:

      // declare variables
      var i = 0,
          before = [],
          after = [],
          value = [],
          number = '';
      
      // reset all values
      function resetVal() {
          i = 0;
          before = [];
          after = [];
          value = [];
          number = '';
          $("#number").val("");
          $(".amount").html("");
      }
      
      // add thousand separater
      function addComma(num) {
        return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
      }
      

      主要代码:

      // listen to keyup event
      $("#number").on("keyup", function (e, v) {
      
          // accept numbers only (0-9)
          if ((e.which >= 48) && (e.which <= 57)) {
      
              // convert CharCode into a number   
              number = String.fromCharCode(e.which);
      
              // hide value in input
              $(this).val("");
      
              // main array which holds all numbers
              value.push(number);
      
              // array of numbers before decimal mark
              before.push(value[i]);
      
              // move numbers past decimal mark
              if (i > 1) {
                  after.push(value[i - 2]);
                  before.splice(0, 1);
              }
      
              // final value
              var val_final = after.join("") + "." + before.join("");
      
              // show value separated by comma(s)
              $(this).val(addComma(val_final));
      
              // update counter
              i++;
      
              // for demo
              $(".amount").html(" " + $(this).val());
      
          } else {
      
              // reset values
              resetVal();
          }
      });
      

      重置:

      // clear arrays once clear btn is pressed
      $(".ui-input-text .ui-input-clear").on("click", function () {
          resetVal();
      });
      

      结果:

      【讨论】:

      • 非常感谢您的努力,但是在测试了这两种解决方案之后,Vizllx 的答案更符合我的客户需求。这个外观和感觉经过讨论,但没有被决策者接受;)仍然为您的努力投票。
      • @tronc 不客气。我喜欢编写这个代码,我希望它可以帮助其他人:) 祝你的项目好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多