表单验证(实时判断)

版权声明:转载声明原作者及链接 https://blog.csdn.net/ICY___/article/details/86670844

上次的正则版表单验证的主要用意是为了正则表达式的应用,而这次的表单验证提供的更加完善的用户体验(实时判断了用户的输入数据正确与否),它是上个版本的延伸。

实现效果:

相应代码:

<!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>表单验证</title>
    <link rel="stylesheet" href="./css/iconfont.css">
    <!-- 字体图标的引入 -->
    <style>
        /* css样式  和之前的正则版表单验证一样,实际上这个是先前写的*/
        #formuser{
            display: block;
            margin: 0 auto;
            width: 400px;
        }
        .form_user>li{
            position: relative;
            list-style: none;
            height: 50px;
            width: 400px;
            border: 1px solid gray;
            border-radius: 5px;
            margin: 40px 0;
        }
        .form_user>li>input{
            width: 378px;
            height: 48px;
            border-style: none;
            outline: none;
            margin-left: 1px;
            padding-left: 20px;
            color: black;
            font-size: 20px;
        }
        .tel{
            position: relative;
            border-style: none !important;
        }
        .usertelnum{
            width: 150px;
            height: 50px;
            border: 1px solid grey;
            border-radius: 5px;
            line-height: 50px;
            position: relative;
            float: left;
        }
        .usertelnum>input{
            position: absolute;
            border-style: none;
            outline: none;
            top: 0px;
            left: 1px;
            width: 120px;
            height: 48px;
            padding-left: 20px;
            font-size: 20px;
        }
        #icon{
            position: absolute;
            top: 0;
            right: 10px;
            color: gray;
        }
        .show_phone{
            float: right;
            width: 210px !important;
            height: 50px !important;
            border-radius: 5px;
            border: 1px solid silver !important;
            font-size: 20px;
            padding-left: 20px;
            outline: none;
            border-style: solid;
        }
        .phone_name{
            display: none;
            position: absolute;
            border-radius: 5px;
            z-index: 9;
            top: 52px;
            width: 398px;
            height: 250px;
            border: 1px solid silver;
            background-color: white;
            overflow-y: scroll;
        }
        .phone_name>ul{
            margin: 0%;
            padding: 0%;
        }
        .phone_name li{
            list-style: none;
            height: 40px;
            line-height: 40px;
            padding-left: 20px;
            font-size: 20px;
            color: black;
        }
        .phone_name li:hover{
            background-color: #e4e4e4;
        }
        .sub_btn{
            background-color: #2e7fff;
        }
        .sub_btn>input{
            width:400px;
            height: 50px;
            outline: none;
            border-style: none;
            background-color: transparent;
            color: white;
            font-size: 22px;
        }
        .sub_btn:hover{
            background-color: #83aae9;

        }
        .telerror{
            clear: left;
            display: inline-block;
            font-size: 14px;
            color: gray;
            position: relative;
            top: 5px;
        }
        .emailshow{
            display: block;
            font-size: 14px;
            color: gray !important;
            position: absolute;
            top: 53px;
        }
        .error {
            font-size: 14px;
            color: red;
            position: absolute;
            top: 53px;
            left: 0;
            background-image: url("./img/[email protected]");
            background-repeat: no-repeat;
            background-size: 20px;
            padding-left: 25px;
        }       
        .success {
            display: none;
            position: absolute;
            top: 15px;
            right: 10px;
        }
    </style>
</head>

<body>
    <form id="formuser" action="" method="get" onsubmit="">
        <!-- get方式提交 -->
        <ul class="form_user">
            <li class="litxt">
                <input type="text" class="userData" name="email" placeholder="邮箱" value="" />
                <span class="emailshow">请输入你的常用邮箱(非qq/foxmail邮箱)</span>
                <img class="success" src="./img/tick.png" alt="" />
            </li>
            <li class="litxt">
                <input type="text" class="userData" name="nickname" placeholder="昵称" value="" />
                <img class="success" src="./img/tick.png" alt="" />

            </li>
            <li class="litxt">
                <input type="text" class="userData" name="password" placeholder="密码" value="" />
                <img class="success" src="./img/tick.png" alt="" />

            </li>
            <li class="tel">
                <div class="usertelnum">
                    <input id="telnum" type="text" value="+86">
                    <i id="icon" class="iconfont">&#xf01a6;</i>
                </div>
                <input type="text" class="show_phone" placeholder="手机号码">
                <div class="phone_name">
                    <ul>
                        <li>中国 +86</li>
                        <li>中国香港特别行政区 +852</li>
                        <li>中国澳门特别行政区 +853</li>
                        <li>中国台湾地区 +886</li>
                        <li>阿尔巴尼亚 +355</li>
                        <li>阿尔及利亚 +213</li>
                        <li>阿富汗 +93</li>
                        <li>阿根廷 +54</li>
                        <li>爱尔兰 +353</li>
                        <li>埃及 +20</li>
                        <li>埃塞俄比亚 +251</li>
                    </ul>
                </div>
                <span class="telerror">可以通过该手机号找回密码</span>
            </li>
            <li class="sub_btn">
                <input type="submit" value="立即注册" />
            </li>
        </ul>
    </form>
    <script>
        // 获取所需要的dom元素
        var litxt = document.getElementsByClassName('litxt');
        var emailshow = document.getElementsByClassName('emailshow')[0];
        var phone_name = document.getElementsByClassName('phone_name')[0];
        var formuser = document.getElementById('formuser');
        var telnum = document.getElementById('telnum');
        var txt = document.getElementsByClassName('userData');
        var success = document.getElementsByClassName('success');
        var nameinfo = ["邮箱", "昵称", "密码"];//可以动态的更改不同提示时的显示

        window.onload = addEvent();// 由于js写在所有的元素后面,所以可以不写这句话

        function addEvent() {
            for (var i = 0; i < litxt.length; i++) {
                txt[i].index = i;//由于i值在循环结束后为固定值,所以取出它的索引值
                txt[i].onfocus = function () {//鼠标获焦事件,如果获焦后,将之前下方对的提示性文字隐藏,文本框变色
                // 且将对应显示出的错误警告删除,也就是错误警告是动态创建和删除的
                    emailshow.style.display = 'none';
                    this.parentNode.style.borderColor = "#2e7fff";
                    if (this.parentNode.lastChild.nodeName.toLowerCase() == "span" && this.parentNode.lastChild.className ==
                        "error") {
                        this.parentNode.lastChild.remove();
                    }
                }
                txt[i].onblur = function () {//判断文本框是否为空、各文本框的数据是否符合规则,用的是逻辑判断
                    this.parentNode.style.borderColor = "silver";
                    if (this.value == '') {
                        var span = document.createElement('span');
                        span.className = 'error';
                        span.innerHTML = nameinfo[this.index] + '不能为空!'
                        this.parentNode.appendChild(span);
                        this.parentNode.style.borderColor = 'red';
                    } else {
                        if (this.index == 0) { //邮箱
                            if (litxt[this.index].children[0].value.indexOf("@") != -1 && litxt[this.index].children[
                                    0].value.indexOf("@") + 1 != litxt[this.index].children[0].value.length) {
                                success[this.index].style.display = 'block';//下同,显示出验证成功的对号
                            } else {
                                var span = document.createElement('span');
                                span.className = 'error';
                                span.innerHTML = nameinfo[this.index] + '格式不正确!'
                                this.parentNode.appendChild(span);
                            }
                        }
                        if (this.index == 1) {//昵称
                            success[this.index].style.display = 'block';
                        }
                        if (this.index == 2) {//密码
                            if (litxt[this.index].children[0].value.length >= 6 && litxt[this.index].children[0].value
                                .length <= 8) {
                                if (!isNaN(litxt[this.index].children[0].value)) {
                                    var span = document.createElement('span');
                                    span.className = 'error';
                                    span.innerHTML = nameinfo[this.index] + '必须有字母或符号!'
                                    this.parentNode.appendChild(span);
                                } else {
                                    success[this.index].style.display = 'block';
                                }
                            } else {
                                var span = document.createElement('span');
                                span.className = 'error';
                                span.innerHTML = nameinfo[this.index] + '长度必须在6~8位之间'
                                this.parentNode.appendChild(span);
                            }

                        }
                    }
                }
            }
        }
        telnum.onclick = function () {
            phone_name.style.display = 'block';
        }
        telnum.onblur = function () {
            phone_name.style.display = 'none';
        }
        formuser.onsubmit = function () {
            if (submethods()) {//判断是否有报错,没有的话提交表单

                event.preventDefault();//阻止元素发生默认的行为
                event.stopPropagation();//阻止事件的冒泡
            }
            addEvent();
        }

        function submethods() {//创建错误提示的span元素,计算报错的数量并返回
            emailshow.style.display = 'none';
            for (var i = 0; i < litxt.length; i++) {
                if (litxt[i].children[0].value == '') {
                    var span = document.createElement('span');
                    span.className = 'error';
                    span.innerHTML = nameinfo[i] + '不能为空!'
                    litxt[i].appendChild(span);
                    litxt[i].style.borderColor = 'red';
                }

            }
            var length = document.getElementsByClassName('error').length;
            return length;
        }
    </script>
</body>

</html>

有些方法是第一次用,表述可能有些问题,欢迎留言。

猜你喜欢

转载自blog.csdn.net/ICY___/article/details/86670844