Bootstrap con jQuery Validation Plugin


154

Estoy tratando de agregar validación a mi formulario con jQuery Validation Plugin, pero tengo un problema en el que el complemento pone los mensajes de error cuando estoy usando grupos de entrada.

el problema

$('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');
    }
});

Mi código: http://jsfiddle.net/hTPY7/4/


Heredé una aplicación con Bootstrap 3, me reí de haber encontrado esto y lo había marcado hace años la última vez que heredé una aplicación con Bootstrap 3.
Adrian J. Moreno

Respuestas:


347

Para una compatibilidad total con Twitter Bootstrap 3, necesito anular algunos métodos de complementos:

// 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);
        }
    }
});

Ver ejemplo: http://jsfiddle.net/mapb_1990/hTPY7/7/


1
Funciona genial, solo quería mencionar agregar $ (elemento) .removeClass (errorClass); para resaltar y $ (elemento) .addClass (errorClass); para resaltar si desea tener éxito al no utilizar la clase de bloque de ayuda bootstrap
Jay Rizzi

3
Esto funciona bien, excepto por una cosa: probar contra jQuery Validate 1.11.1 y llamar resetForm()al validador de un formulario no invocará unhighlightelementos no válidos, por lo que es necesario eliminar la has-errorclase a mano al restablecer un formulario. Lo que hago es llamar a la siguiente función en lugar de llamar resetForm()directamente al validador :function resetForm(form_id) { $(form_id).find(".form-group").removeClass("has-error"); $(form_id).data('validator').resetForm(); }
Adrián López

No sé por qué el código no funciona en mi formulario :(
Alyssa Reyes

¡Por Dios, funciona como un encanto! Muchas gracias !!! Me ahorraste potencialmente una o dos horas de investigación.
racl101

1
Si tiene botones de radio como Bootstrap sugiere (entradas de radio colocadas dentro de etiquetas de etiquetas), querrá agregar algo como esto si bloquea:else if (element.prop('type') === 'radio') { error.insertBefore(element.parent().parent()); }
Elliot Cameron

86

Para una compatibilidad total con Bootstrap 3, agregué soporte para grupo de entrada , radio y casilla de verificación , que faltaba en las otras soluciones.

Actualización 20/10/2017 : Inspeccioné las sugerencias de las otras respuestas y agregó soporte adicional para marcado especial de radio en línea , mejor ubicación de errores para un grupo de radios o casillas de verificación y soporte agregado para una clase personalizada de validación para evitar la validación de los controles. Espero que esto ayude y gracias por las sugerencias.

Después de incluir el complemento de validación, agregue la siguiente llamada:

$.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);
        }
    }
});

Esto funciona para todas las clases de formulario Bootstrap 3. Si usa una forma horizontal, debe usar el siguiente marcado. Esto garantiza que el texto del bloque de ayuda respeta los estados de validación ("has-error", ...) del grupo de formularios .

<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
Yo pellizqué errorClass: "help-block error-help-block". Ya estaba usando .help-block para obtener información de ayuda regular, y esto lo sobrescribía con mensajes de validación de formularios. Agregar una segunda clase lo hizo único y ahora se agrega en lugar de sobrescribir mi mensaje de ayuda "real".
Scott Stafford

Método Hilight no llamado
Vlado Pandžić

Hola Vlado, ¿podrías darnos más información por qué no te funciona?
Andreas Krohn

Para un grupo de botones de opción, esto agregará el mensaje de error debajo de la primera opción que se ve raro. Es probable que desee ajustar esto para tratar los botones de radio de manera diferente.
Elliot Cameron

Muchas gracias señor @AndreasKrohn ^ _ ^
Jeancarlo Fontalvo

23

Utilizo formularios diseñados solo con Twitter Bootstrap 3. Establezco funciones predeterminadas para validor y ejecuto solo el método de validación con reglas. Yo uso los iconos de FontAweSome, pero puedes usar Glyphicons como en el ejemplo del documento.

ingrese la descripción de la imagen aquí

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>');
        }
    }
});

Hecho. Después de ejecutar la función de validación:

$("#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"
        }
    }
});

Ejemplo de JSFiddle


1
Sería bueno tener un jsFiddle para este
kofifus

¿Podría publicar el HTML que utilizó para la captura de pantalla, por favor? El ejemplo de violín no tiene el mensaje de error de estilo rojo ni los íconos. ¡Gracias!
Christopher Francisco

Christopher Francisco, actualicé el ejemplo de JSFiddle y agregué una fuente css impresionante.
DARK_DIESEL

Hola gran solución! ¿Cómo editaría esto para que solo aquellos campos que tienen reglas muestren mensajes de éxito o error? Correcto, su código hace que todos los campos muestren el CSS, independientemente de si hay reglas o no
Michael Smith

La solución es agregar: 'ignorar: ".ignore,: hidden"' justo arriba de las reglas. Luego, simplemente agregue una clase 'ignorar' a todos los campos que no desee validar
Michael Smith el

10

Al agregar a Miguel Borges la respuesta anterior, puede darle al usuario esa retroalimentación de éxito verde agregando la siguiente línea en el bloque de código resaltado / resaltado.

    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

esta es la solución que necesita, puede usar el errorPlacementmétodo para anular dónde colocar el mensaje de error

$('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');
    }
});

A mí me funciona como magia. Salud


error.insertAfter('.form-group');poner errores en todos los .form-group. Pero me mostró la idea. gracias
Miguel Borges

5

para Bootstrap 4 esto funciona bien conmigo

    $.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);
        }
    }
});

Espero que ayude!


¡Esto funciona muy bien! Lo único que agregué fuevalidClass: 'valid-feedback'
Simon Zyx el

Gracias, esto funcionó para mí para Bootstrap 4 con validClass: 'valid-feedback'.
Zaki Mohammed

4

Esto es lo que uso cuando agrego validación al formulario:

// 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'
        });

Esto funcionó para mí para el estilo Bootstrap 3 al usar la biblioteca de validación jquery.


3

Usé esto para la radio:

    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);
    }

de esta manera, el error se muestra en la última opción de radio.


Brillantemente respuesta sencilla, gracias - simplemente ranurados la cláusula de tipo extra en mi lógica existente errorPlacement
theotherdy

3

Sé que esta pregunta es para Bootstrap 3, pero como algunas preguntas relacionadas con Bootstrap 4 se redirigen a esta como duplicadas, aquí está el fragmento compatible con 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);
        }
    },
});

Las pocas diferencias son:

  • El uso de la clase en has-dangerlugar dehas-error
  • Mejores errores de posicionamiento de radios y casillas de verificación

Bootstrap 4 ya no tiene las .has-*clases. getbootstrap.com/docs/4.3/migration/#forms-1
Fred

2

Para el bootstrap 4 beta hubo algunos cambios importantes entre las versiones alfa y beta de bootstrap (y también bootstrap 3), especialmente. en lo que respecta a la validación de formularios.

Primero, para colocar los íconos correctamente, necesitará agregar un estilo que equivalga a lo que estaba en Bootstrap 3 y ya no en Bootstrap 4 beta ... esto es lo que estoy usando

.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;
}

Las clases también han cambiado ya que la versión beta utiliza el "estado" del control en lugar de las clases que su código publicado no refleja, por lo que su código anterior puede no funcionar. De todos modos, deberá agregar la clase 'fue validada' al formulario en el éxito o resaltar / resaltar devoluciones de llamada

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

También recomendaría usar el nuevo elemento y clases para el texto de ayuda de control de formulario

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

1

Esto conforma los campos.

 $("#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

agregue una solución de radio en línea a este 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);
        }
    }
});

Es simple, es muy útil. Gracias.
Chofoteddy

0

La respuesta de DARK_DIESEL funcionó muy bien para mí; Aquí está el código para cualquiera que quiera el equivalente usando glifos:

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

Intenta usar este código de muestra. Usando el complemento de validación Jquery y métodos adicionales. Este es el código de trabajo para mi proyecto. Espero que esto te ayude

//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

Otra opción es colocar un contenedor de errores fuera de su grupo de formularios con anticipación. El validador lo usará si es necesario.

<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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.