关于4-8编程练习

关于4-8编程练习

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        header {
            width:100%;
            height:20px;
            background:blue;
            text-align:left;
            color:white;
        }
        body {
            background: gray;
        }
        .wrap {
            position: relative;
            width: 700px;
            height: 100%;
            margin: 50px auto;
            -webkit-transform: translate(-25%, 0);
            -moz-transform: translate(-25%, 0);
            -ms-transform: translate(-25%, 0);
            -o-transform: translate(-25%, 0);
            transform: translate(-25%, 0);
            
        }
        .wrap > div {
            position: relative;
            width: 500px;
            height: 100%;
            margin: 10px auto;
            text-align: right;
        }
        .wrap > div span {
            position: absolute;
            display: none;
            width: 250px;
            left: 101%;
            line-height: 23px;
            font-size: 10px;
            color: red;
            text-align: left;
        }
        .wrap > div select {
            width: 160px;
        }
    </style>
</head>
<body>
    <header>用户注册</header>
    <div class="wrap">
        <div>
            用户名:<input type="text" id="username">
            <span name="ok">ok</span>
            <span name="error">6-20位字母、数字或“_”,字母开头</span>
        </div>
        <div>
            登录密码:<input type="password" id="loginPwd">
            <span name="ok">ok</span>
            <span name="error">密码6-18位,包括数字字母或符号,中间不能有空格</span>
        </div>
        <div>
            确认密码:<input type="password" id="confirmPwd">
            <span name="ok">ok</span>
            <span name="error">两次输入密码不一致</span>
        </div>
        <div>
            姓名:<input type="text" id="name">
            <span name="ok">ok</span>
            <span name="error">真实姓名,两位到四位的中文汉字</span>
        </div>
        <div>
            性别:<select>
                <option>男</option>
                <option>女</option>
            </select>
        </div>
        <div>
            身份证号:<input type="text" id="id">
            <span name="ok">ok</span>
            <span name="error">15位或者18位的数字</span>
        </div>
        <div>
            邮箱:<input type="text" id="email">
            <span name="ok">ok</span>
            <span name="error">邮箱格式不正确</span>
        </div>
        <div>
            手机号码:<input type="text" id="phone">
            <span name="ok">ok</span>
            <span name="error">手机号码不正确</span>
        </div>
    </div>
    <script type="text/javascript">
        (function() {
            var regExp = {
                usernameR: /^[a-z]\w{5,20}$/i,
                loginPwdR: /^\w{6,18}[^\s]?$/,
                nameR:     /^[\u4e00-\u9fa5]{2,4}$/,
                idR:       /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9][xX])$/,
                emailR:    /^[a-z0-9]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/i,
                phoneR:    /^(13)[0-9]{9}|(17)[0-9]{11}|(147)[0-9]{8}|(15)[0,1,2,3,5,6,7,8,9]{1}[0-9]{8}|(18)[0,2,5,6,7,8,9]{1}[0-9]{8}$/,
            };
            var infoLists = {
                username:   document.getElementById("username"),
                loginPwd:   document.getElementById("loginPwd"),
                confirmPwd: document.getElementById("confirmPwd"),
                name:       document.getElementById("name"),
                id:         document.getElementById("id"),
                email:      document.getElementById("email"),
                phone:      document.getElementById("phone"),
            };
            var ok = {
                usernameOk:   document.getElementsByName("ok")[0],
                loginPwdOk:   document.getElementsByName("ok")[1],
                confirmPwdOk: document.getElementsByName("ok")[2],
                nameOk:       document.getElementsByName("ok")[3],
                idOk:         document.getElementsByName("ok")[4],
                emailOk:      document.getElementsByName("ok")[5],
                phoneOk:      document.getElementsByName("ok")[6],
            }
            var error = {
                usernameError:   document.getElementsByName("error")[0],
                loginPwdError:   document.getElementsByName("error")[1],
                confirmPwdError: document.getElementsByName("error")[2],
                nameError:       document.getElementsByName("error")[3],
                idError:         document.getElementsByName("error")[4],
                emailError:      document.getElementsByName("error")[5],
                phoneError:      document.getElementsByName("error")[6],
            }
            infoLists.username.onblur = function() {
                if (regExp.usernameR.test(infoLists.username.value)) {
                    ok.usernameOk.style.display = "inline-block";
                    error.usernameError.style.display = "none";
                }else {
                    error.usernameError.style.display = "inline-block";
                }
            }
            infoLists.loginPwd.onblur = function() {
                if (regExp.loginPwdR.test(infoLists.loginPwd.value)) {
                    ok.loginPwdOk.style.display = "inline-block";
                    error.loginPwdError.style.display = "none";
                }else {
                    error.loginPwdError.style.display = "inline-block";
                }
            }
            infoLists.confirmPwd.onblur = function() {
                if (infoLists.loginPwd.value != null && infoLists.loginPwd.value == infoLists.confirmPwd.value) {
                    ok.confirmPwdOk.style.display = "inline-block";
                    error.confirmPwdError.style.display = "none";
                }else {
                    error.confirmPwdError.style.display = "inline-block";
                }
            }
            infoLists.name.onblur = function() {
                if (regExp.nameR.test(infoLists.name.value)) {
                    ok.nameOk.style.display = "inline-block";
                    error.nameError.style.display = "none";
                }else {
                    error.nameError.style.display = "inline-block";
                }
            }
            infoLists.id.onblur = function() {
                if (regExp.idR.test(infoLists.id.value)) {
                    ok.idOk.style.display = "inline-block";
                    error.idError.style.display = "none";
                }else {
                    error.idError.style.display = "inline-block";
                }
            }
            infoLists.email.onblur = function() {
                if (regExp.emailR.test(infoLists.email.value)) {
                    ok.emailOk.style.display = "inline-block";
                    error.emailError.style.display = "none";
                }else {
                    error.emailError.style.display = "inline-block";
                }
            }
            infoLists.phone.onblur = function() {
                if (regExp.phoneR.test(infoLists.phone.value)) {
                    ok.phoneOk.style.display = "inline-block";
                    error.phoneError.style.display = "none";
                }else {
                    error.phoneError.style.display = "inline-block";
                }
            }
        })();
    </script>
</body>
</html>

我认为我的代码还可以优化一些,将那些onblur函数合并成一个函数,但是合并成这么一个for循环,并不能实现效果,应该是每个对象都各自独立的原因,请问要怎么优化呢?

for(var i in infoLists){

    i.onblur = function() {

        

        if (regExp.i.test(infoLists.i.value)) {

                        ok.i.style.display = "inline-block";

                        error.i.style.display = "none";

                    }else {

                        error.i.style.display = "inline-block";

                    }

    }

}

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

你好,因为最开始遍历的是infoLists这个对象,所以i是infoLists这个对象这个对象中的,对应的就是如下,可以输出测试下哦。

http://img1.sycdn.imooc.com//climg/5ac9c6670001daa201250149.jpg

所以regExp等其他几个对象是没有办法直接使用i来获取值的,根据命名的规则,这里名字主要是后面有区别,所以可以尝试字符串拼接。整体可参考如下:

http://img1.sycdn.imooc.com//climg/5ac9c632000169c408870314.jpg

祝学习愉快~

好帮手慕糖 2018-04-09 09:34:42

是的,如果不使用的话,事件中使用的会是最后一个,所以可以使用闭包。

祝学习愉快~

提问者 帅气的灯泡 2018-04-07 13:33:56

这里我的思路是,将每个对象属性都改成同名的,再进行for循环,然而不行

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
HTML5&CSS3进阶与常用框架 2018
  • 参与学习       315    人
  • 提交作业       136    份
  • 解答问题       626    个

如果你有H5、CSS3、JS基础,热爱前端并希望在前端应用方面不断进步,那就来吧,本路径为你带来的课程有HTML5进阶、CSS3进阶、JS面向对象、jQ基础、Less等,助你进一步提升前端开发技能

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师