Jquery Validation插件SubmitHandler Ajax只能运行一次

时间:2015-02-12 06:35:51

标签: jquery ajax jquery-validate

希望你做得很好。

所以我正在做一个注册表(对于admin),使用jquery验证插件和ajax调用来处理数据插入。这是我的表格:

<form id="add_user" class="form-horizontal" action="includes/process_adduser.php" role="form" method="post">
    <div class="form-body">
        <div class="alert alert-danger display-hide">
            <button class="close" data-close="alert"></button>
            You have some form errors. Please check below.
            </div>
        <div class="alert alert-success display-hide">
            <button class="close" data-close="alert"></button>
            Your form validation is successful!
        </div>
        <div class="form-group">
        <label class="col-md-3 control-label" for="musername">Username<span class="required">* </span></label>
        <div class="col-md-3">
            <input type="text" id="musername" name="musername" class="form-control" placeholder="Enter username"> 
        </div> 
        </div>
        <div class="form-group">
            <label class="col-md-3 control-label" for="mpassword">Password<span class="required">                                       * </span></label>
            <div class="col-md-3">
                <input type="password" id="mpassword" name="mpassword" class="form-control" placeholder="Enter password"> 
            </div> 
        </div>
        <div class="form-group">
            <label class="col-md-3 control-label" for="memail">Email <span class="required">* </span></label>
            <div class="col-md-3">
                <input type="email" id="memail" name="memail" class="form-control" placeholder="Enter email"> 
            </div> 
        </div>
        <div class="form-group">
            <label class="col-md-3 control-label" for="mname">Full name<span class="required">* </span></label>
            <div class="col-md-3">
                <input type="text" id="mname" name="mname" class="form-control" placeholder="Enter name"> 
            </div> 
        </div>
        <div class="form-group">
            <label class="col-md-3 control-label" for="mtype">User type<span class="required">* </span></label>
            <div class="col-md-3">
                <select id="mtype" name="mtype" class="form-control">
                    <option value="editor">Editor</option> 
                    <option value="ad-admin">Ad-admin</option> 
                    <option value="administrator">Administrator</option> 
                </select>
            </div> 
        </div>
        <div class="form-group">
            <label class="control-label col-md-3">Access <span class="required">* </span>
            </label>
            <div class="col-md-4">
                <div class="checkbox-list" data-error-container="#add_user_access_error">  
                <label>
                    <input type="checkbox" value="AA" class="access" name="access[]"/> AA </label> 
                    <input type="checkbox" value="BA" class="access" name="access[]"/> BA </label> 

                </div> 
                <div id="add_user_access_error"></div>
            </div>
        </div>
    </div>  
    <div class="form-actions">
        <div class="row">
            <div class="col-md-offset-3 col-md-9">
                <button type="submit" class="btn green submit">Submit</button>
                <button type="button" class="btn default">Cancel</button>
            </div>
        </div>
    </div>
    </form>

我的验证脚本:

<script>
jQuery(document).ready(function() {   
$('.submit').click(function(){
console.log("submiiiiit");
var form1 = $('#add_user');
var error1 = $('.alert-danger', form1);
var success1 = $('.alert-success', form1);

$('#add_user').validate({ 
    errorElement: 'span', //default input error message container
    errorClass: 'help-block', // default input error message class
    focusInvalid: false, // do not focus the last invalid input
    rules: {
        musername: {
            required: true
        },
        mpassword: {
            required: true
        },
        memail: {
            required: true
        },
        mname: {
            required: true
        },
        usertype: {
            required: false
        },
        'access[]': {
            required: true,
            minlength: 1
        }
    },

    messages: { 
        musername: {
            required:  "Username is required."
        },
        mpassword: {
            required:  "Password is required."
        },
        memail: {
            required:  "Email is required."
        },
        mname: {
            required:  "Name is required."
        },
        'access[]': {
            required: "Access is required.",
            minlength: "Access is required."
        }
    },

    invalidHandler: function(event, validator) { //display error alert on form submit   
        success1.hide(); 
        $('.alert-danger span').text("You have some form errors. Please check below....");      
        $('.alert-danger', $('#add_user')).show();
        Metronic.scrollTo(error1, -200);
    },

    errorPlacement: function (error, element) { // render error placement for each input type
        if (element.parent(".input-group").size() > 0) {
            error.insertAfter(element.parent(".input-group"));
        } else if (element.attr("data-error-container")) { 
            error.appendTo(element.attr("data-error-container"));
        } else if (element.parents('.radio-list').size() > 0) { 
            error.appendTo(element.parents('.radio-list').attr("data-error-container"));
        } else if (element.parents('.radio-inline').size() > 0) { 
            error.appendTo(element.parents('.radio-inline').attr("data-error-container"));
        } else if (element.parents('.checkbox-list').size() > 0) {
            error.appendTo(element.parents('.checkbox-list').attr("data-error-container"));
        } else if (element.parents('.checkbox-inline').size() > 0) { 
            error.appendTo(element.parents('.checkbox-inline').attr("data-error-container"));
        } else {
            error.insertAfter(element); // for other inputs, just perform default behavior
        }
    },

    highlight: function(element) { // hightlight error inputs
        $(element)
            .closest('.form-group').addClass('has-error'); // set error class to the control group
    },

    unhighlight: function (element) { // revert the change done by hightlight
        $(element)
            .closest('.form-group').removeClass('has-error'); // set error class to the control group
    },

    success: function (label) {
        label
            .closest('.form-group').removeClass('has-error'); // set success class to the control group
    },

    submitHandler: function (form) {
        //alert("submitting");
        var url = $(form).attr('action') ;
        var data = $(form).serialize()+'&ajax_validation=1'; 
        var accessArray = $('.access:checked').map(function() { return this.value; }).get();
        var musername = $('input[name="musername"]').val();
        var mpassword = $('input[name="mpassword"]').val();
        var memail = $('input[name="memail"]').val();
        var mname = $('input[name="mname"]').val();
        var mtype = $('select[name="mtype"]').val();     
        // form validation success, call ajax form submit
        $.ajax({
          url: url,
          data: {
            access : accessArray,
            musername: musername,
            mpassword:mpassword ,
            memail:memail ,
            mname: mname,
            mtype:mtype
          },
          type: 'POST',
          success: function(result) {   
            if(result==="ok") { 
                $("form#add_user")[0].reset();
                $('input').prop( "checked", false );
                $('.alert-success').text("New user has been added");     
                $('.alert-success', $('#add_user')).show();
            } else {    
                $('.alert-danger').text("error message here");      
                $('.alert-danger', $('#add_user')).show();
            }                   
          }
        }); return false;
    }
});

$('#add_user').keypress(function(e) {
    if (e.which == 13) {  
        if ($('#add_user').validate().form()) { 
          $('#add_user').submit(); //form validation success, call ajax form submit
        }
        return false;
    }
  });
 });    
 });
 </script>

现在,验证在用户首次提交时有效。错误消息显示正确。但是,当他们在没有刷新页面的情况下再次点击提交时,无论是否编辑表单,它都会转到includes / process_adduser.php文件 - 更糟糕的是,它会跳过我重复的用户名验证。

我在代码中遗漏了什么吗?请劝告。

很抱歉,这是一篇很长的帖子,我还在学习。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我唯一能看到的问题是如何初始化验证插件,你应该在dom ready handler上初始化插件而不是在提交点击处理程序中。

jQuery(document).ready(function () {
    var form1 = $('#add_user');
    var error1 = $('.alert-danger', form1);
    var success1 = $('.alert-success', form1);

    $('#add_user').validate({
        errorElement: 'span', //default input error message container
        errorClass: 'help-block', // default input error message class
        focusInvalid: false, // do not focus the last invalid input
        rules: {
            musername: {
                required: true
            },
            mpassword: {
                required: true
            },
            memail: {
                required: true
            },
            mname: {
                required: true
            },
            usertype: {
                required: false
            },
                'access[]': {
                required: true,
                minlength: 1
            }
        },

        messages: {
            musername: {
                required: "Username is required."
            },
            mpassword: {
                required: "Password is required."
            },
            memail: {
                required: "Email is required."
            },
            mname: {
                required: "Name is required."
            },
                'access[]': {
                required: "Access is required.",
                minlength: "Access is required."
            }
        },

        invalidHandler: function (event, validator) { //display error alert on form submit   
            success1.hide();
            $('.alert-danger span').text("You have some form errors. Please check below....");
            $('.alert-danger', $('#add_user')).show();
            Metronic.scrollTo(error1, -200);
        },

        errorPlacement: function (error, element) { // render error placement for each input type
            if (element.parent(".input-group").size() > 0) {
                error.insertAfter(element.parent(".input-group"));
            } else if (element.attr("data-error-container")) {
                error.appendTo(element.attr("data-error-container"));
            } else if (element.parents('.radio-list').size() > 0) {
                error.appendTo(element.parents('.radio-list').attr("data-error-container"));
            } else if (element.parents('.radio-inline').size() > 0) {
                error.appendTo(element.parents('.radio-inline').attr("data-error-container"));
            } else if (element.parents('.checkbox-list').size() > 0) {
                error.appendTo(element.parents('.checkbox-list').attr("data-error-container"));
            } else if (element.parents('.checkbox-inline').size() > 0) {
                error.appendTo(element.parents('.checkbox-inline').attr("data-error-container"));
            } else {
                error.insertAfter(element); // for other inputs, just perform default behavior
            }
        },

        highlight: function (element) { // hightlight error inputs
            $(element)
                .closest('.form-group').addClass('has-error'); // set error class to the control group
        },

        unhighlight: function (element) { // revert the change done by hightlight
            $(element)
                .closest('.form-group').removeClass('has-error'); // set error class to the control group
        },

        success: function (label) {
            label.closest('.form-group').removeClass('has-error'); // set success class to the control group
        },

        submitHandler: function (form) {
            alert("submitting");
            var url = $(form).attr('action');
            var data = $(form).serialize() + '&ajax_validation=1';
            var accessArray = $('.access:checked').map(function () {
                return this.value;
            }).get();
            var musername = $('input[name="musername"]').val();
            var mpassword = $('input[name="mpassword"]').val();
            var memail = $('input[name="memail"]').val();
            var mname = $('input[name="mname"]').val();
            var mtype = $('select[name="mtype"]').val();
            // form validation success, call ajax form submit
            $.ajax({
                url: url,
                data: {
                    access: accessArray,
                    musername: musername,
                    mpassword: mpassword,
                    memail: memail,
                    mname: mname,
                    mtype: mtype
                },
                type: 'POST',
                success: function (result) {
                    if (result === "ok") {
                        $("form#add_user")[0].reset();
                        $('input').prop("checked", false);
                        $('.alert-success').text("New user has been added");
                        $('.alert-success', $('#add_user')).show();
                    } else {
                        $('.alert-danger').text("error message here");
                        $('.alert-danger', $('#add_user')).show();
                    }
                }
            });
            return false;
        }
    });
});