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/

Miguel Borges
fuente
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/

Miguel Borges
fuente
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>
Andreas Krohn
fuente
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

DARK_DIESEL
fuente
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');
    }
Jose apolo
fuente
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

Drixson Oseña
fuente
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!

Jehad Ahmad Jaghoub
fuente
¡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.

Edwin Perez
fuente
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.

Marcel Overdijk
fuente
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
martpie
fuente
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',
usuario2030404
fuente
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();
                }
            });
gilcierweb
fuente
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);
        }
    }
});
bl4ckb1rd
fuente
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>');
        }
    }
});
jamshehan
fuente
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>

Abhishek Yadav
fuente
-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>
Neve12ende12
fuente