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


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

    这个 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 = /([wW]*?)|([wW]*?)/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>
    
  • 相关阅读:
    长连接网关技术专题(八):B站基于微服务的API网关从0到1的演进之路
    社交软件红包技术解密(十二):解密抖音春节红包背后的技术设计与实践
    dubbo的消费者是怎么获取提供者服务接口引用的?
    新版本MybatisPlus分页插件失效 一年
    《穷爸爸和富爸爸》&《思考致富》读后感
    windows下搭建MQTT服务器
    如何使用curl POST方式上传文件
    Python flask实现文件接收保存
    使用Python Flask获取curl传来的JSON数据
    Vue实现顶部栏和侧边栏不变
  • 原文地址:https://www.cnblogs.com/daysme/p/15481561.html
Copyright © 2020-2023  润新知