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

iPhone returning same keydown event for (hash and 3) and (Asterisk and 8)

本文关键字:返回 keydown 事件 Asterisk hash iPhone      更新时间:2023-09-26

我正在进行电话验证,并要求使用电话号码自动格式化输入,并且只允许添加数字字符。然而,当我尝试使用keydown和keypress限制输入时,IPhone允许我输入#和*。当我检查keydown值时,它们分别与3和8相同(键代码51和56)。这在安卓浏览器中非常有效,但在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中建议的另一种方法,将输入与"inputpropertychange"事件绑定,然后使用模式匹配。但这在IPhone中是正确的,但在Android中失败了。

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

有人能解决这个问题吗??

提前感谢

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

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

你的过滤是为你想要的数字提供正确的键代码,但没有捕捉到你需要捕捉的字符,起初我有一个解决方案,使用e.orginialEvent.keyIdentifier来追踪错误的键,但这在firefox上失败了。

在寻找这个问题的解决方案时,我在这个页面上找到并修改了Firefox中关于密钥码和charcode的代码。

  $(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

尝试

<input type="number">

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

您可以执行以下操作:<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],"")
}
}