简化表单验证(面对对象编程)

251 阅读2分钟

本篇文章背景是纯html开发,无任何框架,无状态管理。也可迁移到框架开发。

表单操作一直都是前端的一大复杂点,很繁琐。如果用传统的面向过程思维去编写表单验证逻辑,不便于维护,感觉逻辑很散。 做了好几个项目,都需要填写表单并验证,于是我将逻辑抽离,代码如下。
这里是html:

<body>
    <form action="#" method="post">
        <div>
            <label for="phone">手机号:</label>
            <input id="phone" type="text">
            <span id="phoneMsg"></span>
        </div>
        <div>
            <label>验证码:</label>
            <input id="code" type="text">
            <span id="codeMsg"></span>
        </div>
        <div>
            <label>创建密码:</label>
            <input id="pwd" type="password">
            <span id="pwdMsg"></span>
        </div>
        <div>
            <table id="pwdLevel">
                <tr>
                    <td>
                        <div></div><span>弱</span>
                    </td>
                    <td>
                        <div></div><span>中</span>
                    </td>
                    <td>
                        <div></div><span>强</span>
                    </td>
                </tr>
            </table>
        </div>
        <div>
            <label>确认密码:</label>
            <input id="confirmPwd" type="password">
            <span id="confirmPwdMsg"></span>
        </div>
        <div>
            <input type="submit" value="同意并提交">
        </div>
    </form>
</body>

下面是js文件:

let inputList = {
    phoneObj: {
        element: document.getElementById("phone"),//input的内容
        elementMsg: document.getElementById("phoneMsg"),//备注信息 
        flag: false,//是否符合格式,是否通过validate验证
        validate: function () {
            return this.element.value && /^1\d{10}$/.test(this.element.value);
        },
    },
    codeObj: {
        element: document.getElementById("code"),
        elementMsg: document.getElementById("codeMsg"),
        flag: false,
        validate: function () {
            return /^\d{6}$/.test(this.element.value);
        },
    },
    pwdObj: {
        element: document.getElementById("pwd"),
        elementMsg: document.getElementById("pwdMsg"),
        flag: false,
        validate: function () {
            return /^.{6,}$/.test(this.element.value);
        }
    },
    confirmObj: {
        element: document.getElementById("confirmPwd"),
        elementMsg: document.getElementById("confirmPwdMsg"),
        flag: false,
        validate: function () {
            return this.element.value && inputList.pwdObj.element.value == this.element.value;
        }
    }
};

let validate = function (obj) {
    obj.element.onblur = function () {
        if (obj.validate()) {
            obj.elementMsg.innerText = "√";
            obj.elementMsg.style.color = "green";
            obj.flag = true;
        } else {
            obj.elementMsg.innerText = "格式错误";
            obj.elementMsg.style.color = "red";
            obj.flag = false;
        }
    }
}
for(let item in inputList){
    validate(inputList[item]);
}

差不多就是这样,将同一元素的取值、备注信息、验证函数放在同一对象,由此对象完成一条龙服务,而不是将这一流程分成几部分、零散地去进行,这就是面向对象(此处金光闪闪)。

以面对对象的形式去完成表单验证逻辑,便于工程化增加表单元素,但是不易于个性化验证和样式,有得必有失,还是看需求去选择数据结构和编程模式。