Jquery:在按键上过滤输入

时间:2013-06-20 18:05:40

标签: javascript jquery regex keypress keyup

我有一个文本字段,它只接受以下字符:

允许的字符:[a-z 0-9 +# - 。]

当您提出问题时,这与“标签”字段中的 SO 过滤器相同。 如果用户键入无效字符,我希望当前文本字段值保持不变。我试过了:

$('#post_tags').keypress(function(event){
    var char = String.fromCharCode(event.which)
    var txt = $(this).val()

    if (! txt.match(/[^A-Za-z0-9+#-\.]/)){
        $(this).val(txt.replace(char, ''));
    }
})

为什么它不起作用?谢谢!

5 个答案:

答案 0 :(得分:13)

这对我有用:

$(function(){
    $('#t').keypress(function(e){
        var txt = String.fromCharCode(e.which);
        console.log(txt + ' : ' + e.which);
        if(!txt.match(/[A-Za-z0-9+#.]/)) 
        {
            return false;
        }
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input id="t" />

答案 1 :(得分:5)

/[^A-Za-z0-9+#-\.]/

这否定了任何一个角色的匹配。要使其匹配多个字符,您必须在其中使用+

/[^A-Za-z0-9+#-\.]+/
                  ^

现在要匹配整个字符串,你需要添加锚点:

/^[^A-Za-z0-9+#-\.]+$/
 ^                  ^

编辑:好的,这里的-似乎也在创建从字符#.的范围。在这种情况下,您可以将其转义,或将其放在最后:

/^[^A-Za-z0-9+#\-\.]+$/

/^[^A-Za-z0-9+#\.-]+$/

答案 2 :(得分:1)

替代解决方案

可能有用的一件事就是使用.which字段。然后只在不适合时返回false。我实际上有一个huge object充满了所有主流浏览器的.which信息。它包括你可以借用它来创建类似的数组:

var alphaNumericNcontrols = [ 8,9,13,16,17,18,19,20,32,33,34,35,36,37,38,39,40,44,45,46,145,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,96,97,98,99,100,101,102,103,104,105 ],
    illegal = {
        reg: [ 106,111,191,220 ],
        shift: [ 56,59,188,190,191,220,222 ]
    }

$(document).on("keydown", "input[type=text]", function(e) {
    var eKey = e.which || e.keyCode;
    if (alphaNumericNcontrols.indexOf(eKey) === -1) return false;
    if (illegal.reg.indexOf(eKey) > -1) return false;
    if (e.shiftKey && illegal.shift.indexOf(eKey) > -1) return false;
});

See Working Example Here

请记住,我的对象并不完美,我可能需要对它进行一些更新,但我尽力从每个可能的主浏览器中建立所有内容!

答案 3 :(得分:0)

谢谢大家。

实际上我的问题有点困难:过滤无效密钥并以两种不同的方式启动有效密码的ajax调用:如果用户按SPACE / COMMA或他/她仍在键入。这是代码:

$(document).ready(function(){

$('#post_tags').keypress(function(e){
    var txt = String.fromCharCode(e.which);
    console.log(txt + ' : ' + e.which);

    if(txt.match(/^[^A-Za-z0-9+#\-\.]+$/))
    {
          return false;
    }
})

$('#post_tags').keyup(function(event){
      code = event.which
      var token = String.fromCharCode(code)
      var txt = $(this).val()

              //create a new tag, take it out of textfield
      if (code == 32 || code == 188)
      {
        console.log("AJAX new word keyup")

          $.ajax({
            type: 'get',
            url: '/posts/tags_change',
            dataType: "json",
            data: "query=" + $(this).val(),

            success: function(data) {
            console.log(data)
            $('#post_tags').val('')
            },

            error: function(data) {
                alert("Ajax error")
            }
          });
    }
    else
    {
                    //do autocomplete ajax
        console.log("typing:" + txt)
    }

});

})

不要知道这是否100%正确!

答案 4 :(得分:0)

您不需要替换char,只能阻止它。

var char = String.fromCharCode(event.which)
if (!char.match(/^[^A-Za-z0-9+#\.\-]+$/)) event.preventDefault();