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

我需要设置一个这样它只接受数字字符,退格键,删除键,输入键,制表符和箭头键。

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

 function isNumericKeyCode (keyCode){ return ( (keyCode >= 48 && 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; }); 

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

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

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

它与jquery keypress事件的工作方式不同,它提供了charCode属性,但由于文档的说法,我最初没有使用它。

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

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

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

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

编辑


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

EDIT2


这里有很多漂亮的答案,但是奖励给了mrtsherman使用inputpropertychange 变更事件。 我将使用此答案的组合进行数字validation,并像以前一样使用keyCode事件,以便特别使用箭头,制表符和输入键。

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

\d标志表示只接受数字。

http://jsfiddle.net/UXeva/1

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

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

如果旧版浏览器不存在问题,则数字输入类型应涵盖此问题。

  

如果没有,你可以使用isNaN javascript函数

 $("#number1").on('keyup', function() { var myval = $(this).val(); if (isNaN(myval)) { alert('numbers only!'); } }); 

我个人会做一些正则表达式过滤,检查值是否已更改,这将允许任何不更改值的字符,如制表符,输入和箭头。 使用正则表达式,您还可以添加或删除任何字符,或者您可以仅使用\ d作为数字或如下所示,[0-9]。 真正满足您的确切需求是什么?

 var P; $("#number2").on('keyup', function() { var V = $(this).val(); if (V != P) { $(this).val(V.replace(/[^0-9]/g,'')); } P=V; }); 

它们也可以组合成这样的东西:

 $("#number3").on('keyup', function() { var V = $(this).val(); if (isNaN(V)) { $(this).val(V.replace(/[^0-9]/g,'')); } }); 

这是一个测试它们的FIDDLE !

为什么不做这样的事情? 它使用keyup()事件和isNaN() 。 无论用户使用键盘键入还是粘贴数字,它都会起作用。

它的工作方式是,一旦文本发生变化,它将检查该值是否为数字。 如果没有,它将修剪输入直到它是一个数字。 所以,如果你输入25s25s ,你将剩下25

这也适用于ctrl+v paste。 它无法使用右键单击粘贴,因此,我禁用了右键单击文本框。

现场演示

Jquery

 $(document).ready(function(){ $('#number').keyup(function(){ var input = this.value; while (isNaN(input)) { input = input.substring(0,input.length-1); $('#number').val(input); } }); $('#number').bind("contextmenu",function(e){ return false; }); }); 

jQuery还在事件对象上提供了shiftkey布尔值:

 $('#myTextBox').keydown(function(e){ if(e.keyCode === 51 && !e.shiftKey){ // '3' key pressed while shift was **not** held down (not '#') } }); 

编辑我重读了你的问题并更改了上面的代码!shiftkey