使用replace和Regex支持整数输入的方法

时间:2013-08-06 20:23:06

标签: javascript regex

我有一个输入字段,我只想要允许正负整数。我用onkeyup()跟踪它们的输入,因为这是跨浏览器最一致的。当尝试替换非数字字符而不在开始时替换短划线时,真正的问题就出现了。

if(e.keyCode < 48 || e.keyCode > 57) {
    var data = e.target.value;

    if(e.target.value.match(/^[-]?/))
        e.target.value = '-' + data.substr(1).replace(/\D*/, "");
    else
        e.target.value = data.replace(/\D*/,"");
    }

基本上这里发生的事情是我在输入数字时忽略,但是其他一切都试图替换他们可能添加的任何不是数字的东西。现在的问题是,当我按Backspace时,由于某种原因,破折号立即回来。

E.g。
我的输入栏有: - 当我按退格键时。
我的输入字段保持如下: -

工作代码:

        if(e.keyCode < 48 || e.keyCode > 57) {
            var data = e.target.value;

            if(e.target.value.match(/^[-]+/))
                e.target.value = '-' + data.substr(1).replace(/\D/, "");
            else { console.log('else');
                e.target.value = data.replace(/\D/,"");
            }
        }

2 个答案:

答案 0 :(得分:0)

更改

if(e.keyCode < 48 || e.keyCode > 57) {

if((e.keyCode < 48 || e.keyCode > 57) && e.keyCode!=8) {

然后你会忽略退格字符,就像一个数字,这不会引起任何其他问题。

答案 1 :(得分:0)

我刚刚发现问题,Renegade有一个不错的方法,但我犯了一个正则表达式的错误。它应该是这样的:

if(e.target.value.match(/^[-]+/))

而不是:

if(e.target.value.match(/^[-]?/))

因为即使破折号不存在,后者也会成立。 ?表示0或1个匹配,+为1或更多。