如何使用jquery阻止或限制输入字段中的特殊字符?


Answers:


132

一个使用正则表达式的简单示例,您可以更改以允许/禁止自己喜欢的任何东西。

$('input').on('keypress', function (event) {
    var regex = new RegExp("^[a-zA-Z0-9]+$");
    var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
    if (!regex.test(key)) {
       event.preventDefault();
       return false;
    }
});

49
这不工作粘贴的文本及还可防止非文本按键像退格键,用户,箭头键等
bendytree

6
这将不允许在firefox中使用退格键
Alex

不工作像西班牙语单词:艾维(平面),ARBOL(树),等等
nikoskip

它不工作在最新的Firefox布劳尔,但在铬做工精细
凤凰

此解决方案对我适用于Bootstrap-TagsInput元素。要解决粘贴问题,只需将“粘贴”添加到事件参数列表中,如下所示:$('input')。on('keypress,paste'',()=> ........
Jim22150

60

我在寻找一个答案,将输入限制为仅字母数字字符,但仍允许使用控制字符(例如,退格键,删除键,制表符)和复制+粘贴。我尝试提供的所有答案均未满足所有这些要求,因此我使用该input事件提出了以下建议。

$('input').on('input', function() {
  $(this).val($(this).val().replace(/[^a-z0-9]/gi, ''));
});

编辑:
正如rinogo在注释中指出的那样,当在输入文本的中间键入内容时,以上代码段将光标强制到输入的末尾。我相信下面的代码片段可以解决此问题。

$('input').on('input', function() {
  var c = this.selectionStart,
      r = /[^a-z0-9]/gi,
      v = $(this).val();
  if(r.test(v)) {
    $(this).val(v.replace(r, ''));
    c--;
  }
  this.setSelectionRange(c, c);
});

1
+1我正在向下滚动答案,寻找这样的答案,否则我将提交自己的答案。这个答案会立即过滤掉所有不允许的字符!大!
emilhem 2013年

2
+1适用于粘贴的文本,不会干扰FF的退格键和删除键,并且不依赖event.whichevent.keycode!希望我能+10!
rinogo

3
...但是在Chrome和IE中,当您输入新字符或使用退格键并在输入文本的中间删除键,光标将移动到文本的末尾...:/是否有一种简单的解决方法这个?我非常想要这个工作!
rinogo

太接近了...该代码在Chrome移动中的行为非常奇怪。光标在键入的第一个字母和退格键上跳来跳去。
朱利诺2015年

2
@Juliano有趣的是,无论光标/插入符号当前位于何处,似乎selectStart在Chrome Mobile上始终返回0。我不确定(还是)这是错误还是预期的行为。我目前正在研究这个问题,当我了解更多信息时,将在这里更新我的答案或评论。
rexmac

48

简短答案:防止“按键”事件:

$("input").keypress(function(e){
    var charCode = !e.charCode ? e.which : e.charCode;

    if(/* Test for special character */ )
        e.preventDefault();
})

长答案:使用类似jquery.alphanum的插件

选择解决方案时,需要考虑以下几件事:

  • 贴上文字
  • 上面的代码可能会阻止退格或F5之类的控制字符。
  • é,í,ä等
  • 阿拉伯文或中文...
  • 跨浏览器兼容性

我认为该领域非常复杂,足以保证使用第三方插件。我试用了几个可用的插件,但是发现每个插件都有一些问题,所以我继续写了jquery.alphanum。代码如下:

$("input").alphanum();

或为更细粒度的控制,添加一些设置:

$("#username").alphanum({
    allow      : "€$£",
    disallow   : "xyz",
    allowUpper : false
});

希望能帮助到你。


1
很棒的东西人,很棒。我只需要添加一个启用/禁用斜杠字符('/')的选项,因为在将其放入allow设置时不起作用。但这就是jquery插件的优点,您可以根据自己的需要对其进行修改。谢谢!
阿德里安·马里尼卡

谢谢阿德里安。顺便说一句,我只是尝试使用allow选项启用斜线,使用以下代码对我来说效果很好:$('#firstName').alphanum({allow: "/"});您有机会提供更多信息吗?如果文档存在错误或问题,最好将其修复。干杯
KevSheedy

嗨,KevSheedy,谢谢您抽出宝贵的时间对此进行测试。抱歉,我没有说清楚。问题是我也有allowOtherCharSets: falseallowCaseless: false。这些干扰了中的设置allow。从我的角度来看,我认为该allow选项应否决所有其他选项(如allowOtherCharSetsallowCaseless)。因此,如果您在allow选项中指定了字符,则无论配置对象中设置的其他选项如何,都应允许该字符。同样适用disallow。但这只是我的意见。:)再次欢呼!:)
Adrian Marinica

好点的阿德里安。我已经先行一步,并发表在V1.0.6修复,使allowdisallow具有更高的优先级。它已登录第7期。希望对您
有所

6
“所以我继续写了jquery.alphanum”太棒了!
Felix

14

使用HTML5的模式输入属性!

<input type="text" pattern="^[a-zA-Z0-9]+$" />

11
尽管此解决方案可以防止提交不需要的字符,但不能防止将不需要的字符输入到输入字段中。
rexmac

1
还存在用户未使用HTML5浏览器的风险。
肯帕奇船长

从UX经验来看,很多人讨厌被限制输入的内容是被告知您事后做错了。-强制输入是为了减少错误消息和无效通知。
Julix

1
@Julix视情况而定。有些字段只能是数字(价格或任何货币金额等),在这些字段中,听字母字符输入没有任何意义。但是,是的,我的确不是解决OP问题的方法,而是解决UX问题的一种好方法。
keepitreal '17

13

您的文本框:

<input type="text" id="name">

您的JavaScript:

$("#name").keypress(function(event) {
    var character = String.fromCharCode(event.keyCode);
    return isValid(character);     
});

function isValid(str) {
    return !/[~`!@#$%\^&*()+=\-\[\]\\';,/{}|\\":<>\?]/g.test(str);
}

@Bhargav Rao,我删除了另一个重复的帖子,并重新发布了此帖子,因为该帖子更合适,感谢您指出这一点
chandler

11

使用正则表达式允许/禁止任何操作。另外,对于比接受的答案稍微更健壮的版本,可以通过先传递keypress事件和根据键码而不是值来检查键。

$('#input').bind('keydown', function (event) {
        switch (event.keyCode) {
            case 8:  // Backspace
            case 9:  // Tab
            case 13: // Enter
            case 37: // Left
            case 38: // Up
            case 39: // Right
            case 40: // Down
            break;
            default:
            var regex = new RegExp("^[a-zA-Z0-9.,/ $@()]+$");
            var key = event.key;
            if (!regex.test(key)) {
                event.preventDefault();
                return false;
            }
            break;
        }
});

11

看一下jQuery字母数字插件。https://github.com/KevinSheedy/jquery.alphanum

//All of these are from their demo page
//only numbers and alpha characters
$('.sample1').alphanumeric();
//only numeric
$('.sample4').numeric();
//only numeric and the .
$('.sample5').numeric({allow:"."});
//all alphanumeric except the . 1 and a
$('.sample6').alphanumeric({ichars:'.1a'});

有一个字母可以吗?通常我只将nan用于数字(例如邮政编码或电话)

3

在文本框的onkeypress事件上编写一些JavaScript代码。按照要求允许和限制文本框中的字符

function isNumberKeyWithStar(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 42)
        return false;
    return true;
}
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}
function isNumberKeyForAmount(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 46)
        return false;
    return true;
}


1
如果我手动键入,这是可行的。但是我可以粘贴复制的特殊字符。
Sunil Garg'1

3

我用这段代码修改了我看到的其他代码。如果按下的键或粘贴的文本通过模式测试(匹配),则仅对用户写入(此示例是仅允许输入8位数字的文本输入)

$("input").on("keypress paste", function(e){
    var c = this.selectionStart, v = $(this).val();
    if (e.type == "keypress")
        var key = String.fromCharCode(!e.charCode ? e.which : e.charCode)
    else
        var key = e.originalEvent.clipboardData.getData('Text')
    var val = v.substr(0, c) + key + v.substr(c, v.length)
    if (!val.match(/\d{0,8}/) || val.match(/\d{0,8}/).toString() != val) {
        e.preventDefault()
        return false
    }
})

为什么!e.charCode ? e.which : e.charCode而不是简单地e.charCode ? e.charCode : e.which
Massimiliano Kraus

十进制数字接受需要进行哪些更改?
ubm

2

这是一个阻止用户键入字符“ a”的示例

$(function() {
$('input:text').keydown(function(e) {
if(e.keyCode==65)
    return false;

});
});

此处的关键代码参考:http :
//www.expandinghead.net/keycode.html


我认为,您不想允许的所有键控代码都可能使您难以进行尝试和管理。
RSolberg

如果要限制某人只能输入1到5,则最终只能在代码中管理5个键码。
RSolberg

2
如果AlphaNumeric不是适合您的插件,这实际上不是一个坏计划。我使它与switch / case语句一起工作。此示例禁止目录名称中不允许使用的字符:$('input [type ='text'],textarea')。keydown(function(ev){switch(ev.keyCode){case 47:case 92:case 63:案例37:案例42:案例59:案例124:案例34:案例60:案例62:返回false;};});
米勒

@ user434917,当我使用android移动chrome浏览器对其进行测试时,您的代码无法正常工作。您对此有什么解决方案吗?
Pranesh Janarthanan

2
$(function(){
      $('input').keyup(function(){
        var input_val = $(this).val();
        var inputRGEX = /^[a-zA-Z0-9]*$/;
        var inputResult = inputRGEX.test(input_val);
          if(!(inputResult))
          {     
            this.value = this.value.replace(/[^a-z0-9\s]/gi, '');
          }
       });
    });

1

是的,您可以通过以下方式使用jQuery:

<script>
$(document).ready(function()
{
    $("#username").blur(function()
    {
        //remove all the class add the messagebox classes and start fading
        $("#msgbox").removeClass().addClass('messagebox').text('Checking...').fadeIn("slow");
        //check the username exists or not from ajax
        $.post("user_availability.php",{ user_name:$(this).val() } ,function(data)
        {
          if(data=='empty') // if username is empty
          {
            $("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
            { 
              //add message and change the class of the box and start fading
              $(this).html('Empty user id is not allowed').addClass('messageboxerror').fadeTo(900,1);
            });
          }
          else if(data=='invalid') // if special characters used in username
          {
            $("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
            { 
              //add message and change the class of the box and start fading
              $(this).html('Sorry, only letters (a-z), numbers (0-9), and periods (.) are allowed.').addClass('messageboxerror').fadeTo(900,1);
            });
          }
          else if(data=='no') // if username not avaiable
          {
            $("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
            { 
              //add message and change the class of the box and start fading
              $(this).html('User id already exists').addClass('messageboxerror').fadeTo(900,1);
            });     
          }
          else
          {
            $("#msgbox").fadeTo(200,0.1,function()  //start fading the messagebox
            { 
              //add message and change the class of the box and start fading
              $(this).html('User id available to register').addClass('messageboxok').fadeTo(900,1); 
            });
          }

        });

    });
});
</script>
<input type="text" id="username" name="username"/><span id="msgbox" style="display:none"></span>

您的user_availability.php的脚本为:

<?php
include'includes/config.php';

//value got from the get method
$user_name = trim($_POST['user_name']);

if($user_name == ''){
    echo "empty";
}elseif(preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-]/', $user_name)){
    echo "invalid";
}else{
    $select = mysql_query("SELECT user_id FROM staff");

    $i=0;
    //this varible contains the array of existing users
    while($fetch = mysql_fetch_array($select)){
        $existing_users[$i] = $fetch['user_id'];
        $i++;
    }

    //checking weather user exists or not in $existing_users array
    if (in_array($user_name, $existing_users))
    {
        //user name is not availble
        echo "no";
    } 
    else
    {
        //user name is available
        echo "yes";
    }
}
?>

我尝试添加/\,但未成功。


您也可以使用javascript来做到这一点,代码将是:

<!-- Check special characters in username start -->
<script language="javascript" type="text/javascript">
function check(e) {
    var keynum
    var keychar
    var numcheck
    // For Internet Explorer
    if (window.event) {
        keynum = e.keyCode;
    }
    // For Netscape/Firefox/Opera
    else if (e.which) {
        keynum = e.which;
    }
    keychar = String.fromCharCode(keynum);
    //List of special characters you want to restrict
    if (keychar == "'" || keychar == "`" || keychar =="!" || keychar =="@" || keychar =="#" || keychar =="$" || keychar =="%" || keychar =="^" || keychar =="&" || keychar =="*" || keychar =="(" || keychar ==")" || keychar =="-" || keychar =="_" || keychar =="+" || keychar =="=" || keychar =="/" || keychar =="~" || keychar =="<" || keychar ==">" || keychar =="," || keychar ==";" || keychar ==":" || keychar =="|" || keychar =="?" || keychar =="{" || keychar =="}" || keychar =="[" || keychar =="]" || keychar =="¬" || keychar =="£" || keychar =='"' || keychar =="\\") {
        return false;
    } else {
        return true;
    }
}
</script>
<!-- Check special characters in username end -->

<!-- in your form -->
    User id : <input type="text" id="txtname" name="txtname" onkeypress="return check(event)"/>

2
杜德(Dude),您已经包含了很多多余的代码,这些代码可能无济于事。你能把它削减到最低限度吗?他在问有关jQuery的问题,我不确定PHP是否相关。
西蒙·伊斯特

@PHP Ferrari:我正在使用javascript代码,您的代码工作正常,如果客户输入特殊字符,如何显示警报弹出消息。诸如“不允许特殊字符”之类的消息。
宝石

1

只是数字:

$('input.time')。keydown(function(e){if(e.keyCode> = 48 && e.keyCode <= 57){return true;} else {return false;}});

或包含“:”的时间

$('input.time')。keydown(function(e){if(e.keyCode> = 48 && e.keyCode <= 58){return true;} else {return false;}});

还包括删除和退格键:

$('input.time')。keydown(function(e){if(((e.keyCode> = 46 && e.keyCode <= 58)|| e.keyCode == 8){return true;} else {return false;}});

不幸的是没有让它在iMAC上工作


1

想要评论亚历克斯对戴尔的回答的评论。不可能的(首先需要多少“ rep”?那不会很快发生..奇怪的系统。)所以作为一个答案:

可以通过在正则表达式定义中添加\ b来添加退格,如下所示:[a-zA-Z0-9 \ b]。或者,您只允许整个拉丁语范围,包括或多或少的任何“非奇异”字符(还可以控制字符,如退格键):^ [\ u0000- \ u024F \ u20AC] + $

在拉丁语之外,只有真正的Unicode字符才有欧元符号(20ac),再加上您可能需要的其他字符。

要同时处理通过复制和粘贴输入的输入,只需将其绑定到“更改”事件并在那里也检查输入-删除它或将其剥离/给出错误消息,例如“不支持的字符”。

if (!regex.test($j(this).val())) {
  alert('your input contained not supported characters');
  $j(this).val('');
  return false;
}

1

限制按键上的特殊字符。这是关键代码的测试页:http : //www.asquare.net/javascript/tests/KeyCode.html

var specialChars = [62,33,36,64,35,37,94,38,42,40,41];

some_element.bind("keypress", function(event) {
// prevent if in array
   if($.inArray(event.which,specialChars) != -1) {
       event.preventDefault();
   }
});

在Angular中,我需要在文本字段中使用正确的货币格式。我的解决方案:

var angularApp = angular.module('Application', []);

...

// new angular directive
angularApp.directive('onlyNum', function() {
    return function( scope, element, attrs) {

        var specialChars = [62,33,36,64,35,37,94,38,42,40,41];

        // prevent these special characters
        element.bind("keypress", function(event) {
            if($.inArray(event.which,specialChars) != -1) {
                prevent( scope, event, attrs)
             }
        });

        var allowableKeys = [8,9,37,39,46,48,49,50,51,52,53,54,55,56
            ,57,96,97,98,99,100,101,102,103,104,105,110,190];

        element.bind("keydown", function(event) {
            if($.inArray(event.which,allowableKeys) == -1) {
                prevent( scope, event, attrs)
            }
        });
    };
})

// scope.$apply makes angular aware of your changes
function prevent( scope, event, attrs) {
    scope.$apply(function(){
        scope.$eval(attrs.onlyNum);
        event.preventDefault();
    });
    event.preventDefault();
}

在html中添加指令

<input only-num type="text" maxlength="10" id="amount" placeholder="$XXXX.XX"
   autocomplete="off" ng-model="vm.amount" ng-change="vm.updateRequest()">

在相应的角度控制器中,我只允许只有一个句点,将文本转换为数字,并在“模糊”上添加数字舍入

...

this.updateRequest = function() {
    amount = $scope.amount;
    if (amount != undefined) {
        document.getElementById('spcf').onkeypress = function (e) {
        // only allow one period in currency
        if (e.keyCode === 46 && this.value.split('.').length === 2) {
            return false;
        }
    }
    // Remove "." When Last Character and round the number on blur
    $("#amount").on("blur", function() {
      if (this.value.charAt(this.value.length-1) == ".") {
          this.value.replace(".","");
          $("#amount").val(this.value);
      }
      var num = parseFloat(this.value);
      // check for 'NaN' if its safe continue
      if (!isNaN(num)) {
        var num = (Math.round(parseFloat(this.value) * 100) / 100).toFixed(2);
        $("#amount").val(num);
      }
    });
    this.data.amountRequested = Math.round(parseFloat(amount) * 100) / 100;
}

...

1

要替换特殊字符,请空格并转换为小写

$(document).ready(function (){
  $(document).on("keyup", "#Id", function () {
  $("#Id").val($("#Id").val().replace(/[^a-z0-9\s]/gi, '').replace(/[_\s]/g, '').toLowerCase());
 }); 
});

0
[User below code to restrict special character also    

$(h.txtAmount).keydown(function (event) {
        if (event.shiftKey) {
            event.preventDefault();
        }
        if (event.keyCode == 46 || event.keyCode == 8) {
        }
        else {
            if (event.keyCode < 95) {
                if (event.keyCode < 48 || event.keyCode > 57) {
                    event.preventDefault();
                }
            }
            else {
                if (event.keyCode < 96 || event.keyCode > 105) {
                    event.preventDefault();
                }
            }
        }


    });]

4
如果没有解释,纯代码答案不太有用。
Vemonus

0

在文本框中仅允许数字(限制字母和特殊字符)

        /*code: 48-57 Numbers
          8  - Backspace,
          35 - home key, 36 - End key
          37-40: Arrow keys, 46 - Delete key*/
        function restrictAlphabets(e){
            var x=e.which||e.keycode;
            if((x>=48 && x<=57) || x==8 ||
                (x>=35 && x<=40)|| x==46)
                return true;
            else
                return false;
        }

0
/**
     * Forbids special characters and decimals
     * Allows numbers only
     * */
    const numbersOnly = (evt) => {

        let charCode = (evt.which) ? evt.which : evt.keyCode;
        if (charCode === 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
            return false;
        }

        let inputResult = /^[0-9]*$/.test(evt.target.value);
        if (!inputResult) {
            evt.target.value = evt.target.value.replace(/[^a-z0-9\s]/gi, '');
        }

        return true;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.