1. export default {
    2. // min: 0
    3. // max: 100
    4. // precision: 2
    5. inserted (el, binding, vNode) {
    6. // binding.value 有指令的参数
    7. let content
    8. // 设置输入框的值,触发input事件,改变v-model绑定的值
    9. const setVal = val => {
    10. if (vNode.componentInstance) {
    11. // 如果是自定义组件就触发自定义组件的input事件
    12. vNode.componentInstance.$emit('input', val)
    13. } else {
    14. // 如果是原生组件就触发原生组件的input事件
    15. el.value = val
    16. const e = document.createEvent('HTMLEvents')
    17. e.initEvent('input', true, true)
    18. el.dispatchEvent(e)
    19. }
    20. }
    21. const newVal = value => {
    22. let content = parseFloat(value)
    23. if (!content) {
    24. return 0
    25. } else {
    26. return content
    27. }
    28. }
    29. const toFixed = (value, precision) => {
    30. const precisionVal = precision ? parseFloat(precision) : 0
    31. const arr = value.toString().split('.')
    32. const intPart = arr[0]
    33. let floatPart = arr[1]
    34. if (floatPart && floatPart.length > precisionVal) {
    35. floatPart = floatPart.substr(0, precisionVal)
    36. return Number(`${intPart}.${floatPart}`)
    37. }
    38. return value
    39. }
    40. const limitMaxMin = event => {
    41. const e = event || window.event
    42. content = newVal(e.target.value)
    43. let argMax = ''
    44. let argMin = ''
    45. if (binding.value) {
    46. argMax = parseFloat(binding.value.max)
    47. argMin = parseFloat(binding.value.min)
    48. }
    49. if (argMax !== undefined && content > argMax) {
    50. setVal(argMax)
    51. content = argMax
    52. }
    53. if (argMin !== undefined && content < argMin) {
    54. setVal(argMin)
    55. content = argMin
    56. }
    57. }
    58. // 按键按下=>只允许输入 数字/小数点/减号
    59. el.addEventListener('keypress', event => {
    60. const e = event || window.event
    61. const inputKey = String.fromCharCode(typeof e.charCode === 'number' ? e.charCode : e.keyCode)
    62. const regExp = /\d|\.|-/ // 正则只允许数字,小数点,减号
    63. content = e.target.value
    64. // 定义方法,阻止输入
    65. function preventInput () {
    66. if (e.preventDefault) {
    67. e.preventDefault()
    68. } else {
    69. e.returnValue = false
    70. }
    71. }
    72. if (!regExp.test(inputKey) && !e.ctrlKey) {
    73. preventInput()
    74. } else if (content.indexOf('.') > 0 && inputKey === '.') {
    75. // 已有小数点,再次输入小数点
    76. preventInput()
    77. }
    78. })
    79. // 按键弹起=>并限制最大最小
    80. el.addEventListener('keyup', event => {
    81. limitMaxMin(event)
    82. })
    83. // 失去焦点=>保留指定位小数
    84. el.addEventListener('focusout', event => { // 此处会在 el-input 的 @change 后执行
    85. const e = event || window.event
    86. content = newVal(e.target.value)
    87. e.target.value = toFixed(content, binding.value.precision)
    88. setVal(e.target.value)
    89. limitMaxMin(event)
    90. })
    91. }
    92. }