javascript(jquery)数字输入:'3'和'#'的keyCode是相同的

Joh*_*ny5 9 javascript jquery numeric keypress keydown

我需要设置一个<input type="text" />只接受数字字符,退格,删除,输入,制表符和箭头的字符.

那里有很多例子,我从类似的东西开始:

function isNumericKeyCode (keyCode){
    return ( (keyCode >= 48 && keyCode <= 57) //standard keyboard
           ||(keyCode >= 96 && keyCode <= 105)) //Numpad
}

$('#myTextBox').keydown(function(e){
         var handled = true;
         var keyCode = e.keyCode;
         switch(keyCode){
            //Enter and arrows
            case 13:
            case 37:
            case 38:
            case 39:
            case 40:
               doSomethingSpecialsWithThesesKeys();
               break;
            default:
               handled = false;
               break;
         }

         if (  !handled
            && keyCode !== 8 //backspace
            && keyCode !== 9 //tab
            && keyCode !== 46 //del
            && !isNumericKeyCode(keyCode)){

            handled = true;
         }

         return handled;
});
Run Code Online (Sandbox Code Playgroud)

所有这一切都完美无缺,直到我按下"#"键.在我的法语加拿大键盘中,"#"有自己的键(没有隐含的移位)返回keyCode 51,与数字"3"相同.

我认为在美国键盘中,通过按shift + 3获得"#",这可能就是他们拥有相同键码的原因.

现在我意识到我必须处理shift和alt键,但这是另一个故事.

它与jquery keypress事件的工作方式不同,后者提供了charCode属性,但我最初没有使用它,因为文档说的是:

由于任何官方规范都没有涵盖按键事件,因此在使用它时遇到的实际行为可能因浏览器,浏览器版本和平台而异.

此外,在这种情况下,我需要一种解决方法来处理制表符,箭头和其他特殊键,因为它们不提供charCode.

所以问题是: 有没有办法只允许使用keydown事件的某些特定字符?那么,以某种方式独立于键盘布局工作?

作为一个侧面任务:哪些浏览器可能与keypress事件有关?我的意思是,目前我并不关心我的网站是否不支持IE6.我的目标是最近的浏览器.

编辑


正如有人在评论中指出的那样,这种方法不允许用户在输入中"ctrl + v"一个数字.在我的特殊情况下,这不是一个能够粘贴数字的要求.但是这突然出现在我的脑海中,用户仍然能够正确地复制输入中的一些文本,在这种情况下可能是任何东西.我越想它,我就越需要keydown事件来处理标签和箭头,以及另一个事件来处理输入本身.

EDIT2


这里有很多漂亮的答案,但是奖项由mrtsherman使用inputpropertychange事件.我将使用这个答案的组合进行数字验证,并keyCode像以前一样使用箭头,制表符和输入键的特殊用途.

mrt*_*man 3

像这样的事情怎么样?这应该涵盖剪切/粘贴以及人民币内容。我们监视文本框内容的任何变化。然后我们使用正则表达式根据白名单过滤掉字符。这不会处理非字符键,但我认为没关系。

\d标志表示仅应接受数字。

http://jsfiddle.net/UXeva/1

$('#myTextBox').bind('input propertychange', function() {
    var text = $(this).val();
    if (isNaN(text)) {
       $(this).val(text.replace(/[^\d]/gi, ''));
    }
});
Run Code Online (Sandbox Code Playgroud)

我们在这里绑定两个事件。FireFox 的输入和其他浏览器的 propertychange。