iPhone为(hash和3)和(Asterisk和8)返回相同的keydown事件

Ano*_*ooj 5 javascript iphone events keycode

我正在进行电话验证,并要求使用电话号码自动格式化输入,并且只允许添加数字字符.但是当我尝试使用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();   
        }              

});  
Run Code Online (Sandbox Code Playgroud)

我还尝试了另一种方法,它在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, ''));  
   }  
});
Run Code Online (Sandbox Code Playgroud)

有没有人有这个问题的共同解决方案?

先感谢您

Gra*_*ath 5

  on('keydown keypress',function (e){});
Run Code Online (Sandbox Code Playgroud)

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

你的过滤是通过正确的密码来获取你想要的数字,但是,没有捕获你需要捕获的字符,起初我有一个解决方案,使用e.orginialEvent.keyIdentifier来追踪行为不端的密钥,但这显然失败了在Firefox上.

在寻找该问题的解决方案时,我发现并修改了此页面中有关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;
   });
Run Code Online (Sandbox Code Playgroud)

实时版本:

好的版本,经过测试:iOS,Chrome,Firefox,经过测试

keyIdentifier版本,失败:Firefox