美文网首页
vue 自定义指令限制输入框只能输入两位小数

vue 自定义指令限制输入框只能输入两位小数

作者: 变量只提升声明不提升赋值 | 来源:发表于2022-03-11 10:02 被阅读0次
    /**
     * 限制输入框只能输入n为小数
     */
    export const inputLimt = {
      bind(el, binding) {
        var wins_0 = /[^\d]/g //整数判断
        var wins_1 = /[^\d^\.]/g //小数判断
        var flag = true;
        var points = 0;
        var lengths = 0
        var remainder = 0
        var no_int = 0
        const target = el instanceof HTMLInputElement ? el : el.querySelector("input");
        target.addEventListener("compositionstart", e => {
          flag = false;
        });
        target.addEventListener("compositionend", e => {
          flag = true;
        });
        target.addEventListener("input", e => {
          setTimeout(function () {
            if (flag) {
              if (binding.value == 0) {
                if (wins_0.test(e.target.value)) {
                  e.target.value = e.target.value.replace(wins_0, "");
                  e.target.dispatchEvent(new Event("input")) //手动更新v-model值
                }
              }
              if (binding.value == 1) {
                if (wins_0.test(e.target.value.toString().replace(/\d+\.(\d*)/, '$1'))) {
                  remainder = true
                }
                if ((e.target.value.split('.')).length - 1 > 1) {
                  points = true
                }
                if (e.target.value.toString().split(".")[1] != undefined) {
                  if (e.target.value.toString().split(".")[1].length > 1) {
                    lengths = true
                  }
                }
                if (e.target.value.toString().indexOf(".") != -1) {
                  no_int = false
                } else {
                  no_int = true
                }
                if (wins_1.test(e.target.value) || lengths || points || remainder) {
                  if (!no_int) {
                    e.target.value = e.target.value.replace(wins_1, "").replace('.', '$#$').replace(/\./g, '').replace(
                      '$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').substring(0, e.target.value.indexOf(
                      ".") + 2)
                  } else {
                    e.target.value = e.target.value.replace(wins_0, "")
                  }
                  e.target.dispatchEvent(new Event("input"))
                }
              }
              if (binding.value == 2) {
                if (wins_0.test(e.target.value.toString().replace(/\d+\.(\d*)/, '$1'))) {
                  remainder = true
                }
                if ((e.target.value.split('.')).length - 1 > 1) {
                  points = true
                }
                if (e.target.value.toString().split(".")[1] != undefined) {
                  if (e.target.value.toString().split(".")[1].length > 2) {
                    lengths = true
                  }
                }
                if (e.target.value.toString().indexOf(".") != -1) {
                  no_int = false
                } else {
                  no_int = true
                }
                if (wins_1.test(e.target.value) || lengths || points || remainder) {
                  if (!no_int) {
                    e.target.value = e.target.value.replace(wins_1, "").replace('.', '$#$').replace(/\./g, '').replace(
                      '$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').substring(0, e.target.value.indexOf(
                      ".") + 3)
                  } else {
                    e.target.value = e.target.value.replace(wins_0, "")
                  }
                  e.target.dispatchEvent(new Event("input"))
                }
              }
            }
          }, 0)
        })
      }
    }
    
    

    main.js里将此方法引入并挂载到全局指令上

    import * as instructions from '@/utils/instructions' //指令
    Vue.directive('inputLimit',instructions.inputLimt)
    

    使用

     <el-input
                    v-model="check_money"
                    v-input-limit="2"
                    size="small"></el-input>
    指令后面的值就是小数位
    

    参考:https://blog.csdn.net/weixin_43839317/article/details/110486021

    相关文章

      网友评论

          本文标题:vue 自定义指令限制输入框只能输入两位小数

          本文链接:https://www.haomeiwen.com/subject/wkecdrtx.html