限制数字的自定义指令
限制最大值和最小值
使用方法
v-positiveInt="{min:1,max:1000000000}"
export default (Vue) => {
const trigger = (el, type) => {
const e = document.createEvent('HTMLEvents');
e.initEvent(type, true, true);
el.dispatchEvent(e);
};
Vue.directive('positiveInt', {
bind(el, binding) {
const { min, max } = _.get(binding, 'value', {});
const input = el.getElementsByTagName('input')[0];
input.onkeyup = function () {
if (input.value.length === 1) {
input.value = input.value.replace(/[^0-9]/g, '');
} else {
input.value = input.value.replace(/[^\d]/g, '');
}
if (min && input.value && Number(input.value) < Number(min)) {
input.value = min;
}
if (max && Number(input.value) > Number(max)) {
input.value = max;
}
trigger(input, 'input');
};
input.onblur = function () {
if (input.value.length === 1) {
input.value = input.value.replace(/[^0-9]/g, '');
} else {
input.value = input.value.replace(/[^\d]/g, '');
}
if (min && input.value && Number(input.value) < Number(min)) {
input.value = min;
}
if (max && Number(input.value) > Number(max)) {
input.value = max;
}
trigger(input, 'input');
};
}
});
};
```javascript
使用方法
v-input-limit="'positive'"
export default {
install(Vue) {
let isComposing = false;
Vue.directive('input-limit', {
bind(el, binding) {
let input;
if (el.tagName.toLowerCase() === 'input') {
input = el;
} else {
input = el.querySelector('input');
}
if (!input) {
return;
}
el.inputLimit = {
input,
handleCompositionStart() {
isComposing = true;
},
handleCompositionUpdate() {
isComposing = true;
},
handleCompositionEnd(e) {
if (isComposing) {
isComposing = false;
el.inputLimit.handler(e);
}
},
handler(e) {
if (isComposing) {
return;
}
if (binding.value === 'positive') {
e.target.value = e.target.value.replace(/^-[1-9]\d*|\D|^0$/g, '');
} else {
const regexp = new RegExp(binding.value, 'g');
e.target.value = e.target.value.replace(regexp, '');
}
}
};
input.addEventListener('input', el.inputLimit.handler);
input.addEventListener('compositionstart', el.inputLimit.handleCompositionStart);
input.addEventListener('compositionupdate', el.inputLimit.handleCompositionUpdate);
input.addEventListener('compositionend', el.inputLimit.handleCompositionEnd);
},
unbind(el) {
if (el.inputLimit) {
el.inputLimit.input.removeEventListener('input', el.inputLimit.handler);
el.inputLimit.input.removeEventListener('compositionstart', el.inputLimit.handleCompositionStart);
el.inputLimit.input.removeEventListener('compositionupdate', el.inputLimit.handleCompositionUpdate);
el.inputLimit.input.removeEventListener('compositionend', el.inputLimit.handleCompositionEnd);
}
}
});
}
};