textarea setSelectionRange失效

188 阅读1分钟

今天在做markwodn组件,想实现,按下tab键,开头填充2个空格,但是光标会移动到文本末尾,不符合需求
然后了解到selectionStart属性

if (e.code === "Tab") {
    e.preventDefault();
    let num = 0;
    let isTrue = false;
    const map = textVal.value.split("\n").map((item: string) => {
      num += item.length + 1;
      if (num >= textarea.value!.selectionStart && !isTrue) {
        item = "  " + item;
        isTrue = true;
        num = textarea.value!.selectionStart;
      }
      return item;
    })
    textVal.value = map.join("\n");
    textarea.value!.focus();
    setTimeout(()=>{
      textarea.value!.setSelectionRange(num+2,num+2);
    },0)
  }

几个注意点

  • 首先要focus获取焦点
  • 然后使用setSelectionRange设置光标位置,必须添加延时器保证textarea获取焦点,否则会移动失败,主要是这个问题卡了好久