zoukankan      html  css  js  c++  java
  • 仅允许修改输入框括号中内容

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

    这个 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>
    
  • 相关阅读:
    iOS之App Store上架被拒Legal
    iOS之解决崩溃Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.
    iOS之延时执行(睡眠)的几种方法
    iOS之UILabel的自动换行
    iOS之开发中一些相关的路径以及获取路径的方法
    iOS之绘制虚线
    iOS之判断手机号码、邮箱格式是否正确
    iOS之计算上次日期距离现在多久, 如 xx 小时前、xx 分钟前等
    iOS之开发中常用的颜色及其对应的RGB值
    method invocation
  • 原文地址:https://www.cnblogs.com/daysme/p/15481561.html
Copyright © 2011-2022 走看看