javascript HTML输入:检查用户输入是发生在现有值之前还是之后

pxiryf3j  于 2023-03-06  发布在  Java
关注(0)|答案(2)|浏览(120)

我需要处理基本用户来处理大多数边缘情况。
我有一个输入,输入后将解析该值。
现在,当用户在输入开始时移动光标并添加一些字符时,我遇到了一些问题。
我想达到的目标是:
1.确定输入发生在现有值之前还是之后
1.基于此剥离字符:如果在前面,则去掉下一个字符,否则去掉第一个字符
代码可能如下所示:

const myInput = document.querySelector("[my-input]");
const myInputMaxlen = 2;

myInput.addEventListener("input", () => {
  const val = myInput.value;
  const wasBefore = val.selectionStart < val.length;
  if (val.length > myInputMaxlen) {
    myInput.value = wasBefore 
    ? myInput.value.slice(0, myInputMaxlen - 1) 
    : myInput.value.slice(1)
  }

});
<input my-input type="text" maxlength="3" value="" />

目标是假设输入的maxLength为2,具有输入字符和一个现有字符

owfi6suc

owfi6suc1#

这听起来像是您在尝试处理边缘情况,即用户可以在已经具有某个预先存在的值的输入字段中输入字符,并且您希望确保输入值不超过特定长度。
您提供的代码似乎是实现这一目标的良好起点。但是,您可能需要考虑以下几点:
这个.selectionStart应该是myInput.selectionStart。你需要通过变量名引用输入元素,而不是这个。
通过检查selectionStart是否小于或等于预先存在的值的长度,可以简化wasBefore检查。
下面是代码的更新版本:

myInput.addEventListener("input", () => {
    const wasBefore = myInput.selectionStart <= myInput.value.length;
    if (myInput.value.length > myInputMaxlen) {
        myInput.value = wasBefore
            ? myInput.value.slice(0, myInputMaxlen)
            : myInput.value.slice(1);
    }
});

在这个更新的版本中,我们使用myInput.selectionStart来确定光标是在预先存在的值之前还是之后。如果是之前,wasBefore为true,则我们去掉下一个字符。否则,我们去掉第一个字符。
此外,我们使用myInputMaxlen代替硬编码值“2”,以防您以后想要更改最大长度。

e5nqia27

e5nqia272#

好的,基本上我写的代码已经很好了。我在编辑字符串后添加了一些逻辑来处理插入符号的位置,使输入更直接。
谢谢Mudasir的建议。
下面是通用Javascript的最终代码:

const myInput = document.querySelector("[my-input]");
const myInputMaxlen = 2;

myInput.addEventListener("input", () => {
  const val = myInput.value;
  const caretPos = myInput.selectionStart;
  if (val.length > myInputMaxlen) {
    if(caretPos < val.length) {
      myInput.value = val.slice(0, 1) + val.slice(1, myInputMaxlen);
      caretPos < 2 && setCaretPos(myInput, caretPos);
    }
    else {
      myInput.value = val.slice(1, 1 + myInputMaxlen);
    }
  }
});

function setCaretPos(ctrl, pos) {
  if (ctrl.setSelectionRange) {
    ctrl.focus();
    ctrl.setSelectionRange(pos, pos);
  } 
  else if (ctrl.createTextRange) {
    var range = ctrl.createTextRange();
    range.collapse(true);
    range.moveEnd('character', pos);
    range.moveStart('character', pos);
    range.select();
  }
  else {
    console.warn("couldn't set caret position");
  }
}
<input my-input type="text" value="" maxlength="3" />

这是我正在做的Angular 版本:

onHourInput($event: Event): void {
    const t = $event.target as HTMLInputElement;
    if (this.hour.length > this.inputMaxlen) {
      this.hour = t.selectionStart < this.hour.length
        ? this.hour.slice(0, 1) + this.hour.slice(1, this.inputMaxlen)
        : this.hour.slice(1, 1 + this.inputMaxlen);
    }
  }

相关问题