Bootstrap con jQuery Validation Plugin


154

Sto cercando di aggiungere la convalida al mio modulo con jQuery Validation Plugin, ma sto riscontrando un problema in cui il plug-in inserisce i messaggi di errore quando utilizzo i gruppi di input.

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

Il mio codice: http://jsfiddle.net/hTPY7/4/


Ereditato da un'app con Bootstrap 3, ho riso di averlo trovato e l'ho aggiunto ai preferiti anni fa quando ho ereditato l'ultima app con Bootstrap 3.
Adrian J. Moreno,

Risposte:


347

per la totale compatibilità con Twitter Bootstrap 3, ho bisogno di sostituire alcuni metodi di plugin:

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

Vedi esempio: http://jsfiddle.net/mapb_1990/hTPY7/7/


1
Bene, volevo solo menzionare l'aggiunta di $ (element) .removeClass (errorClass); per deselezionare e $ (element) .addClass (errorClass); per evidenziare se si desidera avere successo nel non utilizzare la classe di blocco di bootstrap
Jay Rizzi,

3
Funziona bene, ad eccezione di una cosa: il test contro jQuery Validate 1.11.1 e la chiamata resetForm()al validatore di un modulo non invoca unhighlightelementi non validi, rendendo necessario rimuovere la has-errorclasse manualmente quando si reimposta un modulo. Quello che faccio è chiamare la seguente funzione invece di chiamare resetForm()direttamente il validatore :function resetForm(form_id) { $(form_id).find(".form-group").removeClass("has-error"); $(form_id).data('validator').resetForm(); }
Adrian Lopez,

Non so perché il codice non funzioni nel mio modulo :(
Alyssa Reyes

A malincuore funziona come un fascino! Grazie mille !!! Mi hai risparmiato potenzialmente un'ora o due di ricerche.
racl101,

1
Se hai pulsanti di opzione come suggerisce Bootstrap (ingressi radio posizionati all'interno dei tag dell'etichetta), ti consigliamo di aggiungere qualcosa del genere a questo se blocco: else if (element.prop('type') === 'radio') { error.insertBefore(element.parent().parent()); }
Elliot Cameron

86

Per la piena compatibilità con Bootstrap 3 ho aggiunto il supporto per gruppo di input , radio e casella di controllo , che mancava nelle altre soluzioni.

Aggiornamento 20/10/2017 : ispezionati suggerimenti delle altre risposte e aggiunto supporto aggiuntivo per markup speciali di radio-inline , migliore posizionamento degli errori per un gruppo di radio o caselle di controllo e supporto aggiunto per una .novalidation personalizzata classe per impedire la convalida dei controlli. Spero che questo aiuti e grazie per i suggerimenti.

Dopo aver incluso il plug-in di convalida aggiungere la seguente chiamata:

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

Funziona con tutte le classi di moduli Bootstrap 3. Se usi una forma orizzontale devi usare il seguente markup. Questo assicura che il testo del blocco della guida rispetti gli stati di convalida ("errore", ...) del gruppo di moduli .

<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
Ho ottimizzato errorClass: "help-block error-help-block". Stavo già usando .help-block per informazioni di aiuto regolari, e questo lo stava sovrascrivendo con i messaggi di convalida del modulo. L'aggiunta di una seconda classe l'ha resa unica e così ora aggiunge e non sovrascrive il mio "vero" messaggio di aiuto.
Scott Stafford,

Metodo Hilight non chiamato
Vlado Pandžić

Ciao Vlado, potresti darci qualche informazione in più perché non funziona per te?
Andreas Krohn,

Per un gruppo di pulsanti di opzione, questo aggiungerà il messaggio di errore sotto la prima opzione che sembra strana. Probabilmente vuoi modificarlo per trattare i pulsanti di opzione in modo diverso.
Elliot Cameron,

Grazie mille Mister @AndreasKrohn ^ _ ^
Jeancarlo Fontalvo,

23

Uso i moduli progettati solo con Twitter Bootstrap 3. Ho impostato funzioni predefinite per validatore ed eseguo solo il metodo di convalida con regole. Uso le icone di FontAweSome, ma puoi usare Glyphicons come nell'esempio di doc.

inserisci qui la descrizione dell'immagine

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

Fatto. Dopo l'esecuzione convalidare la funzione:

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

JS Esempio di violino


1
Sarebbe bello avere un JSFiddle per questo
kofifus il

Potresti pubblicare l'HTML che hai usato per lo screenshot, per favore? L'esempio del violino non ha il messaggio di errore in stile rosso né le icone. Grazie!
Christopher Francisco,

Christopher Francisco, ho aggiornato l'esempio di JSFiddle e aggiungo font css fantastico.
DARK_DIESEL,

Ciao ottima soluzione! Come modificheresti questo in modo che solo quei campi con regole mostrino messaggi di successo o fallimento? Giusto il tuo codice fa sì che tutti i campi visualizzino i CSS, indipendentemente dal fatto che ci siano delle regole o meno
Michael Smith,

La soluzione è aggiungere: 'ignore: ".ignore,: hidden"' proprio sopra le regole. Quindi aggiungi semplicemente una classe "ignora" a tutti i campi che non desideri vengano convalidati
Michael Smith,

10

Aggiungendo alla risposta Miguel Borges sopra puoi dare all'utente un feedback di successo verde aggiungendo la seguente riga nel blocco di codice evidenziazione / non evidenziazione.

    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

questa è la soluzione di cui hai bisogno, puoi usare il errorPlacementmetodo per sovrascrivere dove inserire il messaggio di errore

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

funziona per me come per magia. Saluti


error.insertAfter('.form-group');inserire errori in tutto il gruppo .form. ma mi ha mostrato l'idea. grazie
Miguel Borges,

5

per bootstrap 4 funziona bene con me

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

spero che possa aiutare!


Funziona molto bene! L'unica cosa che ho aggiunto è statavalidClass: 'valid-feedback'
Simon Zyx il

Grazie, questo ha funzionato per me per Bootstrap 4 con validClass: 'valid-feedback'.
Zaki Mohammed,

4

Ecco cosa uso quando aggiungo la convalida al modulo:

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

Questo ha funzionato per me con lo stile Bootstrap 3 quando ho usato la libreria di validazione jquery.


3

L'ho usato per 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);
    }

in questo modo l'errore viene visualizzato nell'ultima opzione radio.


Brillantemente risposta semplice, grazie - solo piazzando la clausola di tipo più nella mia logica errorPlacement esistente
theotherdy

3

So che questa domanda è per Bootstrap 3, ma poiché alcune domande correlate a Bootstrap 4 vengono reindirizzate a questa come duplicati, ecco lo snippet compatibile 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);
        }
    },
});

Le poche differenze sono:

  • L'uso della classe has-dangeranzichéhas-error
  • Migliori errori nel posizionamento di radio e caselle di controllo

Bootstrap 4 non ha più le .has-*classi. getbootstrap.com/docs/4.3/migration/#forms-1
Fred

2

Per il bootstrap 4 beta ci sono stati alcuni grandi cambiamenti tra le versioni alpha e beta di bootstrap (e anche bootstrap 3), esp. per quanto riguarda la validazione dei moduli.

Innanzitutto, per posizionare correttamente le icone dovrai aggiungere uno stile equivalente a quello che era in bootstrap 3 e non più in bootstrap 4 beta ... ecco cosa sto 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;
}

Le classi sono cambiate anche quando la beta usa lo 'stato' del controllo piuttosto che le classi che il tuo codice pubblicato non riflette, quindi il tuo codice sopra potrebbe non funzionare. Ad ogni modo, dovrai aggiungere la classe "convalidata" al modulo sia in caso di successo che di richiami di evidenziazione / non evidenziazione

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

Vorrei anche raccomandare di utilizzare il nuovo elemento e le classi per il testo della guida al controllo dei moduli

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

1

Questo compone i campi

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

aggiungere la correzione radio in linea a questo 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);
        }
    }
});

È semplice, è molto utile. Grazie.
Chofoteddy,

0

La risposta di DARK_DIESEL ha funzionato benissimo per me; ecco il codice per chiunque desideri l'equivalente usando i glyphylons:

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

Prova a usare questo codice di esempio. Utilizzo del plug-in di convalida Jquery e metodi aggiuntivi. Questo è il codice di lavoro per il mio progetto. Spero che questo ti aiuti

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

Un'altra opzione consiste nel posizionare in anticipo un contenitore errori al di fuori del gruppo di moduli. Il validatore lo utilizzerà quindi, se necessario.

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.