【问题标题】:Prevent more than one space between words防止单词之间出现多个空格
【发布时间】:2020-12-27 17:34:57
【问题描述】:

我有一个功能可以防止人们由于数据输入的持续问题而将数字或任何符号而不是字母 onkeypress 放入文本框中。

<td><input type="text" name="name" onkeypress="return isAlfa(event)"></td>

现在一些工作人员出于未知原因在单词之间随机放置了两个空格。所以我需要防止他们在单词之间放置多个空格。我想在同一个函数中执行此操作,但它一直在中断。

function isAlfa(evt) {
  evt = (evt || window.event);
  var charCode = (evt.which || evt.keyCode);

  if ((charCode > 32)
    && (charCode < 65 || charCode > 90)
    && (charCode < 97 || charCode > 122)
  ) {
    return false;
  }
  return true;
}

如何防止他们在单词之间输入多个空格?

【问题讨论】:

    标签: javascript whitespace detection keyevent preventdefault


    【解决方案1】:

    此代码将阻止多个空格,即它只允许 1 个空格,并且将阻止两个或多个空格。您可以配置要拒绝的空白数量。

        
            
    

    【讨论】:

      【解决方案2】:

      忽略所有其他有用的建议和 cmets,并严格遵循 OP 的要求...

      1. 调整返回条件,考虑到当前击键是否将创建空白序列。
      2. 因此必须实现一种方法来准确确定这一点。
      3. 可能还有一些可能的辅助方法。
      4. 代码示例...

      function isWhiteSpace(char) {
        return (/\s/).test(char);
      }
      function willCreateWhitespaceSequence(evt) {
        var willCreateWSS = false;
        if (isWhiteSpace(evt.key)) {
        
          var elmInput = evt.currentTarget;
          var content = elmInput.value;
      
          var posStart = elmInput.selectionStart;
          var posEnd = elmInput.selectionEnd;
      
          willCreateWSS = (
               isWhiteSpace(content[posStart - 1] || '')
            || isWhiteSpace(content[posEnd] || '')
          );
        }
        return willCreateWSS;
      }
      
      function isAlfa(evt) {
      
        evt = (evt || window.event);
        var charCode = (evt.which || evt.keyCode);
      
        return ((
             (charCode > 32)
          && (charCode < 65 || charCode > 90)
          && (charCode < 97 || charCode > 122)
      
        ) || willCreateWhitespaceSequence(evt)) ? false : true;
      }
      &lt;input type="text" name="name" onkeypress="return isAlfa(event)"/&gt;

      【讨论】:

        【解决方案3】:

        可能会尝试使用这样的东西。在您的 keypress 事件中尝试使用 string substr 方法检查最后一个值,如果这给了您一个空格并且当前代码也是一个空格,那么阻止或执行您想要对输入执行的任何操作。

        function checkstuff(event){
          if (event.target.value.substr(-1) === ' ' && event.code === 'Space') {
            console.log('space pressed in sequence');
          }
        }
        &lt;input type='text' onkeypress="checkstuff(event)"&gt;

        【讨论】:

        • 似乎什么也没做,当我加倍空格时没有警报
        • jsfiddle 运行良好,也许问题是我如何将代码添加到我的函数中?
        • 让我检查一下我的代码是否适合您的代码并使其正常工作。
        • 检查这个jsfiddle.net/Lrs1cjyw 在这里我们不仅检查双倍空格,还纠正它,如果用户是数据输入人员,那么输入字段应该省略额外的空格本身。我所做的另一项更改是将 evt 声明为函数范围内的局部变量,而不是像在代码 sn-p 中定义的那样将其定义为全局变量。
        • @PeterSeliger 我明白你的意思。但是对于我的具体问题,用户只需要输入从一张纸上复制的名字和姓氏,没有复制/粘贴或类似的东西,也没有理由做其他空格
        【解决方案4】:

        与其监听和评估每个按键,不如对任何和所有输入做出反应,然后清理通过 RegExp 输入的任何内容。

        例子:

        <input type=text id=myfield />
        

        JS:

        document.querySelector('#myfield').addEventListener('input', evt => {
            evt.target.value = evt.target.value.replace(/[^a-z\s]/ig, '').replace(/\s{2,}/g, ' ');
        });
        

        首先将所有非字母和空格替换为空,然后将 2 个或更多空格的序列替换为单个空格。

        【讨论】:

        • 是的,我明白了,但是在输入和提交表单甚至完成文本框之间会发生很多其他事情。所以除非我想改变一堆东西,否则(对我来说)在按键上做更有意义
        • 好的,但是如果我通过鼠标将值粘贴到您的字段中怎么办?你的事件不会触发。
        • 粘贴没问题,他们获取数据的方式是从物理纸上复制,他们无法从那里粘贴
        • 此外,我建议以 节流 模式运行清理。因此,一个限制计算量并且不会“惹恼”用户,例如打字。
        • @PeterSeliger 是的,这是一个很好的解决方案......对于另一个问题......我需要在按键上完成。如果是提交后的消毒问题,我不会使用 javascript。
        猜你喜欢
        • 2022-03-10
        • 2011-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        相关资源
        最近更新 更多