Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式将文本字段限制为仅数字(必须允许不可打印的键)_Javascript_Jquery_Regex_Validation_Validationrules - Fatal编程技术网

Javascript正则表达式将文本字段限制为仅数字(必须允许不可打印的键)

Javascript正则表达式将文本字段限制为仅数字(必须允许不可打印的键),javascript,jquery,regex,validation,validationrules,Javascript,Jquery,Regex,Validation,Validationrules,我从以前的开发人员那里收到了PHP/JS代码,我需要将数字验证添加到手机号码字段中。我已经有了HTML验证,但是我需要补充的是,如果有人按下了无效的键,它不会显示出来,只是在后面用红色突出显示字段,因为它包含无效的输入 我见过许多正则表达式的使用和尝试,但它们有一个非此即彼的效果,我需要的是:如果输入一个字母或特殊字符,不接受和不显示,所有其他输入(数字,键)都被接受(我需要无效字符不显示,不显示,然后删除)。现在最有效的正则表达式是: function filterNonDigits(evt)

我从以前的开发人员那里收到了PHP/JS代码,我需要将数字验证添加到手机号码字段中。我已经有了HTML验证,但是我需要补充的是,如果有人按下了无效的键,它不会显示出来,只是在后面用红色突出显示字段,因为它包含无效的输入

我见过许多正则表达式的使用和尝试,但它们有一个非此即彼的效果,我需要的是:如果输入一个字母或特殊字符,不接受和不显示,所有其他输入(数字,键)都被接受(我需要无效字符不显示,不显示,然后删除)。现在最有效的正则表达式是:

function filterNonDigits(evt)
{
  var event = evt || window.event;
  var keyentered = event.keyCode || event.which;
  keyentered = String.fromCharCode(keyentered);

  //var regex1 = /[0-9]|\./;
  var regex2 = /^[a-zA-Z.,;:|\\\/~!@#$%^&*_-{}\[\]()`"'<>?\s]+$/;

  if( regex2.test(keyentered) ) {
    event.returnValue = false;
    if(event.preventDefault) event.preventDefault();
  }
函数过滤器OnDigits(evt)
{
var事件=evt | | window.event;
var keycentered=event.keyCode | | event.which;
KEYENTERD=字符串。fromCharCode(KEYENTERD);
//变量regex1=/[0-9]\./;
变量regex2=/^[a-zA-Z;::\\\/~!@$%^&*.-{}\[\]()`?\s]+$/;
如果(regex2.test(输入键)){
event.returnValue=false;
if(event.preventDefault)event.preventDefault();
}
当我使用带注释的regex1(IF条件颠倒)时,它自然将输入限制为仅数字,从而防止所有键,如Delete、BackSpace等。当使用regex2时,我仍然无法按Delete或numpad中的数字

所以我的问题是,上面的代码是否可以修改为只接受数字,但也允许按键?另一个重要的问题是,我需要一种不使用按键代码(8、24等)的方法,以确保所有键盘类型都可以使用


最新更新: 因此,我的解决方案如下:如果“oninput”属性存在,我使用Ehtesham提供的解决方案,如果不存在,备份使用Rohan Kumar提供的解决方案。因此如下所示:

if (obj.hasOwnProperty('oninput') || ('oninput' in obj)) 
{
    $('#mobileno').on('input', function (event) { 
        this.value = this.value.replace(/[^0-9]/g, '');
    });
} 
else 
{
    $('#mobileno').on('keypress',function(e){
        var deleteCode = 8;  var backspaceCode = 46;
        var key = e.which;
        if ((key>=48 && key<=57) || key === deleteCode || key === backspaceCode || (key>=37 &&  key<=40) || key===0)    
        {    
            character = String.fromCharCode(key);
            if( character != '.' && character != '%' && character != '&' && character != '(' && character != '\'' ) 
            { 
                return true; 
            }
            else { return false; }
         }
         else   { return false; }
    });
}
if(obj.hasOwnProperty('oninput')| |('oninput'在obj中))
{
$('#mobileno')。在('input',函数(event){
this.value=this.value.replace(/[^0-9]/g');
});
} 
其他的
{
$('mobileno')。on('keypress',函数(e){
var deleteCode=8;var backspaceCode=46;
var-key=e.which;
如果((key>=48&&key=37&&key试一下

CSS

.error{border:1px solid #F00;}
脚本

$('#key').on('keydown',function(e){
    var deleteKeyCode = 8;
    var backspaceKeyCode = 46;
    if ((e.which>=48 && e.which<=57) ||
         (e.which>=96 && e.which<=105)  || // for num pad numeric keys
         e.which === deleteKeyCode || // for delete key,
             e.which === backspaceKeyCode) // for backspace
         // you can add code for left,right arrow keys
    {
        $(this).removeClass('error');
        return true;
    }
    else
    {
        $(this).addClass('error');
        return false;
    }
});
$('#key')。打开('keydown',函数(e){
var deleteKeyCode=8;
var backspaceKeyCode=46;

如果((e.which>=48&&e.which=96&&e.which而不是检查事件键码,为什么不检查实际输入中的更改,然后过滤掉非数字

这个例子使用了keyup,这样它就可以读取实际输入的内容,这意味着该字符会短暂显示然后删除,但希望你能理解我的要点。它甚至可能会给用户反馈该字符是不允许的。无论哪种方式,我认为这是最简单的设置,如果你需要更多帮助,请告诉我

function filterNonDigits(evt)
{
  var event = evt || window.event;
  var val = event.target.value;
  var filtered = val.replace(/[^0-9]/g, '');

    if(filtered !== val) {
      event.target.value = filtered;
      event.target.className += " error";
    }
}


(jquery仅用于轻松绑定keyup函数,您的实际脚本不需要它)

一个很好的解决方案如下:


这里最好的方法是使用
input
事件来处理您所有的问题。所有现代浏览器都支持它。使用jQuery,您可以执行以下操作。处理所有情况,使用鼠标/键盘退格等粘贴值

$('.numeric').on('input', function (event) { 
    this.value = this.value.replace(/[^0-9]/g, '');
});
看到了吗

您可以通过检查输入是否具有此属性来检查
input
事件是否受支持。如果不支持,您可以对较旧的浏览器使用
onkeyup

if (inputElement.hasOwnProperty('oninput')) {
    // bind input
} else {
    // bind onkeyup
}

/\d/
相当于上述的
/[0-9]/
.src:

这更简洁了一点

this.value = this.value.replace(/\D/gm, '');

正则表达式包含一个
\.
,它在不允许的正则表达式中明确列出。另外,如果原始帖子的问题或标签中没有包含jQuery,通常我不会推荐jQuery解决方案。谢谢你们两位的回复。我确实尝试过这种方法,但被要求找到一种不显示字母的方法,然后删除了它,这让我开始寻找其他方法。jQuery也可以,但我没有包括它,因为我的问题更多的是关于要使用的JS函数。啊,这需要一种不同的方法。你能把它添加到你原来的问题中吗?它可能会阻止人们添加更多不符合你需要的答案。谢谢你的提示。我真的以为我通过提到我不希望显示无效的信件,但我可以看到,如果它显示并被删除,它可以被认为是正常的。我现在将编辑它。感谢您的回复。正如我在上一个回复的评论中提到的,我已经尝试过这种方法,但正是因为这个原因,我正在寻找另一种方法。”角色将短暂显示,然后删除“Result.感谢您在我尝试提供的不同解决方案时对不同问题的帮助:)谢谢你的回复。我使用键盘代码的唯一问题是,如果有人使用的是非美国键盘,某些键可能有不同的键盘代码。我正在查看RegEx以避免这个问题。哦,如果是这样的话,看看这个:。只需使用
keypress
事件,而不是keypup/downAh没有想到的(这里是JS和jQuery的新手)。那么在Rohan Kumar提供的代码中用“keypress”替换“keydown”就行了吗?我现在有另一个问题,那就是点、%和&字符的代码与backspace和2个箭头键的代码相同(我允许)所以点、%和-,也被接受。还有一件事是在Mozilla FF中,我根本不能在字段中键入。有什么想法吗?好的FF问题已经解决了,我用了“e.keyCode”而不是“e.which”“哪个FireFox似乎有问题。现在我只是遇到了某些无效字符的问题,这些字符的代码与不可打印的键相同。到目前为止,我注意到的是(%,&,,')。知道如何解决这个问题吗?谢谢。感谢您的回复,这实际上看起来很有希望满足我的需要
this.value = this.value.replace(/\D/gm, '');