通过JQuery实现一个通用的表单验证类
2022-09-28 22:58:16    33    0    0
admin

    jQuery的应用十分广泛,从最早的PC网站,异步请求、交互效果等,到现在的移动网站,jQuery目前已经迭代到 v3.6.1版本,功能也是越来越强大,本文将介绍通过设置元素的验证规则,遍历表单属性,来实现通用的验证,并实现表单的异步提交。

    首先,第一步,我们将验证绑定到提交按钮,并将表单的sumit设置成return false避免跳过验证直接提交,我们一起来看一下这里的html源代码。

     <form method="POST" onsubmit="return false" data-callback="window.location.href='/';">
    <div class="list-group list-group-sm">
        <div class="list-group-item">
            <input placeholder="昵称" name="nickname" class="form-control no-border" maxlength="30" rules="^([0-9a-zA-Z]){6,20}" required>
        </div>
        <div class="list-group-item">
            <input type="email" name="email" placeholder="邮箱" class="form-control no-border" ng-model="user.email" maxlength="50" rules="^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$" required>
        </div>
        <div class="list-group-item">
            <input type="password" name="password" placeholder="密码" class="form-control no-border" ng-model="user.password" rules="^([a-zA-Z0-9,.;:~!@#$%^&\-\_\*]+){6,20}" required>
        </div>
        <button type="submit" class="btn btn-lg btn-info btn-block btn-ajaxForm">注册</button>
    </div>
    </form>

    <script>
        $(function() {
            $('body').on('click', '.btn-ajaxForm', function(){

                //这里是我们要去执行的操作,如:表单验证,异步提交,异步成功/失败回调
        });
    </script>

   第二步:我们要实现Form验证,异步提交、异步成功/失败回调

        查找提交按钮所在的form表单,所以这个提交按钮必须是在form表单里边。
        //从当前的parent查找,超过5级没查到就放弃, 并报错
       $('body').on('click', '.btn-ajaxForm',
            function() {
                //从当前的parent查找,超过5级没查到就放弃, 并报错
                var $formObj = $(this);
                for (var i = 0; i < 5; i++) {
                if ($formObj[0].nodeName == 'FORM') {
                    break;
                }
                $formObj = $formObj.parent();
        }
        if ($formObj[0].nodeName != 'FORM') {
            trz.toast.warning('没有找到你要提交的表单');
            return;
        }

        //关键点,验证表单
        var valid = trz.form.valid($formObj);
        if (!valid) {
            trz.toast.warning('验证失败,我们已经为您高亮输入错误的地方');
            return;
        }
        if ($('#trzAgree').length > 0 && !$('#trzAgree').hasClass('trzChecked')) {
                trz.toast.warning('您需要查看并同意服务条款才能继续');
            return;
        }
        var callback = $formObj.data('callback');
        var start = $formObj.data('start');
        var fail = $formObj.data('fail');
        var url = $formObj.attr('action');
        if (url.indexOf('isAjax=1') == -1) {
            url += url.indexOf('?') == -1 ? '?isAjax=1': '&isAjax=1';
       }

       var handleBySelf = $formObj.data('handlebyself') || 0;
        var params = {
                url: url,
                type: $formObj.attr('method'),
                dataType: "json",
                beforeSend: function(){
                if(start) {
                    eval(start);
                }
        },
            success: function(msg) {
                if (msg == null) {
                        trz.toast.warning('操作失败');
                }else if(handleBySelf) {
                    if (callback) {
                        eval(callback);
                    }
            } else if (msg.code > 0) {
                var toast = msg.msg;
                if (msg.errorInfo) {
                    toast = '';
                    for (var i in msg.errorInfo) {
                        toast += msg.errorInfo[i] + "\n";
                    }
            }
            trz.toast.warning(toast);
        } else {
                trz.toast.success(msg.msg);
                setTimeout(function() {
                if (callback) {
                    eval(callback);
                }
            },
            2000);
            }
        },
        error: function() {
                trz.toast.warning('操作失败');
                if(fail) {
                    eval(fail);
                }
            }
        };

       // 验证通过,提交Form
        $formObj.ajaxSubmit(params);
                return false;
    });

    第三步:表单验证的实现
    trz.form = {};
    //form 验证
    trz.form.data = {};
    trz.form.valid = function($formObj) {
        trz.form.data['valid'] = trz.form.data['valid'] | {};
        var formValid = true;
        $formObj.find('input,select,textarea').each(function() {
        var valid = true;
        var rules = $(this).attr('rules');
        var verify = $(this).attr('verify') || (rules ? 'true': 'false');

        var val = $(this).val();
        var length = val.length;
        var maxlength = ~~$(this).attr('maxlength');
        var equal = $(this).attr('equal');
        //如果是必须填写,但是没有指定规则只验证是否为空
        if (verify == 'true' && !rules) {
            if (length == 0) valid = false;
                rules = "[\\W\\w]{1,}";
        }
        if (rules) {
            //verify 为false的时候,跳过为空的情况,如果不为空就验证rules
            if (verify == 'true' || (verify == 'false' && length > 0)) {
                valid = new RegExp(rules).test(val) || (maxlength > 0 && length > maxlength);
            }
            if($(this).attr('type') == 'checkbox' || $(this).attr('type') == 'radio') {
            var name = $(this).attr("name");
            name = name.replaceAll(/\[/g, "\\[");
            name = name.replace(/\]/g, "\\]");
            if($("input[name=" + name +"]:checked").length == 0) {
                $("input[name=" + name +"]").parent().find("i").addClass('highlight-error');
                $(this).on('change',
                    function() {
                        $("input[name=" + name +"]").parent().find("i").removeClass('highlight-error');
                    });
                    formValid = false;
                }
            }
        }
        if (equal && $formObj.find('input[name="' + equal + '"]').val() != val) {
            valid = false;
        }


        if (!valid) {
                formValid = valid;
                $(this).addClass('highlight-error');
            } else {
                $(this).removeClass('highlight-error');
        }
        $(this).on('input',
            function() {
                $(this).removeClass('highlight-error');
        });
        $(this).on('change',
            function() {
                $(this).removeClass('highlight-error');
            });
            trz.form.data['valid'][$(this).attr('name')] = val;
        });
        return formValid;
    }


    


        

上一篇: 来一个bootstrap php form表单类,可以结合表单验证类一起使用

下一篇: Centos acme.sh 申请 LetsEncrypt 通配证书

33
登录 后评论.
没有帐号? 现在注册.
0 评论
Table of content