【问题标题】:input field: limit the number of letters and numbers typed输入字段:限制输入的字母和数字的数量
【发布时间】:2015-09-04 14:34:23
【问题描述】:

有没有办法限制允许在输入字段中输入的字母和数字的数量?我只允许输入 3 个字母和 2 个数字,无论顺序如何。

这可以使用jQuery Mask Plugin 吗?还是不行?

在这里查看我的 jsFiddle:http://jsfiddle.net/0akoL2x2/

html:

<input type="text" class="preview" size="30" placeholder="Preview text" class="text-input" maxlength="5" autofocus />

jquery:

jQuery('.personalisation').mask("XXXZZ", {
        translation: {
            'X': {pattern: /[A-Za-z0-9]/},
            'Z': {pattern: /[A-Za-z0-9]/},
    }

【问题讨论】:

  • 我不熟悉这个插件,但似乎你需要一个只匹配由 3 个字母和 2 个数字组成的五个字符组合的正则表达式。
  • 哦,我明白了!你能指出一个有类似例子的方向吗?
  • 您可以尝试在 Google 上搜索,但我不知道您是否会找到任何有用的东西(似乎是一个非常小众的需求)。我一直在想我会怎么做,但我真的想不出比明确涵盖各种排列更好的解决方案:/[a-zA-Z]{3}\d{2}|[a-zA-Z]{2}\d{2}[a-zA-Z]|.../

标签: javascript jquery forms


【解决方案1】:

使用数据属性怎么样?我们就叫它data-temp

<input type="text" class="alnum" maxlength="5" data-temp="">

使用$(document).on('input'... 监控所有更改(甚至是动态元素),如果新值超过最大值,则立即恢复。否则,让它发生,并将data-temp 更新为这个新值。

$(document).on('input', '.alnum', function(){
    var txt = $(this).val();
    if(
        txt.replace(/[^0-9]/g,"").length > 2 ||
        txt.replace(/[^A-Za-z]/g,"").length > 3 ||
        txt.replace(/[a-zA-Z0-9]/g,"").length != 0
      ){
        $(this).val( $(this).data('temp') );
        return;
    }
    $(this).data('temp', txt);
});

JSFiddle demo

【讨论】:

  • 小提琴允许我输入任意数量的特殊字符。我可能是错的,但是从帖子的示例代码中我了解到应该只允许使用字母数字字符。否则,这是一个优雅的解决方案。
  • @igorshmigor 你可能是对的,所以我相应地更新了 if 语句。
  • 顺便说一句,使用类和数据属性意味着您可以在无限量的输入上使用它;所有其他答案每页只能使用一次,因为它们使用全局变量或 ID。
  • 太棒了!超级简单!喜欢它!
【解决方案2】:

这是一个有效的小提琴: http://jsfiddle.net/igorshmigor/k2ss62gg/3/

JS 代码如下所示:

var numberCountLimit = 2;
var letterCountLimit = 3;
$(document).ready(function() {
 $('.preview').keypress(function(key) {
     if (key.charCode == 0){
         return true; 
     }
     var current = $(this).val();
     var filtered = current.replace(/[^a-z0-9]/gmi,'');
     $(this).val(filtered);
     var digits = filtered.replace(/[^0-9]/gmi,'');
     var alpha = filtered.replace(/[^a-z]/gmi,'');
     var digitCount = digits.length;
     var alphaCount = alpha.length;
     var isNumber = false;
     var isAlpha = false;
     if (key.charCode > 47 && key.charCode < 58){
         isNumber = true;
         if (digitCount >= numberCountLimit){
            return false; // too many digits
         }
     }
     if (key.charCode > 64 && key.charCode < 123){
         isAlpha = true;
         if (alphaCount >= letterCountLimit){
            return false; // too many letters
         }
     }
     if (!isAlpha && !isNumber){
         return false; 
     }
 });
});

P.S.:我认为这不能仅使用 jQuery Mask 插件来完成。

【讨论】:

  • .keypress() 可能不可靠。例如,尝试输入11AAA,然后选择文本并尝试将其更改为A
【解决方案3】:

给你的文本框一个 ID。

$("#box").mask('XXXZZ', {'translation': {
         X: {pattern: /[A-Za-z0-9]/}, 
         Z: {pattern: /[A-Za-z0-9]/}                                       
     }
});

JSFiddle

【讨论】:

  • xenerr 希望它适用于任何订单,而不是前 3 个字母和后两个数字。
  • 标准似乎是五个,三个字母和两个数字的长度按任意顺序,所以NNLLL同样有效(其中N表示一个数字0-9和L 是一个字母)。
  • 这只有在我输入 3 个字母后跟 2 个数字时才有效,但 OP 指定他希望它以任何顺序匹配。
【解决方案4】:

这样怎么样,你钩住按键并检查数字/字母计数器,如果超过你将忽略按键(通过返回 false)

var numberCount = 0;
var numberCountLimit = 2;
var letterCount = 0;
var letterCountLimit = 3;
$(document).ready(function() {
 $('.personalisation').keypress(function(key) {
        var currentText = $(this).val();
        numberCount = 0;
        letterCount = 0;
        for (var i = 0, len = currentText.length; i < len; i++) {
          if(currentText.charCodeAt(i) < 48 || currentText.charCodeAt(i) > 57) {
            //Is number
            if((numberCount+1) > numberCountLimit) {
              return false;
            }
            numberCount++;
          } else {
            //Is letter
            if((letterCount+1) > letterCountLimit) {
              return false;
            }
            letterCount++;
          }
        }

     return true;
 });
}

【讨论】:

  • 您的解决方案适用于您在文本框中按下的前 3 个字母键和前 2 个数字键,但是当您清除它时,您将无法再键入任何字母或数字。除此之外,似乎是一个有效的解决方案,体积庞大,但有效
  • 是的,这很可爱,但是一旦我清除了字符,我就无法再次输入了
  • 你说得对,我更改了脚本,所以每次都会看到整个文本
  • 似乎不起作用。当我测试它时发生的事情是它让我输入 4 位数字,然后什么都不起作用了。它还假设任何不是数字的东西都是字母,但事实并非如此,它可以是任何东西。
  • 如果没有其他解决方案,我稍后会再看一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多