JQuery Validation Plugin ile önyükleme


154

Formumu jQuery Validation Plugin ile doğrulama eklemek çalışıyorum, ancak giriş gruplarını kullanırken eklenti hata iletileri koyar bir sorun yaşıyorum.

sorun

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

Kodum : http://jsfiddle.net/hTPY7/4/


Bootstrap 3 ile bir uygulama devralındı, bunu bulduğuma güldü ve yıllar önce Bootstrap 3 ile bir uygulamayı devraldığımda yer imi koyduğumu güldü
Adrian J. Moreno

Yanıtlar:


347

twitter bootstrap 3 ile tam uyumluluk için, bazı eklenti yöntemlerini geçersiz kılmam gerekiyor:

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

Örneğe Bakın: http://jsfiddle.net/mapb_1990/hTPY7/7/


1
WOrks harika, sadece $ (element) .removeClass (errorClass); vurgulamak ve $ (element) .addClass (errorClass); bootstrap yardım bloğu sınıfını kullanmamak istiyorsanız vurgulamak
Jay Rizzi

3
Bu, bir şey dışında iyi çalışır: jQuery Validate 1.11.1'e karşı test etmek ve resetForm()bir formun doğrulayıcısını çağırmak unhighlight, geçersiz öğeleri çağırmaz ve has-errorbir formu sıfırlarken sınıfı el ile kaldırmayı gerekli kılar . Yaptığım şey, doğrulayıcıyı resetForm()doğrudan çağırmak yerine aşağıdaki işlevi çağırmaktır :function resetForm(form_id) { $(form_id).find(".form-group").removeClass("has-error"); $(form_id).data('validator').resetForm(); }
Adrian Lopez

Kodun neden
Alyssa Reyes

Golly tarafından bir cazibe gibi çalışır! Çok teşekkürler !!! Beni potansiyel olarak bir ya da iki saat araştırmadan kurtardın.
racl101

1
Bootstrap önerileri (etiket etiketlerinin içine yerleştirilmiş radyo girişleri) gibi radyo düğmeleriniz varsa, aşağıdaki gibi bir şey eklemek istersiniz:else if (element.prop('type') === 'radio') { error.insertBefore(element.parent().parent()); }
Elliot Cameron

86

Bootstrap 3 ile tam uyumluluk için , diğer çözümlerde eksik olan giriş grubu , radyo ve onay kutusu desteği ekledim .

Güncelleme 10/20/2017 : Diğer cevapların incelenen önerileri ve radyo hat içi özel işaretleme için ek destek , bir grup radyo veya onay kutusu için daha iyi hata yerleşimi ve kontrollerin onaylanmasını önlemek için özel bir .novalidation sınıfı desteği eklendi . Umarım bu yardımcı olur ve öneriler için teşekkürler.

Doğrulama eklentisini ekledikten sonra aşağıdaki çağrıyı ekleyin:

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

Bu, tüm Bootstrap 3 form sınıfları için geçerlidir. Yatay bir form kullanıyorsanız, aşağıdaki işaretlemeyi kullanmanız gerekir. Bu, yardım bloğu metninin form grubunun doğrulama durumlarına ("hata", ...) saygı duymasını sağlar .

<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
Ben de ayarladım errorClass: "help-block error-help-block". Zaten düzenli yardım bilgileri için .help-block kullanıyordum ve bu form doğrulama iletileri ile üzerine yazıyordu. İkinci bir sınıf eklemek onu benzersiz kıldı ve şimdi "gerçek" yardım mesajımın üzerine yazmak yerine ekliyor.
Scott Stafford

Hilight yöntemi çağrılmadı
Vlado Pandžić

Merhaba Vlado, sizin için neden işe yaramadığı hakkında daha fazla bilgi verebilir misiniz?
Andreas Krohn

Bir grup radyo düğmesi için, garip görünen ilk seçeneğin altına hata mesajı eklenecektir. Radyo düğmelerine farklı davranmak için bunu ayarlamak isteyebilirsiniz.
Elliot Cameron

Mister @AndreasKrohn ^ _ ^
Jeancarlo Fontalvo

23

Yalnızca Twitter Bootstrap 3 ile tasarlanmış formları kullanıyorum. Geçerli değerler için varsayılan işlevleri ayarladım ve yalnızca kurallarla validate yöntemini çalıştırıyorum. FontAweSome'dan Simgeler kullanıyorum, ancak Glyphicons'u doc ​​örneğinde olduğu gibi kullanabilirsiniz.

resim açıklamasını buraya girin

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

Bitti. Çalıştırdıktan sonra validate işlevi:

$("#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 örneği


1
Bunun için bir JSFiddle sahip olmak harika olurdu
kofifus

Ekran görüntüsü için kullandığınız HTML'yi gönderebilir misiniz? Keman örneğinde kırmızı biçimli hata mesajı veya simgeler yoktur. Teşekkürler!
Christopher Francisco

Christopher Francisco, JSFiddle örneğini güncelledim ve harika css yazı tipi ekledim.
DARK_DIESEL

Merhaba harika bir çözüm! Bunu yalnızca kuralları olan alanların başarı veya başarısızlık iletileri göstermesi için nasıl düzenlersiniz? Doğru kodunuz, kuralların olup olmadığına bakılmaksızın tüm alanların css görüntülemesini sağlar
Michael Smith

Çözüm: 'ignore: ".ignore,: hidden"' ifadesini kuralların hemen üstüne eklemektir. Ardından, doğrulanmasını istemediğiniz tüm alanlara bir 'yoksay' sınıfı ekleyin
Michael Smith

10

Yukarıdaki Miguel Borges cevabına ekleyerek, vurgu / unhighlight kod bloğuna aşağıdaki satırı ekleyerek kullanıcıya yeşil başarı geribildirimi verebilirsiniz.

    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

bu ihtiyacınız olan çözümdür errorPlacement, hata mesajını nereye koyacağınızı geçersiz kılmak için yöntemi kullanabilirsiniz

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

benim için sihir gibi çalışıyor. Şerefe


error.insertAfter('.form-group');tüm .form-gruplarına hatalar koyun. ama bana bu fikri gösterdi. teşekkür ederim
Miguel Borges

5

bootstrap 4 için bu iyi benimle çalışmak

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

yardımcı olacağını umuyoruz!


Bu kutudan çok iyi çalışıyor! Eklediğim tek şey olduvalidClass: 'valid-feedback'
Simon Zyx

Teşekkürler, bu benim için currentClass ile Bootstrap 4 için çalıştı: 'geçerli-geribildirim'.
Zaki Mohammed

4

Form için doğrulama eklerken kullandığım şey:

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

Bu benim için jquery doğrulama kitaplığı kullanırken Bootstrap 3 stil için çalıştı.


3

Bunu radyolar için kullandım:

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

bu şekilde hata son radyo seçeneği altında görüntülenir.


Şaşırtıcı derecede basit bir cevap, teşekkürler - sadece ekstra hata maddesini mevcut hatama yerleştirdi Yerleşim mantığı
theotherdy

3

Bu sorunun Bootstrap 3 için olduğunu biliyorum, ancak bazı Bootstrap 4 ile ilgili soru bu soruya kopya olarak yönlendirildiği için, burada Snippet Bootstrap 4 uyumlu:

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

Birkaç fark:

  • Sınıf kullanımı has-dangeryerine sınıf kullanımıhas-error
  • Daha iyi hata konumlandırma telsizleri ve onay kutuları

Bootstrap 4 artık .has-*sınıflara sahip değil. getbootstrap.com/docs/4.3/migration/#forms-1
Fred

2

Bootstrap 4 beta için, bootstrap'in alfa ve beta sürümleri (ve ayrıca bootstrap 3), esp. form doğrulaması açısından.

İlk olarak, simgeleri doğru bir şekilde yerleştirmek için bootstrap 3'te olana ve artık bootstrap 4 beta'da olmayan bir stil eklemeniz gerekir ... İşte kullandığım şey

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

Sınıflar ayrıca, yayınlanan kodunuzun yansıtmadığı sınıflar yerine beta denetimin 'durumunu' kullandığından, yukarıdaki kodunuz çalışmayabilir. Her neyse, forma 'başarı ile onaylanmış' sınıf eklemeniz başarı veya vurgulama / vurgulama geri çağrıları

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

Ayrıca form denetimi yardım metni için yeni öğe ve sınıfları kullanmanızı tavsiye ederim

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

1

Bu alanları oluşturur

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

buna https://stackoverflow.com/a/18754780/966181 telsiz satır içi düzeltme ekleyin

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

Çok basit, çok faydalı. Teşekkür ederim.
Chofoteddy

0

DARK_DIESEL'in yanıtı benim için harika çalıştı; glifikon kullanarak eşdeğerini isteyen herkes için kod:

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

Bu örnek kodu kullanmayı deneyin. Jquery doğrulama eklentisini ve ek yöntemleri kullanma. Bu, projemin çalışma kodu. Umarım bu sana yardımcı olur

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

Başka bir seçenek de hata kabını form grubunuzun dışına önceden yerleştirmektir. Doğrulayıcı daha sonra gerekirse kullanacaktır.

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.