强制使用自定义/货币模式的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
来读取CharCode
input的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。 但方法是一样的,在中间使用一个男人。