vue自定义指令
import Vue from 'vue'
const Directive = {}
Directive.Int = () => {
Vue.directive('Int', {
inserted: (el) => {
const input = el.getElementsByTagName('input')[0]
input.onkeyup = () => {
if (input.value.length === 1) {
input.value = input.value.replace(/[^1-9]/g, '')
} else {
input.value = input.value.replace(/[^\d]/g, '')
}
trigger(input, 'input')
}
input.onblur = () => {
if (input.value.length === 1) {
input.value = input.value.replace(/[^1-9]/g, '')
} else {
input.value = input.value.replace(/[^\d]/g, '')
}
trigger(input, 'input')
}
}
})
}
const trigger = (el, type) => {
const e = document.createEvent('HTMLEvents')
e.initEvent(type, true, true)
el.dispatchEvent(e)
}
Directive.decimal = () => {
Vue.directive('decimal', {
inserted: (el) => {
const input = el.getElementsByTagName('input')[0]
input.onkeyup = () => {
if (input.value.length === 1) {
input.value = input.value.replace(/[^1-9]/g, '')
} else {
input.value = input.value.match(/^\d*(\.?\d{0,2})/g)[0] || null
}
trigger(input, 'input')
}
input.onblur = () => {
if (input.value.length === 1) {
input.value = input.value.replace(/[^1-9]/g, '')
} else {
input.value = input.value.match(/^\d*(\.?\d{0,2})/g)[0] || null
}
trigger(input, 'input')
}
}
})
}
Directive.showTips = () => {
Vue.directive('showTips', {
bind(el, binding) {
setTimeout(() => {
const curStyle = window.getComputedStyle(el, '')
const textSpan = document.createElement('span')
textSpan.style.fontSize = curStyle.fontSize
textSpan.style.fontWeight = curStyle.fontWeight
textSpan.style.fontFamily = curStyle.fontFamily
document.body.appendChild(textSpan)
textSpan.innerHTML = el.innerText
if (textSpan.offsetWidth > (el.offsetWidth || binding.value?.width)) {
el.style.overflow = 'hidden'
el.style.textOverflow = 'ellipsis'
el.style.whiteSpace = 'nowrap'
el.style.cursor = 'default'
el.style.paddingRight = '20px'
el.onmouseenter = function (e) {
const vcTooltipDom = document.createElement('div')
vcTooltipDom.style.cssText = `
max-width: 400px;
overflow: auto;
position: absolute;
top: ${e.clientY + 5}px;
left: ${e.clientX}px;
background: rgba(0, 0 , 0, .6);
color: #fff;
border-radius: 4px;
padding: 6px 10px;
display: inline-block;
font-size: 12px;
word-break :break-all;
z-index: 9999;
`
vcTooltipDom.setAttribute('id', 'vc-tooltip')
document.body.appendChild(vcTooltipDom)
document.getElementById('vc-tooltip').innerHTML = el.innerText
}
el.onmouseleave = function () {
const vcTooltipDom = document.getElementById('vc-tooltip')
vcTooltipDom && document.body.removeChild(vcTooltipDom)
}
}
document.body.removeChild(textSpan)
}, binding.value?.delay || 0)
},
unbind() {
const vcTooltipDom = document.getElementById('vc-tooltip')
vcTooltipDom && document.body.removeChild(vcTooltipDom)
}
})
}
export default Directive