首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许在正则表达式中使用箭头键

问允许在正则表达式中使用箭头键
EN

Stack Overflow用户
提问于 2015-02-13 20:54:42
回答 3查看 6.4K关注 0票数 3

我正在执行字母数字验证,现在我正在执行这样的操作:用户只能输入字母数字值,也只允许在粘贴时输入字母数字值。所以我使用了下面的正则表达式

代码语言:javascript
复制
function OnlyAlphaNumeric(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
if ((charCode > 32 && charCode < 48) || (charCode > 57 && charCode < 65) ||    
                    (charCode > 90 && charCode < 97) || charCode > 122) {
    return false;
}
else {
    return true;
   }
}

以及为了防止复制和粘贴,

代码语言:javascript
复制
function CPOnlyAlphaNumeric(evt) {

     $(evt).val($(evt).val().replace(/[^A-Za-z0-9]/g, ' '))

}

这两个函数从下面的onkeypress和onkeyup方法调用,如下所示

代码语言:javascript
复制
   @Html.TextBoxFor(model => model.ProductName, new { @class = "form-  
       control", @onkeypress = "return OnlyAlphaNumeric(this);", @onkeyup=   
        "return CPOnlyAlphaNumeric(this);" })

这适用于字母数字验证,但它不允许光标在编辑文本时向左移动。那么,我应该在正则表达式中做些什么呢?

EN

回答 3

Stack Overflow用户

发布于 2015-02-13 22:07:27

您的问题与正则表达式无关。

当您按任何键(包括向左/向右箭头)时,您将获取输入值,替换所有禁用字符,并设置输入的值。当最后一个操作完成后,浏览器的本机行为就是将光标移动到输入的末尾。

您可以检查什么是按下的键,以及是否为左/右箭头,以跳过对输入值的操作。

代码语言:javascript
复制
function CPOnlyAlphaNumeric(evt) { 
    var code = evt.which ? evt.which : event.keyCode;

    // 37 = left arrow, 39 = right arrow.
    if(code !== 37 && code !== 39)
        $(evt).val($(evt).val().replace(/[^A-Za-z0-9]/g, ' '))
}

Demo

然而,这不是一个好的解决方案,因为它将导致可怕的行为(您将不能使用shift来表示标记,光标将在单词中间第一个键入字母之后移动,等等)。

一个更好的解决方案可能是在用户停止输入后500毫秒‘清理’输入值。

代码语言:javascript
复制
var timeout = null;

function CPOnlyAlphaNumeric(evt) {
    if(timeout)
        clearTimeout(timeout);

    timeout = setTimeout(function(){ 
        $(evt).val($(evt).val().replace(/[^A-Za-z0-9]/g, ' '))
    }, 500);
}

Demo

请注意,您还需要在服务器端添加验证(可能是在表单提交之前,因为用户可以在触发输入的“清理”之前按enter来提交表单)。

票数 3
EN

Stack Overflow用户

发布于 2015-04-18 15:06:42

你可以试试这个,它可能会解决你的问题。

代码语言:javascript
复制
  var regex = new RegExp("^[a-zA-Z0-9]+$");

  var charCode =(typeof event.which == "number") ?event.which:event.keyCode

  var key = String.fromCharCode(charCode);

  if (!(charCode == 8 || charCode == 0)) {

      if (!regex.test(key)) {
            event.preventDefault();
            return false;
        }
    }
票数 2
EN

Stack Overflow用户

发布于 2015-11-04 01:54:31

keyDown事件的问题是您不能抑制文本字段中键的显示(在我的例子中只能显示字母数字)。您只能在keyPress事件中执行此操作。但是你不能在keyPress事件中获得导航键,你只能在KeyDown事件中跟踪它们。并且一些键$,%,具有与箭头键在按键事件中具有相同的e.which。这会导致我编写允许箭头键的逻辑,但将文本限制为Alpha数字。这是我想出来的代码。现在工作得很好。

代码语言:javascript
复制
    onKeyPress: function(e){
            var regex = new RegExp("^[a-zA-Z0-9\b ]+$");
            var str = String.fromCharCode(!e.charCode ? e.which : e.charCode);
            var allowedSpecialKeys = 'ArrowLeftArrowRightArrowUpArrowDownDelete';
            var key = e.key;

            /*IE doesn't fire events for arrow keys, Firefox does*/
            if(allowedSpecialKeys.indexOf(key)>-1){
                return true;
            }

            if (regex.test(str)) {
                return true;
            }

            e.preventDefault();
            e.stopPropagation();
            e.cancelBubble = true;
            return false;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28500118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档