【问题标题】:How to give space in between number in input just for displaying?如何在输入中的数字之间留出空格仅用于显示?
【发布时间】:2021-09-16 15:34:32
【问题描述】:

我想在数字之间留出空格,以便像这样显示

我用过

phone.addEventListener("keyup", function(){
  txt=this.value;
  if (txt.length==3 || txt.length==7)
    this.value=this.value+" "; 
});

但此代码仅适用于输入类型文本,问题是输入的长度不考虑为 10。

.

有没有什么办法,用空格显示,长度必须是10,并且有类型号,在后台保存不带空格?

【问题讨论】:

  • 不要使用type="number",而是使用type="pattern",仅将输入限制为数字并确保通过正则表达式存在空格。您的代码仍然可以放入空格并且约束将通过。
  • 你应该使用像 imask.js.org 这样的 maskjs 库来快速解决问题。或者你可以试试stackoverflow.com/questions/40513950/…
  • 只是为了澄清-您希望自动输入空格,但是如果例如用户退格删除一些数字或将光标定位在字符串的一部分,它们是否会被忽略?您正在向实际字符串添加空格,这意味着尽管他们没有键入它们,但当他们想要删除内容时必须知道它们。这会很混乱吗?让它们可见但不在它们正在编辑的字符串中会更好吗?
  • 您能否提供您的 html/css/js 的工作 sn-p 以便我们帮助您修改它?
  • @AHaworth,我确实需要用户进行退格,以防万一他在某个地方弄错了。好吧,与其在字符串中添加,我们如何在数字之间直观地添加空格?

标签: javascript html css frontend


【解决方案1】:

使用pattern 输入类型和简单正则表达式的示例解决方案可确保只有数字、正确的间距,并且只向服务器提交不带空格的数字。

如果用户自己输入空格,您的代码确实会出错,因此 JavaScript 已得到增强以确保格式正确。

  1. 通过阻止默认行为(忽略击键)来忽略空格输入和任何超过 12 个字符的输入:

if ((txt.length == 12 || e.which == 32) & e.which !== 8) e.preventDefault();

(字面意思是“如果 12 个字符或按键是空格键且键不是退格键”则忽略按键)

  1. 自动添加空格(就像您的代码一样): if ((txt.length == 3 || txt.length == 7) && e.which !== 8)...

注意:在这两种情况下,如果按下退格键,则允许该键工作(键码 8)。

  1. 提交表单后,删除“电话”输入中的所有空格,以便服务器只接收数字。

document.getElementById("phone").addEventListener("keydown", function(e) {
  const txt = this.value;
  // prevent more than 12 characters, ignore the spacebar, allow the backspace
  if ((txt.length == 12 || e.which == 32) & e.which !== 8) e.preventDefault();
  // add spaces after 3 & 7 characters, allow the backspace
  if ((txt.length == 3 || txt.length == 7) && e.which !== 8)
    this.value = this.value + " ";
});
// when the form is submitted, remove the spaces
document.forms[0].addEventListener("submit", e => {
  e.preventDefault();
  const phone = e.target.elements["phone"];
  phone.value = phone.value.replaceAll(" ", "");
  console.log(phone.value);
  //e.submit();
});
<form>
  <input id="phone" name="phone" type="pattern" placeholder="### ### ####" pattern="[\d]{3} [\d]{3} [\d]{4}">
  <input type="submit">
</form>

【讨论】:

    【解决方案2】:

    您可以在将字符串提交到后端之前进行字符串替换:

    number_str = this.value.replace(" ","");
    let number_number = parseInt(number_str);
    //backend request stuff
    

    您还可以使用隐藏的输入来存储未加空格的字符串,并使用可见的输入来存储已加空格的字符串,然后同时更新它们吗?你只会提交隐藏的。

    <input id="phonenumber" type="text" />
    <input id="secret-phonenumber" type="hidden" />
    

    【讨论】:

      【解决方案3】:

      确切地决定用户界面应该是什么有点棘手。虽然他们可以看到他们无法删除的空格,但如果允许正常的浏览器编辑,他们将能够做到。

      我们还想忽略非数字输入,并且不允许总位数超过 10。

      这个 sn-p 通过将输入作为普通文本类型而不是数字来执行这些操作,并测试每个键输入以查看是否应该包含它,并在每次需要时使用插入的空格重写值。

      const phone = document.querySelector('.phone');
      phone.addEventListener("keyup", function(e) {
        let txt = this.value.replace(/\D/g, '');
        let newtxt = '';
        //now copy the number inserting a space where needed
        for (let i = 0; i < Math.min(txt.length, 10); i++) {
          newtxt += txt[i];
          if ((i == 2) || (i == 5)) {
            newtxt += ' ';
          }
        }
        if (newtxt[newtxt.length - 1] == ' ') newtxt = newtxt.substring(0, newtxt.length - 1);
        this.value = newtxt;
      });
      &lt;input class="phone"&gt;

      需要进一步考虑对用户界面进行一些改进是否是个好主意。例如:

      • 重新定位光标(此时光标移到末尾 每次输入后的字符串,如果他们是用户可能不会期望的 编辑部分数字)
      • 这可能是一个关于是否最好显示的争论点 简单地说一个非法的字符,以使用户放心 他们确实按下了一个键,或者该角色是否应该 从不显示。

      在将值提交给后端之前,记得去掉空格:

      phone.value.replace(/\D/g, '');
      

      【讨论】:

      • 感谢您的回答,但在退格时,空间不断增加
      • 你的意思是如果用户试图退格两个空格之一?
      • 是的,在空格处,单击退格键不起作用
      • 我已将 sn-p 更改为仅在需要时添加空格。您可能仍然需要考虑您希望光标移动时界面的外观。
      • 完美!非常感谢您的时间和支持
      猜你喜欢
      • 2019-11-28
      • 2016-04-22
      • 2011-06-23
      • 1970-01-01
      • 2023-03-29
      • 2021-09-06
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多