【问题标题】:limit number of repeated characters with jQuery but leave period alone使用 jQuery 限制重复字符的数量,但不考虑句点
【发布时间】:2017-07-03 07:34:54
【问题描述】:

我正在使用此代码来避免用户连续重复一个字符超过 3 次(“bbb”、“ddd”左右......):

$('.limitRepeaters').keypress(function(){
  if (/(.)\1{2,}/.test($(this).val())) {
   return false;
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters">

现在我希望用户能够将“句号”字符重复三次(...)所以我尝试了:

$('.limitRepeaters').keypress(function(e){
   var code = e.keyCode || e.which;
  if ((/(.)\1{2,}/.test($(this).val())) && (code != '190')) {
   return false;
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters">

但这似乎不起作用。有什么想法吗?

编辑

我现在遇到了问题。实际上,当用户在写“...”后输入字母时,他没有输入 190 键码,因此需要将 190 键码添加到正则表达式本身。知道怎么做吗?

【问题讨论】:

  • 您的点是包括点在内的任何字符。如果您需要使用点本身,请转义它

标签: jquery input limit


【解决方案1】:

使用您提到的相同块,但有以下更改。

$('.limitRepeaters').keypress(function(){
var str = $(this).val();
  if (/(.)\1{2,}/.test(str.replace(/[...]/g,''))) {
   return false;
  }
});

在上面的代码中,我已经替换了字符串中所有出现的 (...)。如果您不希望所有情况出现,请使用if (/(.)\1{2,}/.test(str.replace('...',''))) {

【讨论】:

  • 太好了,谢谢。但这里的问题是它会让用户重复这个时期六次,我确实想把它限制在三个,让他继续写后记……所以如果他写“bbb”,他就不会再写了,但是如果他写“...”,它将让他继续写任何其他字母(不是句号),当然他可以在文本中写另一个句号,只是不能在三个句号之后。
  • 第一个解决方案将让用户无限期写入。第二个让他写六。然后如果他再写一个句号,他就只写两个。
【解决方案2】:

现在如果得到的是:

$('.limitRepeaters').keypress(function(){
var str = $(this).val();
  if (/(.)\1{2,}/.test(str.replace(/[...]/g,'')) || /(.)\1{3,}/.test($(this).val())) {
   return false;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters"/>

这似乎有点长,也会让用户写 4 次周期(但这还不错......)。欢迎任何较短的想法。

【讨论】:

    【解决方案3】:

    测试任何字符是否重复 3 次或更多,除了 ./([^.])\1{3,}/ 可以使用。但是在当前的实现中,一旦达到匹配,就不允许使用退格或其他字符。

    另一种方法是在 keyup 中重置为旧值,尽管这有点“生涩”(更简化的解决方案是使用光标位置和按下的键生成预期值,但从功能上讲,下面更容易)

    var oldValue;
    $('.limitRepeaters').keypress(function(e){
    	oldValue=  {val : this.value, pos : this.selectionStart }; //strictly speaking selectionEnd should be kept as well
    }).keyup(function(e){
    	if (/([^.])\1{3,}/.test(this.value)) {
      	this.value = oldValue.val;
        this.selectionStart = oldValue.pos;
      }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input class="limitRepeaters">

    再一次,一旦输入三个重复字符,可能阻止所有其他输入是目标,这根本不需要:)。在这种情况下,/([^.])\1{3,}/ 可以直接在现有代码中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-15
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多