javascript - iPhone 为 (hash and 3) 和 (Asterisk and 8) 返回相同的按键事件

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

});  

我还尝试了 stackoverflow 中建议的另一种方法,将输入与“input propertychange”事件绑定(bind),然后使用模式匹配。但这在 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 上触发两次(不知道为什么),bind 在 FireFox 上失败,所以只需使用 $().keypress

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

在寻找该问题的解决方案时,我发现并修改了来自 page about keycodes and charcodes in 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;
   });

现场版:

Good Version, Tested on: iOS, Chrome, Firefox, Tested

keyIdentifier version, Failed on: Firefox

关于javascript - iPhone 为 (hash and 3) 和 (Asterisk and 8) 返回相同的按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17469101/

相关文章:

javascript - Ionic 框架 - 弹出取消按钮不起作用 - v1.0.0-beta.1 "actinium"

javascript - 分配给 {}.toString 是什么意思?

powershell - Powershell ISE 5.1-WindowsMediaPlayer类-事件未触发

c# - 通过 COM 从 Delphi 触发 .NET DLL 中的事件的问题

javascript - jQuery - 悬停不适用于 for 循环

iphone - iOS – 将录音保存到应用文档

iphone - iphone编程如何向sqlite数据库插入多行数据

iphone - 如何检测 UIImage 中的 alpha 像素

C# 事件分发

javascript - 将 X 个 JSON 合并到一个 JavaScript 对象中