0

我试图让它防止输入任何非数字和输入值长度不大于 6。现在,如果输入包含 alpha,它通过阻止超过 6 个字符来工作。但是,当我将其更改为阻止它是 alpha 或大于 6 个字符时,我根本无法输入任何内容。有什么想法吗?

<script type="text/javascript">
    $(document).ready(function () {
        var pattern = /^[0-9]+$/;
        $('#input1,#input2').keypress(function (e) {
            var length = this.value.length;
            if (!pattern.test($(this).val()) && (length >= 6)) {
                e.preventDefault();
            }
        }); 
    });
</script>
4

3 回答 3

3

补充 mazzzzz 所说的,您可以使用更强大的模式测试您想要的内容:

var pattern = /^\d{1,6}$/;

这将只接受 1 到 6 个字符的数字 (\d)。

于 2012-08-12T05:45:43.293 回答
2

我相信问题出在您制作正则表达式的方式上,$(this).val()直到该功能结束后才会显示按下的第一个字母(这就是您仍然可以使用的原因e.preventDefault(););这意味着正则表达式正在测试的 val 是空白的,正则表达式将不匹配。

我建议您将下一个字符附加到当前值上,这样您就可以测试字符串将是什么,而不是它是什么。

就像是:

$(document).ready(function () {
  var pattern = /^[0-9]+$/;
  $('#input1,#input2').keypress(function (e) {
    var curVal = $(this).val() + String.fromCharCode(e.charCode);
    var length = curVal.length;

    if (length > 6 || !pattern.test(curVal)) {
      e.preventDefault();
    }
  }); 
});

这是代码笔。codepen 做了一些不同的事情,因为有更好的方法来做到这一点,然后使用昂贵的正则表达式(这一直都没有关系,但我喜欢优化)。

于 2012-08-12T05:29:34.260 回答
0

似乎您根本不​​需要正则表达式。

<input type="text" id="input1" />
<input type="text" id="input2" />

<script type="text/javascript">
    var maxLen = 6,
        helpCodes = [37, 39, 8, 9], // left and right arrows, backspace, tab
        codes = [];
    for(var code = 48; code < 58; code++) { // number keys (48-57)
        codes.push(code);
    }
    $('#input1,#input2').on('keydown', function (e) {
        if(helpCodes.indexOf(e.keyCode) > -1) {
            return true;
        }
        if(e.shiftKey || this.value.length == maxLen
                || codes.indexOf(e.keyCode) < 0 ) {
            return false;
        }
    });
</script>​

演示

于 2012-08-12T05:59:11.427 回答