javascript(jquery)数字输入:keyCode for'3'和'#'都是一样
javascript (jquery) numeric input: keyCode for '3' and '#' are the same
我需要设置一个<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;
});
所有这些都很完美,直到我按下"#"键。在我的法语-加拿大键盘中,"#"有自己的键(不包含移位),返回keyCode51,与数字"3"相同。
我认为在美国键盘中,"#"是通过按下shift+3获得的,这可能就是为什么它们有相同的键代码。
现在我意识到我也必须处理shift和alt键,但那是另一回事了。
它与jquery keypress事件的工作方式不同,后者提供charCode属性,但我一开始没有使用它,因为文档中说:
由于按键事件不在任何官方规范中使用它时遇到的实际行为可能因浏览器而异,浏览器版本和平台。
此外,在这种情况下,我需要一个变通方法来处理选项卡、箭头和其他特殊键,因为它们不提供charCode。
所以问题是:有没有一种方法可以使用keydown事件只允许一些特定的字符?而且,以一种独立于键盘布局的方式工作
作为一个附带问题:哪些浏览器可能会对按键事件产生问题?我的意思是,目前我真的不在乎我的网站是否不支持IE6。我针对的是最近的浏览器。
编辑
正如有人在评论中指出的那样,这种方法不允许用户在输入中"ctrl+v"一个数字。在我的特殊情况下,这实际上不是能够粘贴数字的要求。但这在我的脑海中弹出了一些东西,用户仍然可以右键clic>复制输入中的一些文本,在这种情况下,可以是任何文本。我想得越多,就越觉得我需要keydown
事件来处理选项卡和箭头,并需要另一个事件来处理输入本身。
第2版
这里有很多漂亮的答案,但该奖项授予了使用input
和propertychange
活动的mrtsherman。我将使用此答案的组合进行数字验证,再加上像以前一样的keyCode
事件,以特殊使用箭头、制表符和回车键。
这样的东西怎么样。这应该包括剪切/粘贴以及人民币内容。我们监视文本框中内容的任何更改。然后,我们使用正则表达式根据白名单过滤掉字符。这不会处理非字符键,但我认为这是可以的。
'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的输入和其他浏览器的属性更改。
如果旧的浏览器不是问题,那么数字输入类型应该涵盖这一点。
<input type="number" />
如果没有,您可以使用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()
的组合。无论用户是用键盘打字还是粘贴数字,它都能工作。
它的工作方式是,一旦文本发生变化,它就会检查该值是否为数字。如果没有,它将修剪输入,直到它是一个数字。因此,如果输入25s
或25ss
,则会留下25
。
这也适用于ctrl+v
粘贴。它不适用于右键粘贴,因此,我禁用了仅在文本框上右键单击。
实时演示
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;
});
});
shiftkey
布尔值:
$('#myTextBox').keydown(function(e){
if(e.keyCode === 51 && !e.shiftKey){
// '3' key pressed while shift was **not** held down (not '#')
}
});
编辑我重读了您的问题,并更改了上面!shiftkey
的代码
- 使用向下箭头键(与tab键一样)聚焦下一个输入
- 在SVG地图上添加水的渐变,就像在谷歌地图(PHP/JS)中一样
- 如何像模糊图像一样模糊iframe
- FullCalendar:事件发生时阻止重叠.标题是一样的
- 如何检测滚动事件是否像在触摸设备上一样只触发一次
- DIV怎么能像Javascript中的另一个元素一样工作呢
- 我正在创建一个聊天,但每次我发送消息时,它都不会让我再发送另一条消息,就像表格一样;不起作用
- 有没有8个谜题和15个谜题一样无法解决
- 如何缩放像图像一样的元素
- 我需要iframe的内容像动画一样展开,填满整个屏幕并缩小到原来的大小
- 是否可以像字符串一样/操作/函数
- 我可以像其他库一样将JointJS作为AngularJS模块注入吗
- 什么正在取代我的'以及“;javascript代码中使用&#39;和&”;
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- 我如何创建一个选择器,就像jQuery有jQuery()或$()一样
- 为什么'这两根绳子不一样吗
- 为什么答案是一样的
- 我想把HTML从'OFF'& # 39;在# 39;使用onclick事件,就像切换一样
- 是( s{2,} /)和(/ s{2 & # 39; & # 39;} /)是一样的吗?如果不是,请解释其中的区别
- Javascript搜索函数read '*'和& # 39;强生# 39;是一样的