Javascript 替代字符串替换以防止文本框中出现多个空格

Javascript 替代字符串替换以防止文本框中出现多个空格,javascript,jquery,html,Javascript,Jquery,Html,到目前为止,我一直使用下面的方法来防止文本字段中出现多个空格。除非字母被插入到字符串的中间,否则效果很好。在本演示中,您可以看到,如果单击“a”和“c”之间的光标并键入“b”,它会将新字母添加到字符串末尾,拼写为“acb”而不是“abc”。我希望有人知道字符串替换的替代方法,这可能会解决这个问题。谢谢 $('#tBox').bind('DOMAttrModified textInput input change paste',function(){ var sspace = $(

到目前为止,我一直使用下面的方法来防止文本字段中出现多个空格。除非字母被插入到字符串的中间,否则效果很好。在本演示中,您可以看到,如果单击“a”和“c”之间的光标并键入“b”,它会将新字母添加到字符串末尾,拼写为“acb”而不是“abc”。我希望有人知道字符串替换的替代方法,这可能会解决这个问题。谢谢

   $('#tBox').bind('DOMAttrModified textInput input change paste',function(){
     var sspace = $(this).val().replace(/ +/g, ' ');
       $(this).val(sspace);
  });

<input type = "text" id = "tBox" />
$('#tBox').bind('DOMAttrModified textInput change paste',function(){
var sspace=$(this.val().replace(/+/g',);
$(this).val(sspace);
});

问题是因为您使用更改事件更新值,而更改事件发生在内容更新之前,因此通过将输入值重置为其最新值“ac”,光标将自身定位在文本末尾,然后捕获“b”,从而获得“acb”

我更新了JSFIDLE以使用keyup事件而不是change事件,并在更新输入内容之前验证文本是否已更改

$('#tBox').bind('DOMAttrModified textInput input keyup paste',function(){
 var sspace = $(this).val().replace(/ +/g, ' ');
    if ($(this).val() != sspace)
        $(this).val(sspace);
  });

发生的情况是,在将“b”插入文本字段之前,您的事件正在捕获更改。i、 e.以abc/acb为例,您可以看到事件的顺序:

1) 用户按“b”

2) 事件处理程序运行时,输入的值仍为“ac”

3) 处理程序将输入值设置为“ac”,将光标移动到输入的末尾

4) 浏览器在光标位置插入“b”字符,该位置现在位于字段的末尾

我唯一能想到做的就是只在需要时做(3),即:

$('#tBox').bind('DOMAttrModified textInput input change paste',function(){
 var sspace = this.value.replace(/ +/g, ' ');
    if (this.value !== sspace) {
        this.value = sspace;
    }
  });
当输入多个空格时,这仍然会将光标移到末尾,但这是一个改进


此外,我还避免了对$(this.val())不必要地使用jQuery。

您的小提琴演示对我来说很好(Firefox 23.0.1)。非常感谢您的回答+1