首页 > Web开发 > 详细

js Proxy对象实现表单验证

时间:2021-04-25 18:39:16      阅读:17      评论:0      收藏:0      [点我收藏+]

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
    })
});

js Proxy对象实现表单验证

原文:https://www.cnblogs.com/ychizzz/p/14700648.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!