带有jQuery验证插件的Bootstrap


154

我正在尝试使用jQuery Validation Plugin将验证添加到我的表单中,但是在使用输入组时,该插件会在输入错误消息时出现问题。

问题

$('form').validate({
    rules: {
        firstname: {
            minlength: 3,
            maxlength: 15,
            required: true
        },
        lastname: {
            minlength: 3,
            maxlength: 15,
            required: true
        }
    },
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error');
    }
});

我的代码: http //jsfiddle.net/hTPY7/4/


继承应用程序瓦特/引导3,笑了,我会发现这一点,并已多年前书签它,当我最后一次继承了自举3.应用程序
阿德里安J.莫雷诺

Answers:


347

为了与twitter bootstrap 3完全兼容,我需要重写一些插件方法:

// override jquery validate plugin defaults
$.validator.setDefaults({
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error');
    },
    errorElement: 'span',
    errorClass: 'help-block',
    errorPlacement: function(error, element) {
        if(element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else {
            error.insertAfter(element);
        }
    }
});

参见示例:http : //jsfiddle.net/mapb_1990/hTPY7/7/


1
效果很好,只想提及添加$(element).removeClass(errorClass); 取消突出显示和$(element).addClass(errorClass); 突出显示您是否希望成功不使用引导帮助块类
Jay Rizzi 2013年

3
这很有效,除了一件事:对jQuery Validate 1.11.1进行测试并调用resetForm()表单的验证器不会调用unhighlight无效的元素,因此has-error在重置表单时必须手动删除该类。我要做的是调用以下函数,而不是resetForm()直接调用验证程序:function resetForm(form_id) { $(form_id).find(".form-group").removeClass("has-error"); $(form_id).data('validator').resetForm(); }
Adrian Lopez

我不知道为什么代码无法在我的表单上工作:(
Alyssa Reyes

天哪,它就像一种魅力!非常感谢!您可能节省了我一两个小时的研究时间。
racl101 2014年

1
如果您有类似Bootstrap建议的单选按钮(将无线电输入放置在标签标签中),则需要在if块中添加以下内容:else if (element.prop('type') === 'radio') { error.insertBefore(element.parent().parent()); }
Elliot Cameron

86

为了与Bootstrap 3完全兼容,我添加了对input-groupradiocheckbox的支持,而在其他解决方案中则没有。

2017年10月20日更新:检查了其他答案的建议,并增加了对单行内联特殊标记的附加支持,为一组单选框或复选框提供了更好的错误放置,并增加了对自定义.novalidation类的支持以防止控件验证。希望这会有所帮助,并感谢您的建议。

包含验证插件后,添加以下调用:

$.validator.setDefaults({
    errorElement: "span",
    errorClass: "help-block",
    highlight: function (element, errorClass, validClass) {
        // Only validation controls
        if (!$(element).hasClass('novalidation')) {
            $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
        }
    },
    unhighlight: function (element, errorClass, validClass) {
        // Only validation controls
        if (!$(element).hasClass('novalidation')) {
            $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
        }
    },
    errorPlacement: function (error, element) {
        if (element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        }
        else if (element.prop('type') === 'radio' && element.parent('.radio-inline').length) {
            error.insertAfter(element.parent().parent());
        }
        else if (element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
            error.appendTo(element.parent().parent());
        }
        else {
            error.insertAfter(element);
        }
    }
});

这适用于所有Bootstrap 3表单类。如果您使用水平形式,则必须使用以下标记。这样可以确保帮助块文本遵守form-group的验证状态(“ has-error”,...)。

<div class="form-group">
    <div class="col-lg-12">
        <div class="checkbox">
            <label id="LabelConfirm" for="CheckBoxConfirm">
                <input type="checkbox" name="CheckBoxConfirm" id="CheckBoxConfirm" required="required" />
                I have read all the information 
            </label>
        </div>
    </div>
</div>

1
我调整了errorClass: "help-block error-help-block"。我已经在使用.help-block来获取常规帮助信息,并且正在用表单验证消息覆盖它。添加第二个类使其具有唯一性,因此现在添加而不是覆盖我的“真实”帮助消息。
斯科特·斯塔福德

未调用Hilight方法
VladoPandžić16年

您好弗拉多,您能否提供更多信息,为什么它对您不起作用?
Andreas Krohn

对于一组单选按钮,这将在看起来很奇怪的第一个选项下方添加错误消息。您可能想要调整此设置以区别对待单选按钮。
Elliot Cameron

非常感谢@AndreasKrohn先生^ _ ^
Jeancarlo Fontalvo 16/12/29

23

我使用仅通过Twitter Bootstrap 3设计的表单。我为验证器设置了默认功能,并且仅使用规则运行validate方法。我使用FontAweSome中的Icons,但是您可以像文档示例中一样使用Glyphicons。

在此处输入图片说明

jQuery.validator.setDefaults({
    highlight: function (element, errorClass, validClass) {
        if (element.type === "radio") {
            this.findByName(element.name).addClass(errorClass).removeClass(validClass);
        } else {
            $(element).closest('.form-group').removeClass('has-success has-feedback').addClass('has-error has-feedback');
            $(element).closest('.form-group').find('i.fa').remove();
            $(element).closest('.form-group').append('<i class="fa fa-exclamation fa-lg form-control-feedback"></i>');
        }
    },
    unhighlight: function (element, errorClass, validClass) {
        if (element.type === "radio") {
            this.findByName(element.name).removeClass(errorClass).addClass(validClass);
        } else {
            $(element).closest('.form-group').removeClass('has-error has-feedback').addClass('has-success has-feedback');
            $(element).closest('.form-group').find('i.fa').remove();
            $(element).closest('.form-group').append('<i class="fa fa-check fa-lg form-control-feedback"></i>');
        }
    }
});

做完了 运行后验证功能:

$("#default-register-user").validate({
    rules: {
        'login': {
            required: true,
            minlength: 5,
            maxlength: 20
        },
        'email': {
            required: true,
            email: true,
            minlength: 5,
            maxlength: 100
        },
        'password': {
            required: true,
            minlength: 6,
            maxlength: 25
        },
        'confirmpassword': {
            required: true,
            minlength: 5,
            maxlength: 25,
            equalTo: "#password"
        }
    }
});

JSFiddle示例


1
为此,将有一个JSFiddle太好了
kofifus 2014年

您能张贴您用于屏幕截图的HTML吗?小提琴示例没有红色错误消息或图标。谢谢!
Christopher Francisco

Christopher Francisco,我更新了JSFiddle示例并添加了真棒的CSS。
DARK_DIESEL 2015年

嗨,很棒的解决方案!您将如何编辑它,以便仅那些具有规则的字段显示成功或失败消息?正确的代码,使所有字段显示的CSS,而不管是否有规则或不
迈克尔·史密斯

解决方案是在规则上方添加:'ignore:“ .ignore,:hidden”'。然后,将“忽略”类添加到所有您不想验证的字段中
Michael Smith

10

在上面的Miguel Borges答案上添加内容,可以通过在高亮/取消显示代码块中添加以下行来为用户提供绿色成功反馈。

    highlight: function(element) {
        $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
    }

8

这是您需要的解决方案,可以使用该errorPlacement方法覆盖将错误消息放在何处的方法

$('form').validate({
    rules: {
        firstname: {
            minlength: 3,
            maxlength: 15,
            required: true
        },
        lastname: {
            minlength: 3,
            maxlength: 15,
            required: true
        }
    },
    errorPlacement: function(error, element) {
        error.insertAfter('.form-group'); //So i putted it after the .form-group so it will not include to your append/prepend group.
    }, 
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error');
    }
});

对我来说就像魔术一样。干杯


error.insertAfter('.form-group');将错误放在所有.form-group中。但它向我展示了这个主意。谢谢
米格尔·博尔赫斯

5

对于bootstrap 4,这和我一起工作很好

    $.validator.setDefaults({
    highlight: function(element) {
        $(element).closest('.form-group').find(".form-control:first").addClass('is-invalid');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').find(".form-control:first").removeClass('is-invalid');
        $(element).closest('.form-group').find(".form-control:first").addClass('is-valid');

    },
    errorElement: 'span',
    errorClass: 'invalid-feedback',
    errorPlacement: function(error, element) {
        if(element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else {
            error.insertAfter(element);
        }
    }
});

希望对您有所帮助!


开箱即用的效果很好!我唯一添加的是validClass: 'valid-feedback'
Simon Zyx

谢谢,这对具有有效类:'valid-feedback'的Bootstrap 4来说对我有用。
Zaki Mohammed

4

这是将验证添加到表单时使用的方法:

// Adding validation to form.
        $(form).validate({
            rules: {
                title: {
                    required: true,
                    minlength: 3,
                },
                server: {
                    ipAddress: true,
                    required: true
                }   
            },
            highlight: function(element) {
                $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
            },
            success: function(element) {
                $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
            },
            errorClass: 'help-block'
        });

当使用jquery验证库时,这对Bootstrap 3样式非常有用。


3

我将其用于广播电台:

    if (element.prop("type") === "checkbox" || element.prop("type") === "radio") {
        error.appendTo(element.parent().parent());
    }
    else if (element.parent(".input-group").length) {
        error.insertAfter(element.parent());
    }
    else {
        error.insertAfter(element);
    }

这样,错误将显示在最后一个单选选项下。


非常出色的答案,谢谢-刚刚将多余的类型子句放入了我现有的errorPlacement逻辑中
thedydy 2015年

3

我知道这个问题是针对Bootstrap 3的,但是随着一些与Bootstrap 4相关的问题被重复地重定向到这个问题,这是与Bootstrap 4兼容的代码段:

$.validator.setDefaults({
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-danger');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-danger');
    },
    errorElement: 'small',
    errorClass: 'form-control-feedback d-block',
    errorPlacement: function(error, element) {
        if(element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else if(element.prop('type') === 'checkbox') {
            error.appendTo(element.parent().parent().parent());
        } else if(element.prop('type') === 'radio') {
            error.appendTo(element.parent().parent().parent());
        } else {
            error.insertAfter(element);
        }
    },
});

几个区别是:

  • 使用类has-danger代替has-error
  • 更好的错误定位收音机和复选框

Bootstrap 4不再具有这些.has-*类。getbootstrap.com/docs/4.3/migration/#forms-1
弗雷德(Fred),

2

对于bootstrap 4 beta,bootstrap的alpha版本和beta版本(以及bootstrap 3)之间存在一些较大的变化,尤其是。关于形式验证。

首先,要正确放置图标,您需要添加样式,该样式应与引导程序3中的样式相同,而不再与引导程序4 beta中的样式相同...这就是我正在使用的样式

.fa.valid-feedback,
.fa.invalid-feedback {
    position: absolute;
    right: 25px;
    margin-top: -50px;
    z-index: 2;
    display: block;
    pointer-events: none;
}

.fa.valid-feedback {
    margin-top: -28px;
}

由于beta使用控件的“状态”而不是您发布的代码无法反映的类,因此这些类也发生了变化,因此上述代码可能无法正常工作。无论如何,您需要在成功或突出显示/取消突出显示回调中向表单添加“已验证”类

$(element).closest('form').addClass('was-validated');

我还建议将新元素和类用于表单控件帮助文本

errorElement: 'small',
errorClass: 'form-text invalid-feedback',

1

这构成了领域

 $("#form_questionario").validate({
                debug: false,
                errorElement: "span",
                errorClass: "help-block",
                highlight: function (element, errorClass, validClass) {
                    $(element).closest('.form-group').addClass('has-error');
                },
                unhighlight: function (element, errorClass, validClass) {
                    $(element).closest('.form-group').removeClass('has-error');
                },
                errorPlacement: function (error, element) {
                    if (element.parent('.input-group').length || element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
                        error.insertBefore(element.parent());
                    } else {
                        error.insertAfter(element);
                    }
                },
                // Specify the validation rules
                rules: {
                        'campo1[]': 'required',
                        'campo2[]': 'required',
                        'campo3[]': 'required',
                        'campo4[]': 'required',
                        'campo5[]': 'required'
                        },

                submitHandler: function (form) {
                    form.submit();
                }
            });

1

向此https://stackoverflow.com/a/18754780/966181添加单播修复程序

$.validator.setDefaults({
    highlight: function(element) {
        $(element).closest('.form-group').addClass('has-error');
    },
    unhighlight: function(element) {
        $(element).closest('.form-group').removeClass('has-error');
    },
    errorElement: 'span',
    errorClass: 'help-block',
    errorPlacement: function(error, element) {
        if(element.parent('.input-group').length) {
            error.insertAfter(element.parent());
        } else if (element.parent('.radio-inline').length) {
            error.insertAfter(element.parent().parent());
        } else {
            error.insertAfter(element);
        }
    }
});

很简单,非常有帮助。谢谢。
Chofoteddy

0

DARK_DIESEL的回答对我很有用;这是任何想要使用glyphicons的人的代码:

jQuery.validator.setDefaults({
    highlight: function (element, errorClass, validClass) {
        if (element.type === "radio") {
            this.findByName(element.name).addClass(errorClass).removeClass(validClass);
        } else {
            $(element).closest('.form-group').removeClass('has-success has-feedback').addClass('has-error has-feedback');
            $(element).closest('.form-group').find('span.glyphicon').remove();
            $(element).closest('.form-group').append('<span class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span>');
        }
    },
    unhighlight: function (element, errorClass, validClass) {
        if (element.type === "radio") {
            this.findByName(element.name).removeClass(errorClass).addClass(validClass);
        } else {
            $(element).closest('.form-group').removeClass('has-error has-feedback').addClass('has-success has-feedback');
            $(element).closest('.form-group').find('span.glyphicon').remove();
            $(element).closest('.form-group').append('<span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span>');
        }
    }
});

0

尝试使用此示例代码。使用Jquery验证插件和其​​他方法。这是我的项目的工作代码。希望这对您有帮助

//jquery validation booking page
	
	// Wait for the DOM to be ready
$(function() {
  // Initialize form validation on the registration form.
  // It has the name attribute "registration"
  $("form[name='book']").validate({
	  //on key up validation
	  onkeyup: function(element) {
      $(element).valid(); 
    },  
    // Specify validation rules
    rules: {
      // The key name on the left side is the name attribute
      // of an input field. Validation rules are defined
      // on the right side
      fname: {
        required: true,
        lettersonly: true
        },
      lname:{
        required: true,
        lettersonly: true
        },
      email: {
        required: true,
        // Specify that email should be validated
        // by the built-in "email" rule
        email: true
      },
      password: {
        required: true,
        minlength: 5
      }
    },
    // Specify validation error messages
    messages: {
      fname: {
      required:"Please enter your firstname",
      lettersonly:"Letters allowed only"
      },
      lname: {
      required:"Please enter your lastname",
      lettersonly:"Letters allowed only"
      },
      email: "Please enter a valid email address"
    },
    // Make sure the form is submitted to the destination defined
    // in the "action" attribute of the form when valid
    submitHandler: function(form) {
      form.submit();
    }
  });
});
.error {
  color: red;
  margin-left: 5px;
  font-size:15px;
}
<script src="design/bootstrap-3.3.7-dist/js/jquery.validate.js"></script>
<script src="design/bootstrap-3.3.7-dist/js/additional-methods.js"></script>

<form name="book" id="book" action="" method="post">

    <div class="row form-group">
        <div class="col-md-6 ">
            <label class="" for="fname">First Name</label>
            <input type="text" name="fname" id="fname" class="form-control" placeholder="First Name">
        </div>
        <div class="col-md-6">
            <label class="" for="lname">Last Name</label>
            <input type="text" name="lname" id="lname" class="form-control" placeholder="Last Name">
        </div>
    </div>

    <div class="row form-group">
        <div class="col-md-6 ">
            <label class="" for="date">Date</label>
            <input type="text" id="date" class="form-control datepicker px-2" placeholder="Date of visit">
        </div>
        <div class="col-md-6">
            <label class="" for="email">Email</label>
            <input type="email" name="email" id="email" class="form-control" placeholder="Email">
        </div>
    </div>

    <div class="row form-group">
        <div class="col-md-12">
            <label class="" for="treatment">Service You Want</label>
            <select name="treatment" id="treatment" class="form-control">
                <option value="">Hair Cut</option>
                <option value="">Hair Coloring</option>
                <option value="">Perms and Curls</option>
                <option value="">Hair Conditioning</option>
                <option value="">Manicure</option>
                <option value="">Pedicure</option>
                <option value="">Nails Extension</option>
                <option value="">Nail Design</option>
                <option value="">Waxing Eyebrows</option>
                <option value="">Waxing Hands/Legs</option>
                <option value="">Full Face Waxing</option>
                <option value="">Full Body/Body Parts Wax</option>
            </select>
        </div>
    </div>

    <div class="row form-group">
        <div class="col-md-12">
            <label class="" for="note">Notes</label>
            <textarea name="note" id="note" cols="30" rows="5" class="form-control" placeholder="Write your notes or questions here..."></textarea>
        </div>
    </div>

    <div class="row form-group">
        <div class="col-md-12">
            <center><input type="submit" value="Book Now" class="btn btn-primary btn-lg"></center>
        </div>
    </div>

</form>


-1

另一个选择是提前将错误容器放置在表单组之外。然后,验证器将在必要时使用它。

<div class="form-group">
  <label class="control-label" for="new-task-due-date">When is the task due?</label>
  <div class="input-group date datepicker">
    <input type="text" id="new-task-due-date" class="required form-control date" name="dueDate" />
    <span class="input-group-addon">
      <span class="glyphicon glyphicon-calendar"></span>
    </span>                          
  </div>
  <label for="new-task-due-date" class="has-error control-label" style="display: none;"></label>
</div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.