正则案例:表单验证

91 阅读1分钟
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
<style>
    * {
        margin: 0;
        padding: 0;
    }

    form {
        width: 500px;
        padding: 30px;
        border: 5px solid pink;
        border-radius: 15px;
        margin: 50px auto;
        display: flex;
        flex-direction: column;
    }

    form>label {
        height: 50px;
        position: relative;
    }

    form>label>span {
        color: red;
        position: absolute;
        left: 20px;
        bottom: 5px;
        display: none;
    }
</style>
</head>
<body>
<form>
    <label>
        用户名: <input autocomplete="off" type="text" class="name">
        <span>请按照规则填写用户名</span>
    </label>
    <label>
        密码: <input autocomplete="off" type="text" class="password">
        <span>请按照规则填写密码</span>
    </label>
    <label>
        手机号: <input autocomplete="off" type="text" class="phone">
        <span>请按照规则填写手机号</span>
    </label>
    <button>注册</button>
</form>

<script>
    /**
     *  需求:
     *      1. 用户名以数字或字母开头, 6~11位;
     *      2. 密码 6~12 位数字字母下划线;
     *      3. 手机号 11 位数字
    */
    /**
     * 逻辑:
     *      1.获取到用户名 密码 手机号
     *      2.根据正则匹配是否符合规则,决定是否渲染 对应的span 标签
     * 
     * */ 
    // 0.获取元素
    let inps = [...document.querySelectorAll('input')]

    let reg = {
        name: /^[0-9a-zA-Z]\w{5,10}$/,
        password: /^\w{6,12}$/,
        phone: /^\d{11}$/
    }

    // 利用循环,简化代码量
    inps.forEach((item) => {
        item.onblur = function (e) {
            // 拿到用户输入的内容
            let value = this.value
            // 想办法拿到正则
            let fnReg = reg[this.className]
            // 通过正则判断用户名是否符合规则
            if(fnReg.test(value)) {
                this.nextElementSibling.style.display = 'none'
            }else {
                this.nextElementSibling.style.display = 'block'
            }
        }
    })
    // 普通写法
    // // 验证用户名
    // inps[0].onblur = function(e) {
    //     // console.log('失去焦点')
    //     // 1.1拿到用户名
    //     let value = e.target.value
    //     // 1.2创建一个正则
    //     let reg = /^[0-9a-zA-Z]\w{5,10}$/
    //     // 1.3通过正则判断用户名是否符合规则
    //     // console.log(reg.test(value))
    //     if(reg.test(value)) {
    //         // 如果当前分支执行,说明符合规则
    //         e.target.nextElementSibling.style.display = 'none'
    //     }else {
    //         // 如果当前分支执行,说明不符合规则
    //         // console.log(e.target)
    //         e.target.nextElementSibling.style.display = 'block'
    //     }
    // }
    // // 验证密码
    // inps[1].onblur = function(e) {
    //     // console.log('失去焦点')
    //     // 2.1拿到密码
    //     let value = e.target.value
    //     // 2.2创建一个正则
    //     let reg = /^\w{6,12}$/
    //     // 2.3通过正则判断用户名是否符合规则
    //     if (reg.test(value)) {
    //         // 当前分支执行,代表符合规则
    //         e.target.nextElementSibling.style.display = 'none'
    //     }else {
    //         // 当前分支执行,代表不符合规则
    //         e.target.nextElementSibling.style.display = 'block'
    //     }
    // }
    // inps[2].onblur = function(e) {
    //     // console.log('失去焦点')
    //      // 3.1拿到手机号
    //      let value = e.target.value
    //     // 3.2创建一个正则
    //     let reg = /^\d{11}$/
    //     // 3.3通过正则判断用户名是否符合规则
    //     if (reg.test(value)) {
    //         // 当前分支执行,代表符合规则
    //         e.target.nextElementSibling.style.display = 'none'
    //     }else {
    //         // 当前分支执行,代表不符合规则
    //         e.target.nextElementSibling.style.display = 'block'
    //     }
    // }
</script>
</body>
</html>