HTML结构:
<style>
input:focus {
outline: 0;
}
.validateInput {
border: 2px solid red;
}
</style>
<div>
<input type="text" validate rule="max: 8, min: 3">
</div>
<div>
<input type="text" validate rule="max: 16, min: 5, isNumber">
</div>
js部分:
// 声明一个验证类,内部是需要用到的验证方法
class Validate {
min(data, len) {
return data.length >= len
}
max(data, len) {
return data.length <= len
}
isNumber(data) {
return /^\d+$/.test(data)
}
}
// 代理函数,返回代理之后的验证对象
function proxyFactory(target) {
return new Proxy(target, {
get(target, prop) {
return target[prop] // 此处需要返回,否则proxyInputs.forEach会报错
},
set(target, prop, el) {
const rules = el.getAttribute("rule").split(",")
const validate = new Validate()
const state = rules.every(rule => {
const info = rule.replace(/\s/g, "").split(":") // 去掉标签中rule的空格
// info[0]表示验证方法名称,info[1]表示规定长度
return validate[info[0]](el.value, info[1])
})
// 根据state的结果判断是否改变input样式
el.classList[state ? "remove" : "add"]("validateInput")
},
})
}
const validateInputs = document.querySelectorAll("[validate]")
const proxyInputs = proxyFactory(validateInputs)
proxyInputs.forEach((item, index) => {
item.addEventListener("keyup", function () {
proxyInputs[index] = this // 此处是为了触发set
})
});
原文:https://www.cnblogs.com/ychizzz/p/14700648.html