javascript - 触发替换中的正则表达式时光标向后移动,JavaScript

标签 javascript regex keyup

我已将链接附加到 fiddle 以模拟我遇到的问题。

例如: 我输入了 12345 > 将光标指向中间 12|345 > 输入“空格” > 123|45

输入“空格”后光标会向后移动。

问题:如何让它保持在原来的位置?

Here is the link to fiddle

document.querySelector("#removeSpace").onkeyup =  function()
{

    var start = this.selectionStart,
        end = this.selectionEnd;

    this.value = this.value.replace(/\s/g,"");
    this.setSelectionRange(start, end);
};

最佳答案

您需要检查空格是否匹配,并设置偏移量等于匹配长度的选择。然而,为了避免空格输入,您可以使用 input 事件:

$(function(){
  $('#removeSpace').bind('input', function(){
      var start = this.selectionStart,
            end = this.selectionEnd;
      var offset=0;
      this.value = this.value.replace(/\s+/g, function($0) {offset=$0.length; return "";});
      if (offset > 0)
    	   this.setSelectionRange(start-offset, end-offset);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="removeSpace" type="Text" />

replace(/\s+/g, function($0) {offset=$0.length; return "";}) 部分匹配 1 个或多个空格并通过 $0 变量。它的长度分配给 offset 变量,并从当前开始和结束光标位置中减去。 return "" 删除匹配项,找到所有空格。

可以应用相同的逻辑来使用 keyup 修复您的解决方案:

document.querySelector("#removeSpace").onkeyup =  function()
{
    
    var start = this.selectionStart,
        end = this.selectionEnd;
    var offset=0;
    this.value = this.value.replace(/\s+/g, function($0) {offset=$0.length; return "";});
    if (offset > 0)
    	this.setSelectionRange(start-offset, end-offset);
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="removeSpace" type="Text" />

关于javascript - 触发替换中的正则表达式时光标向后移动,JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49170995/

相关文章:

javascript - 如何在同一页面上的 3 个不同文本字段上使用按键功能?

php - Div刷新和滚动条问题

sql - Postgres 正则表达式 ^ 以 $ 结尾

javascript - 莫里斯图不接受我的 json 数据,但接受硬编码的示例数据

javascript - 正则表达式:匹配多个单词的第一个字母

regex - 在分隔符上从字符串末尾拆分固定次数

jquery - 防止 Jquery 中第二次发生 Keyup 事件

javascript - 在 Java 脚本验证中使用 keyup 进行验证在 mozilla 中不起作用

java - 使用单选按钮上的 onclick 函数生成动态表

javascript - 如何将数据存储在数组(JavaScript)的 promise 中?