【问题标题】:Plain Javascript way to add a space on the fly after every 5th digit in input field在输入字段中的每 5 位数字后动态添加一个空格的普通 Javascript 方法
【发布时间】:2015-03-28 01:43:28
【问题描述】:

如何在输入字段中的每 5 个数字(如用户键入)后添加一个空格?

12345 56789 12345 56789

限制是我不能使用像 jQuery 这样的任何框架。这必须使用纯 Javascript 或 CSS 来完成。

我还需要支持按退格键并更正数字或将光标放在任何位置并开始使用退格键进行更正的功能。

以下代码基于此处的答案: How to insert space every 4 characters for IBAN registering?

退格不能可靠地工作。

function space(str, after) {
  if (!str) {
    return false;
  }
  after = after || 4;
  var v = str.replace(/[^\dA-Z]/g, ''),
    reg = new RegExp(".{" + after + "}", "g");
  return v.replace(reg, function(a) {
    return a + ' ';
  });
}

var el = document.getElementById('pin');
el.addEventListener('keyup', function() {
  this.value = space(this.value, 4);
});
<form>
  <input autocapitalize="off" autocorrect="off" maxlength=20 type="text" placeholder="type the pin" id="pin" name="pin" />
  <script>
  </script>
</form>

【问题讨论】:

  • 在每次击键后保持字母计数
  • 如果用户输入 1234567890 并且它自动间隔到 12345 67890 并且用户返回并通过在第一个分组的末尾添加另一个 6 来编辑该数字,如果它更正为 12345 6 67890 或 12345 66789 0?
  • @brdx,如果组已满,则不应允许添加另一个数字。我认为从最终用户的角度来看,这将是最直观(或最不容易混淆)的行为。
  • 听起来像有多个输入框,每个输入框只有 5 位验证更符合您的要求。输入所有字段后,您可以将它们组合成一个字符串
  • @brdx,您建议的解决方案绝对比在一个输入字段中操作文本更灵活可靠。我会写这个版本并测试一下。

标签: javascript html css regex


【解决方案1】:

这是一个相对较短的方法:

只需为input 事件(或keyup/keydown)添加一个事件侦听器,然后使用一些正则表达式。

在下面的示例中,最初使用.replace(/\s/g, '') 删除所有空格,然后.replace(/(\d{5})/g, '$1 ') 基本上在每5 个字符后添加一个空格。

删除所有空格的原因是,每 5 个字符之间总是有一个空格(即使您返回并编辑以前的字符)。

document.getElementById('target').addEventListener('input', function (e) {
  e.target.value = e.target.value.replace(/\s/g, '').replace(/(\d{5})/g, '$1 ').trim();
});
&lt;input id="target" type="text"/&gt;

似乎上述方法唯一需要注意的是,在编辑以前的字符时插入符号的位置会丢失。

如果您想防止这种情况发生,请通过访问selectionEnd 属性检索插入符号的当前位置,然后在应用正则表达式格式之后设置插入符号的位置。

document.getElementById('target').addEventListener('input', function (e) {
  var target = e.target, position = target.selectionEnd, length = target.value.length;
  
  target.value = target.value.replace(/\s/g, '').replace(/(\d{5})/g, '$1 ').trim();
  target.selectionEnd = position += ((target.value.charAt(position - 1) === ' ' && target.value.charAt(length - 1) === ' ' && length !== target.value.length) ? 1 : 0);
});
&lt;input id="target" type="text"/&gt;

当插入符号之后的字符是空格时,您会注意到存在一个小问题(因为在最初检索插入符号的开始位置时没有考虑空格)。为了解决这个问题,如果后面的字符是空格,则手动增加位置(假设实际添加了空格 - 这是通过比较替换字符前后的长度来确定的)。

【讨论】:

  • 尝试输入 123456,它不会打印 6
  • 另外,在已满的字段中插入数字会在该字段后插入一个额外的空格
  • 当一个人正在输入时,这会将光标从行尾移动到最后一个字符之前。
  • 输入 111112222233333(将正确替换为 11111 22222 33333),然后转到第二组并插入一个数字。这将导致单独的 2 出现在第 2 组和第 3 组之间。
  • 第二个版本非常适合我需要的解决方案。非常感谢答案中的详细解释。
【解决方案2】:

function myFunction() {
    str = document.getElementById('num').value;

    str=str.replace(/\s/g, '');
    if(str.length%5==0){
    
        document.getElementById('num').value+=" ";
    }
}
&lt;input id='num' type="text" onkeyup="myFunction()"&gt;

【讨论】:

  • 输入“12345 12345”然后按退格键。 :(
  • 是的,退格问题:(
猜你喜欢
  • 1970-01-01
  • 2018-11-10
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多