强制使用自定义/货币模式的iOS数字键盘

是否有可能强制iOS设备显示数字键盘, 而使用自定义模式作为inputtypes

我的input模式:

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

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

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

都是缺less小数点符号和(或)在添加小数点时不作为数字validation。 另一种方法可能是在正确的位置创build十进制符号的JavaScript函数,例如按1-> 2-> 9-> 9按键创build()0.01-> 0.12-> 1.29-> 12.99,但是这需要input字段为type='text' – >这里显而易见的问题是在聚焦input字段时显示文本键盘。

我该如何解决这个问题?

编辑

环境:

  • JQM 1.3.2
  • jquery 1.8.2

目前,JavaScript是唯一的解决scheme。 下面是最简单的方法(使用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'); }); 

这个想法很简单。 input从type =“text”开始,最后在touchstart事件中变为type =“number”。 这会导致出现正确的iOS键盘。 一旦用户开始input任何input或离开字段,input再次变为type =“text”,从而绕过validation。

这种方法有一个缺点。 当用户返回到已经被填写的input时,input将会丢失(如果它没有validation)。 这意味着用户将无法返回并编辑以前的字段。 在我的情况下,这并不是那么糟糕,因为用户可能希望一次又一次地使用不同的值,所以自动删除input将保存他们几步。 但是,这在所有情况下可能都不理想。

它看起来像移动Safari支持电子邮件,数字,search,电话和url的新的HTML5inputtypes的属性。 这些将切换显示的键盘。 请参阅type属性。

例如,你可以这样做:

 <input type="number" /> 

当input框有焦点时,显示数字键盘(就好像用户有完整的键盘并点击“123”button)。

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

 <input type="tel" /> 

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

我知道这适用于移动Safari – 我只假设它将与UIWebView一起工作。

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

我做了这个小片段来实现你想要的,我已经在iPhone 5 v7.0.3上testing过了

我使用e.which来读取CharCodeinput的CharCode ,然后将它推入一个数组( 之前 ),该数组代表十进制数字前的数字,另一个数组( 之前 )将数组( 之前 )的值从小数点移动过来。

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

1) 代码演示2) 货币转换演示

HTML:

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

JS

variables和function:

 // 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(); }); 

结果:

在这里输入图像说明

我认为你可以用我向Ranjanbuild议的方法。

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

当你在webview的input中设置文本时,你可以添加一些逻辑来validation数字。

这里是我的示例项目与解决scheme的链接,在你的情况下你不需要改变inputView。 但方法是一样的,在中间使用一个男人。