自定义指令:限制输入框只能输入金额

 1、在src/directive/文件夹下新建一个inputFloat.js

import Vue from 'vue'

Vue.directive('inputFloat', {
  bind(el, binding, vnode) {
    const input = el.getElementsByTagName('input')[0]
    input.addEventListener('compositionstart', () => {
      vnode.inputLocking = true
    })
    input.addEventListener('compositionend', () => {
      vnode.inputLocking = false
      input.dispatchEvent(new Event('input'))
    })
    input.addEventListener('input', () => {
      if (vnode.inputLocking) {
        return
      }
      const oldValue = input.value
      let newValue = input.value
      newValue = newValue.replace(/[^\d.]/g, '')
      newValue = newValue.replace(/^\./g, '')
      newValue = newValue.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.')
      newValue = newValue.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3')
      if (newValue) {
        const arr = newValue.split('.')
        newValue = Number(arr[0]) + (arr[1] === undefined ? '' : '.' + arr[1]) // 去掉开头多余的0
      }
      // 判断是否需要更新,避免进入死循环
      if (newValue !== oldValue) {
        input.value = newValue
        input.dispatchEvent(new Event('input')) // 通知v-model更新
      }
    })
    // input 事件无法处理小数点后面全是零的情况 因为无法确定用户输入的0是否真的应该清除,如3.02。放在blur中去处理
    input.addEventListener('blur', () => {
      const oldValue = input.value
      let newValue = input.value
      if (newValue) {
        newValue = Number(newValue).toFixed(2)
      }
      // 判断是否需要更新,避免进入死循环
      if (newValue !== oldValue) {
        input.value = newValue
        input.dispatchEvent(new Event('input')) // 通知v-model更新
      }
    })
  }
})

2、在main.js文件引入inputFloat

import './directive/inputFloat'

3、在页面中使用

<el-input v-model="item.amount" v-inputFloat placeholder="请输入金额" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值