js在input/textarea中间插入值

587#33ce7a2c

Vue项目,React项目都有涉及到评论,表情图片等中间插入多了就懒得写了,记录一下不考虑某E浏览器的方法,方便以后cv。

源码使用typescript编写,使用javascript将type去掉就是了

insert.ts

js 复制代码
/**
 * created by zbf at 2019-12-13 10:24:20
 *
 * 设置foucs位置/选中元素
 *
 * @param tarDom 目标元素
 * @param startPos 选中开始位置
 * @param endPos 结束位置
 */
export const setPosition = (
  tarDom: HTMLInputElement | HTMLTextAreaElement,
  startPos: number = 0,
  endPos: number = startPos
): void => {
  if (tarDom.setSelectionRange) {
    // setTimeout必须写,不然setSelectionRange无效
    // https://stackoverflow.com/questions/11723420/chrome-setselectionrange-not-work-in-oninput-handler
    setTimeout(() => {
      tarDom.setSelectionRange(startPos, endPos)
      tarDom.focus()
    }, 0)
  } else {
    console.log('无法重置贯标位置')
  }
}

/**
 * created by zbf at 2019-12-13 09:56:23
 *
 * 从focus位置插入元素
 *
 * @param dom 需要插入的input或textarea元素
 * @param tarValue 插入的目标值
 * @param direct 是否直接插入到元素中
 * @returns 插入后的值
 */
export const insert = (
  dom: HTMLInputElement | HTMLTextAreaElement,
  tarValue: string,
  direct: boolean = false
): string => {
  // 返回值
  let res = ''
  if (dom.selectionStart || dom.selectionStart === 0) {
    const startPos = dom.selectionStart
    const endPos = dom.selectionEnd || 0

    // 前半部分值
    const prefixVal = dom.value.substring(0, startPos)
    // 后半部分值
    const suffixVal = dom.value.substring(endPos, dom.value.length)
    res = prefixVal + tarValue + suffixVal

    // 设置光标位置
    setPosition(dom, startPos + tarValue.length)
  } else {
    res += tarValue
  }

  if (direct) {
    dom.value = res
  }

  return res
}

效果

参与本文讨论

请先登录 GitHub 后留言

0/500

本文留言

0

这篇文章还没有留言,来写第一条吧。

1 / 1