仅允许修改输入框括号中内容

仅允许修改输入框括号中内容

这个 demo 是看了 https://juejin.cn/post/7024106183153680391 这个文章之后做出来的。

基本思路是在 change 事件中,取出输入前、输入后的两个文本,比较他们的括号外的文本是不是相等,相等则允许更改旧值。

后面使用自定义光标位置解决在括号外输入时会显示在最后的问题。

不过经测试,当同时按下两个键时此问题还是会存在。

<template>
  <el-input
    ref="ipt"
    :value="inputValue"
    @input="inputValueFn"
  />
</template>
<script>
export default {
  data() {
    return {
      inputValue: `今日信息: 娱乐新闻(XX)条, 体育新闻(XX)条`,
    }
  },
  methods: {
    // 设置焦点
    setFocus (textbox, index) {
      if (textbox.createTextRange) {
        var r = textbox.createTextRange();
        r.collapse(true);
        r.moveStart('character', index);
        r.select()
      } else if (textbox.setSelectionRange) {
        textbox.focus();
        textbox.setSelectionRange(index, index);
      }
    },
    // 找到索引
    findIndex (newVal, oldVal) {
      let newValArr = newVal.split('')
      let oldValArr = oldVal.split('')
      for (let i = 1; i <= newVal.length; i++) {
        let newItem = newValArr.slice(0, i)
        let oldItem = oldValArr.slice(0, i)
        if (JSON.stringify(newItem) !== JSON.stringify(oldItem)) {
          return i
        }
      }
      return newVal.length
    },
    // input 值变更的回调
    inputValueFn(inputVal = ``) {
      let val = this.inputValue
      // inputVal 用户输入的内容
      // val 目前页面显示的内容(输入之前的内容)
      let reg = /\([\w\W]*?\)|([\w\W]*?)/g // 兼容中英文两种括号
      let input = inputVal.replace(reg, '') // 去掉现在在输入的内容括号里边的空格
      let value = val && val.replace(reg, '') // 去掉括号里边原来的内容的空格
      if (input === value) { // 比对去掉空格内容后,是否一致,如果是一致的话,则说明没有修改空格以外的内容,则让用户修改
        this.inputValue = inputVal // 数据更新成用户输入的内容
      } else {
        // 如果用户没有在小括号内输入的时候,比对字符串,并设置焦点的主逻辑
        let index = this.findIndex(inputVal, val)
        let dom = this.$refs.ipt.$el.querySelector(`input`)
        if (dom && (index || index === 0)) {
          // 由于
          setTimeout(() => {
            this.setFocus(dom, index - 1)
          }, 10)
        }
      }
    },
  },
}
</script>
posted @ 2021-10-29 17:37  程序媛李李李李蕾  阅读(100)  评论(0编辑  收藏  举报