Javascript Regex将文本字段限制为仅限数字(必须允许不可打印的键)

我收到了以前开发人员的PHP / JS代码,我需要在手机号码字段中添加号码validation。 我已经有了HTMLvalidation,但是我需要添加一个,如果有人按下了无效的密钥,它不会显示只是为了稍后用红色突出显示该字段,因为它包含无效的输入。

我已经看过很多正则表达式并且尝试了它们,但是它们或者我需要的效果是:如果输入了字母或特殊字符,不接受也不显示,所有其他输入(数字,键)被接受(我需要根本不显示无效字符,不显示然后删除)。 现在最有效的正则表达式是这样的:

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(); } 

当我使用注释的regex1(IF条件反转)时,自然它将输入限制为只有数字,从而阻止所有键,如Delete,BackSpace等。当使用regex2时,我仍然无法按下删除或小键盘上的数字。

所以我的问题是,上面的代码可以修改为只接受数字而且还允许键吗? 另一个重要的一点是,我需要一种不对这些键使用键码(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=37 && key<=40) || key===0) { character = String.fromCharCode(key); if( character != '.' && character != '%' && character != '&' && character != '(' && character != '\'' ) { return true; } else { return false; } } else { return false; } }); } 

谢谢。

这里最好的方法是使用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 } 

上一篇文章中描述了一个很好的解决方案:

 jQuery('.numbersOnly').keyup(function () { this.value = this.value.replace(/[^0-9\.]/g,''); }); 

试试吧,

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; } }); 

小提琴: http //jsfiddle.net/PueS2/

而不是检查事件keyCode,为什么不检查实际输入内的更改,然后过滤掉非数字?

这个例子使用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"; } } 

http://jsfiddle.net/mEvSV/1/

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