共计 1399 个字符,预计需要花费 4 分钟才能阅读完成。
import Vue from "vue";
/**
* element-input 输出限度
*
*/
//v-positiveInteger 正整数
//v-positiveInteger.2 保留两位小数
//v-positiveInteger.4 保留四位小数
Vue.directive("positiveInteger", {bind(el, binding, vnode) {let dom = findDom(el, "el-input__inner");
let modifiers = binding.modifiers
let mantissa = 0
for (let x in modifiers) {mantissa = x}
el.handler = function () {if (vnode.inputLocking) {return;}
if(mantissa) {let reg = new RegExp(`^\\D*(\\d*(?:\.\\d{0,${mantissa}})?).*$`, 'gmi')
el.childNodes[1].value = el.childNodes[1].value.replace(reg, "$1");
}else {el.childNodes[1].value = el.childNodes[1].value.replace(/\D+/g, "");
}
};
dom.addEventListener("compositionstart", () => {vnode.inputLocking = true;});
dom.addEventListener("compositionend", () => {
vnode.inputLocking = false;
dom.dispatchEvent(new Event("input"));
});
dom.onfocus = function () {if (dom.value == 0) {dom.value = "";}
};
el.addEventListener("keyup", el.handler);
el.handler1 = function () {el.childNodes[1].value = el.childNodes[1].value;
dom.dispatchEvent(new Event("input"));
};
el.childNodes[1].addEventListener("blur", el.handler1);
},
unbind(el) {el.removeEventListener("keyup", el.handler);
el.childNodes[1].removeEventListener("blur", el.handler);
},
});
// 递归查找某个元素节点
function findDom(el, className) {
let dom;
for (let i = 0; i < el.childNodes.length; i++) {if (el.childNodes[i].nodeType == 1) {let str = el.childNodes[i].getAttribute("class");
if (str.indexOf(className) > -1) {dom = el.childNodes[i];
break;
} else {dom = findDom(el.childNodes[i], className);
}
}
}
return dom;
}
参考文章
正文完