5

正在进行电话验证,并要求使用电话号码自动格式化输入,并且只允许添加数字字符。但是,当我尝试使用 keydown 和 keypress 限制输入时,iPhone 允许我输入 # 和 * 。当我检查 keydown 值时,它们分别与 3 和 8 相同(键码 51 和 56)。这在 Android 浏览器中完美运行,但在 iPhone 中失败。

任何人都面临类似的问题。

$(formSelector + ' input[name^="phone"]').on('keydown keypress',function (e) {         
    // Allow: backspace, delete, tab, escape, and enter  
    if ( e.keyCode == 46 || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 27 || e.keyCode == 13 ||   
        // Allow: Ctrl+A  
        (e.keyCode == 65 && e.ctrlKey === true) ||   
        // Allow: home, end, left, right  
        (e.keyCode >= 35 && e.keyCode <= 39)
    ) {                
        // let it happen, don't do anything  
        return;  
    } else {  
        // Ensure that it is a number and stop the keypress  
        if (e.shiftKey || (e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105 ) ) {  
            e.preventDefault();   
        }              

});  

我还尝试了stackoverflow中建议的另一种方法,将输入与“input propertychange”事件绑定,然后使用模式匹配。但这在 iPhone 中是正确的,但在 Android 中失败了。

$(formSelector + ' input[name^="phone"]').bind('input propertychange', function() {  
   var text = $(this).val();  
   if (isNaN(text)) {  
       $(this).val(text.replace(/[^\d]/gi, ''));  
   }  
});

有没有人有这个问题的通用解决方案?

先感谢您

4

3 回答 3

5
  on('keydown keypress',function (e){});

首先,在 iOS 上触发两次(不知道为什么),bind在 FireFox 上失败,所以只需使用$().keypress.

您的过滤让您想要的数字通过正确的键码,但是,没有捕捉到您需要捕捉的字符,起初我有一个解决方案,它使用 e.orginialEvent.keyIdentifier 来追踪行为不端的键,但这极大地失败了在火狐上。

在寻找该问题的解决方案时,我发现并修改了此页面中关于 Firefox 中的键码和字符码的代码。

  $(formSelector).keypress(function (e) {
     var k = e.keyCode || e.charCode;
     var c = e.charCode;
     var isArrow = (c == 0 && k >= 37 && k <= 40);
     var isSpecial = ((k == 8) || (k == 9) || (k == 127)) || isArrow;   // backspace, tab, delete
     var isOK = (k >= 48 && k <= 57) ;  // numbers
     return isOK || isSpecial;
   });

实时版本:

好版本,已测试:iOS、Chrome、Firefox,已测试

keyIdentifier 版本,失败于:Firefox

于 2013-07-12T04:31:34.210 回答
1

尝试

<input type="number">

或者

<input pattern="[0-9]">

于 2013-07-14T11:11:52.090 回答
0

你可以这样做: <input oninput="filter(this,'1|2|3|4|5|6|7|8|9|0')">
并在你的列表中有这个功能:
function filter(`obj,allowed) { var allowed = split("|");
var c = 0 for(c; c < allowed.length; c++) {
oqj.value=obj.value.replace(allowed[c],"")
}
}

于 2013-07-13T02:50:41.303 回答