Javascript 如何防止光标在修改输入值时移动?

Javascript 如何防止光标在修改输入值时移动?,javascript,jquery,validation,input,Javascript,Jquery,Validation,Input,我正在创建一个数字输入掩码/值对,方法是向用户显示一个文本输入,为其提供几种样式,即用逗号分隔数千,并将要发送到表单的实际值存储在一个隐藏的数字输入中 现在我注意到编辑可见输入的值会将选择索引更新到最后,这在编辑输入时是不直观的,例如。我知道该位置已丢失,因为该值正在被完全重写,但鉴于on.'input'事件处理程序在该值已更改后触发,并且keydown事件在修改发生之前发生,我如何手动跟踪该位置以将其更新回来 $foo.on'change paste input mouseup',函数{ 常

我正在创建一个数字输入掩码/值对,方法是向用户显示一个文本输入,为其提供几种样式,即用逗号分隔数千,并将要发送到表单的实际值存储在一个隐藏的数字输入中

现在我注意到编辑可见输入的值会将选择索引更新到最后,这在编辑输入时是不直观的,例如。我知道该位置已丢失,因为该值正在被完全重写,但鉴于on.'input'事件处理程序在该值已更改后触发,并且keydown事件在修改发生之前发生,我如何手动跟踪该位置以将其更新回来

$foo.on'change paste input mouseup',函数{ 常量验证\u小数=3//允许的小数位数 常量$mask=$'foo' 常量$value=$'baz' 让hasDot=$mask.val.includes'' 设nValue=$mask.val.replace/[a-zA-Z]/g、.replace/[!@$%^&\/+*=?:;\[\]\-\\\\\\\\\\\\\\\\\\\]/g, //只允许一段时间 如果hasDot{ 如果$mask.val.match/\./g.length>1{ 让newVal=$mask.val const lastDot=newVal.lastIndexOf'' newVal=newVal.slice0,lastDot+newVal.slicelastDot+1 $mask.valnewVal } } $value.valparseFloat$mask.val.replace/,/g, //添加基于逗号的分组 让[整数,小数]=$value.val.toString.split'' 如果integers.length>3{ 对于let-iReverse=-3;iReverse>-integers.length;iReverse-=4{ 整数=integers.slice0,iReverse+','+integers.sliceiReverse } } 设fValue=整数 如果hasDot{ F值+='。' } 如果小数!==未定义{ F值+=小数 } $'foo'。价值 } //防止小数位数超过允许和用户输入的逗号。 $foo.在“选择单击向下键”功能上{ 让selStart=e.target.selectionStart; 让selEnd=e.target.selectionEnd; const isComma=e.keyCode==188 const isNumber=e.keyCode>=48&&e.keyCode=96&&e.keyCode selStart 如果是number&&decimallength到达日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期{ e、 防止违约 } } 如果是公共的{ e、 防止违约 } } .输入组{ 利润率:10px; } 此处的用户字段类型 隐藏字段 在完全重写输入字段之前,可以使用输入字段的selectionStart属性确定插入符号的位置

document.querySelector("#my-input").addEventListener("change", function() {
  // Get the position of the caret before you rewrite the input field
  let caretPosition = document.querySelector("#my-input").selectionStart;

  // Rewrite the input field here

  // Put the caret back to where it was
  document.querySelector("#my-input").selectionStart = caretPosition;
});

伟大的我不知道这房子有那么容易拿到。为了扩展这个解决方案,您还可以通过jquery使用$name.selectionStart=value来修改这个值,而不是人们可能错误地期望的$name.selectionStartvalue或$name.prop'selectionStart'值。