正则案例:密码输入框的高亮显示

272 阅读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: 20px;
        border: 5px solid pink;
        border-radius: 15px;
        margin: 50px auto;
    }

    label {
        font-size: 20px;
    }

    label>input {
        font-size: 20px;
        padding-left: 20px;
    }

    label>p {
        height: 30px;
        display: flex;
        justify-content: space-between;
        margin-top: 20px;
    }

    label>p>span {
        width: 30%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        background-color: #ccc;
        color: #fff;
    }

    label>p>span:nth-child(1).active {
        background-color: red;
    }

    label>p>span:nth-child(2).active {
        background-color: orange;
    }

    label>p>span:nth-child(3).active {
        background-color: green;
    }
    </style>
</head>
<body>
<form>
    <label>
        密码 : <input type="text">
        <p>
            <span></span>
            <span></span>
            <span></span>
        </p>
    </label>
</form>

<script>
    /**
     * 需求:
     *      密码包含 数字-字母-符号(!@#);
     *          1. 包含一种~弱; 
     *          2. 包含两种~中; 
     *          3. 包含三种~强
    */

    /**
     * 逻辑:
     *      判断密码符合这三种符号的哪些
     * 
     *      1.拿到密码
     *      2.准备正则符合三个强度的哪些
     *      3.根据密码的强度,决定高亮几个span标签
     * */ 

    // 0.获取标签
    const inp = document.querySelector('input')
    const spans = [...document.querySelectorAll('span')]

    // 1.给input绑定事件
    inp.oninput = function() {
        // 1.1拿到密码
        const value = this.value
        // 1.2准备正则
        const r1 = /\d/
        const r2 = /[a-zA-Z]/
        const r3 = /[!@#]/
        // 1.3通过正则判断当前密码属于哪个强度等级
        let level = 0 //默认为0级
        if(r1.test(value)) {
            //当前分支执行,说明当前密码包含数字
            level++
        }
        if(r2.test(value)) {
            //当前分支执行,说明当前密码包含字母
            level++
        }
        if(r3.test(value)) {
            //当前分支执行,说明当前密码包含特殊符号
            level++
        }
        /**
         * 1.4根据密码的强度,决定高亮几个span标签
         * 
         *      思路:
         *          1.给所有span取消类名
         *          2.给我们需要的span添加类名
         * */ 
        for(let i = 0; i < spans.length; i++) {
            // 1.给所有span取消类名
            spans[i].className = ''
            /**
             * 2.给我们需要的span添加类名
             * 
             *      level 存储的是密码的强度等级
             *          level === 1  高亮的是 spans[0]
             *          level === 2  高亮的是 spans[0]spans[1]
             *          level === 3  高亮的是 spans[0]spans[1]spans[2]
            */
           if(i < level) {
            spans[i].className = 'active'
           }
        }

    }

    //0.获取元素
    // var inp = document.querySelector('input')
    // var pSpan = [...document.querySelectorAll('p>span')] //获取p标签下的所有span以数组的方式展示
    // // console.log(span)
    // // var reg = /(\w|\W)/
    // //  console.log(reg.test('123qwer!@#'))
    // var reg1 = /\d/
    // var reg2 = /[a-zA-Z]/
    // var reg3 = /[~!@#$%^&*]/

    // inp.oninput = function() {
    //     var flag = 0
    //     var value = inp.value
    //     if(reg1.test(value)){flag++}
    //     if(reg2.test(value)){flag++}
    //     if(reg3.test(value)){flag++}
    //     for(var i = 0; i < pSpan.length; i++) {
    //         // console.log(pSpan[i])
    //         pSpan[i].classList.remove('active')
    //      if(i < flag) {pSpan[i].classList.add('active')}
    //     }
    // }
    
</script>
</body>
</html>