jQuery键盘输入事件keyup函数检查是否为数字

17

我正在尝试创建一个只能输入数字的输入框。这个函数对我来说已经基本正常工作:

        $('#p_first').keyup(function(event){
        if(isNaN(String.fromCharCode(event.which))){
            var value = $(this).val();

            $(this).val(value.substr(0,value.length-1));
        }
    });

但问题是,当用户按住带有字符的键时,功能键弹起事件不会被触发... 有什么办法可以禁止这种情况发生吗?


按下了哪个键?能否提供更详细的问题描述? - Kevin Bowersox
任何按键...输入类型=文本...如果用户长时间按住"aaaaaaaaaaaaaaaa"等键,则keyup()函数不会触发,直到他松开该键。 - Adam Sam
感谢您提供更多的问题,我认为我的建议解决方案应该可以解决您的问题。 - Kevin Bowersox
8个回答

38
尝试将事件绑定到keypress事件而不是keyup。当按键被按住时,它会重复触发。如果按下的按键不是数字,你可以调用preventDefault()来阻止按键被放置在输入标签中。
   $('#p_first').keypress(function(event){

       if(event.which != 8 && isNaN(String.fromCharCode(event.which))){
           event.preventDefault(); //stop character from entering input
       }

   });

示例: http://jsfiddle.net/rTWrb/2/


我已经尝试过,但是当函数Keypress在运行时,新字符还没有出现在文本框中,所以我无法使用substr()删除它。 - Adam Sam
现在有一件事...我不能删除数字 :D - Adam Sam
@AdamSam 你也应该忽略:箭头、删除键,当用鼠标选择文本时和块空格键。 - webdeveloper
@KevinBowersox 我有一个类似的需求..但在我的情况下,用户也可以输入负数..所以如何允许用户仅在数字的第一位输入“-”符号 - tarares
为了允许小数点,代码如下: var enteredChar = String.fromCharCode(event.which); if(event.which != 8 && (isNaN(enteredChar) && enteredChar!='.') ) .... - DAB
显示剩余3条评论

6
我决定使用@Rahul Yadav提供的答案,但是它存在错误,因为它没有考虑到数字键盘键,这些键具有不同的代码。
在这里,您可以查看代码表摘录:
这里是我实现的函数:
function isNumberKey(e) {
    var result = false; 
    try {
        var charCode = (e.which) ? e.which : e.keyCode;
        if ((charCode >= 48 && charCode <= 57) || (charCode >= 96 && charCode <= 105)) {
            result = true;
        }
    }
    catch(err) {
        //console.log(err);
    }
    return result;
}

5

@IagoMelanias 你是什么意思?你是在谈论第二个输入还是话题发起人的代码? - webdeveloper
我在谈论你的代码。如果我使用键盘右侧的按键,它不起作用。 - Iago
@IagoMelanias 按下 NumLock 键,这样应该可以解决你的问题。 - webdeveloper

3

最好的方法是检查输入值,而不是按下的键。因为在使用字符代码时需要检查制表符、箭头、退格和其他字符。

该代码在用户按下键后检查输入值:

$('#p_first').keyup(function(){
    while(! /^(([0-9]+)((\.|,)([0-9]{0,2}))?)?$/.test($('#p_first').val())){
        $('#p_first').val($('#p_first').val().slice(0, -1));
    }
});

当输入值无效时,使用while循环删除最后一个字符。 正则表达式/^(([0-9]+)((\.|,)([0-9]{0,2}))?)?$/验证整数和浮点数,例如"12,12","12.1","12."。 重要的是数字"12."(末尾带有小数点)也是有效的!否则用户无法输入任何句点。

然后在提交时,正则表达式检查有效的浮点数([0-9]{1,2})而不是([0-9]{0,2})

$('form').submit(function(e){
    if(! /^([0-9]+)((\.|,)([0-9]{1,2}))?$/.test($('#p_first').val())){
        $('#p_first').addClass('error');
        e.preventDefault();
    }
});

注意:最好将$('#p_first')分配给变量。 var input = $('#p_first');


0

试一下,可能有用。

<HTML>
<input type="text" name="qty" id="price" value="" style="width:100px;" field="Quantity" class="required">
</HTML>

<script>
 $(document).ready(function() {
$('#price').live('keyup',function(){
        this.value = this.value.replace(/[^0-9\.]/g,'');
        });
});
</script>

0

使用关键事件,使用event.key获取实际值。要检查是否为整数:

isFinite(event.key);

一个更简单的HTML解决方案是使用number类型输入。它只限制为数字(有点)。
<input type="number">

无论哪种方式,您都应该使用以下方法清理所有用户输入:
string.replace(/[^0-9]/g,'');

0
我使用了以下函数来检查给定的字符串是否为数字。这个实现可以在键盘按下和松开时工作,并且还可以处理小键盘键。
// Validate Numeric inputs
function isNumber(o) {
    return o == '' || !isNaN(o - 0);
}

假设您的按键代码在keyup或keydown事件中存储在keyCode变量中:
var keyCode = e.keyCode || e.which;
if (keyCode >= 96 && keyCode <= 105) {
        // Numpad keys
        keyCode -= 48;
}
console.log(isNumber(String.fromCharCode(keyCode)));
console.log(isNumber($(this).val() + String.fromCharCode(keyCode)));

如果 isNumber 的返回值为 false,则返回 false:

    var txtVal = $(this).val() + String.fromCharCode(keyCode);
    if (!isNumber(txtVal)) {
        e.returnValue = false;
    }

-1
JavaScript:

  function isNumberKey(a){
  var x=a.val();
  a.val(x.replace(/[^0-9\.]/g,''));

}

HTML:

     <td><input type="text" name="qty" onkeypress="onkeyup="return isNumberKey($(this));"" value="" style="width:100px;" field="Quantity" class="required"></td>

这个对于转义字符返回 true 吗? - jeff
该函数是错误的,因为它没有考虑到数字键盘键,这些键有不同的代码。请查看替代答案。 - Richard P.
如果输入仅为数字,则此函数返回 true。 - Rahul Yadav
不处理数字键盘键。 - Sacky San

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接