Javascript 防止单词之间出现多个空格

Javascript 防止单词之间出现多个空格,javascript,whitespace,detection,keyevent,preventdefault,Javascript,Whitespace,Detection,Keyevent,Preventdefault,我有一个功能,防止人们把数字或任何符号,但字母的键盘输入到文本框中,由于数据输入的持续问题 <td><input type="text" name="name" onkeypress="return isAlfa(event)"></td> 现在,一些工作人员出于未知原因,在单词之间随机放置两个空格。所以我需要防止他们在单词之间留出一个以上的空格。我想在相同的函数中执行此操作,但它不断中断 fu

我有一个功能,防止人们把数字或任何符号,但字母的键盘输入到文本框中,由于数据输入的持续问题

<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;
}
函数isAlfa(evt){
evt=(evt | | window.event);
var charCode=(evt.which | | evt.keyCode);
如果((字符代码>32)
&&(字符编码<65 | |字符编码>90)
&&(字符编码<97 | |字符编码>122)
) {
返回false;
}
返回true;
}

如何防止他们在单词之间输入一个以上的空格?

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

例如:

<input type=text id=myfield />

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

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

函数检查(事件){
if(event.target.value.substr(-1)==''&&event.code==='Space'){
log(“按顺序按下空格”);
}
}

忽略所有其他有用的建议和评论,严格遵守OP的要求,必须

  • 调整返回条件的方式应考虑当前击键是否将创建空白序列
  • 因此,必须实现一种方法来准确地确定这一点
  • 也可能有一些可能的助手方法
  • 代码示例
  • 函数为空格(char){
    返回(/\s/).test(字符);
    }
    函数willCreateWhitespaceSequence(evt){
    var willCreateWSS=false;
    if(isWhiteSpace(evt.key)){
    var elmInput=evt.currentTarget;
    var内容=elmInput.value;
    var posStart=elmInput.selectionStart;
    var posEnd=elmInput.selectionEnd;
    willCreateWSS=(
    isWhiteSpace(内容[posStart-1]| |“”)
    ||isWhiteSpace(内容[posEnd]| |“”)
    );
    }
    返回willCreateWSS;
    }
    函数isAlfa(evt){
    evt=(evt | | window.event);
    var charCode=(evt.which | | evt.keyCode);
    返回((
    (字符编码>32)
    &&(字符编码<65 | |字符编码>90)
    &&(字符编码<97 | |字符编码>122)
    )| | willCreateWhitespaceSequence(evt))?false:true;
    }

    是的,我明白了,但是在输入表单和提交表单之间,甚至在完成文本框之间,会发生很多其他事情。因此,除非我想更改一系列内容,否则(对我来说)在键盘上按OK sure更合理,但如果我通过鼠标将值粘贴到您的字段中呢?你的事件不会触发。粘贴很好,他们获取数据的方式是从一张物理纸上复制,他们无法从中粘贴。此外,我建议以限制模式运行消毒。因此,我们可以限制计算量,并且不会在键入(例如)时“打扰”用户。@PeterSeliger是的,这是一个很好的解决方案。。。。还有一个问题。。。我需要在按键上完成。如果这是一个提交后的清理问题,我不会使用javascript。似乎什么都不做,当我双击SpaceJSFIDLE时没有警报工作正常,也许问题在于我是如何将代码添加到我的函数中的?让我检查一下是否可以将我的代码放入您的函数中并使其正常工作。检查一下这里,我们不仅要检查双空格,而且还要更正它,以便如果用户是数据输入者,那么输入字段本身应该省略额外的空格。我做的另一个更改是将
    evt
    声明为函数范围内的局部变量,而不是像在代码段中定义的那样将其定义为全局变量。@PeterSeliger我明白你的意思。但是对于我的特定问题,用户只需要输入从一张纸上复制的名字和姓氏,没有复制/粘贴或类似的内容,也没有理由使用其他空格
    document.querySelector('#myfield').addEventListener('input', evt => {
        evt.target.value = evt.target.value.replace(/[^a-z\s]/ig, '').replace(/\s{2,}/g, ' ');
    });