jQuery Validate Plugin - Basit bir özel kural nasıl oluşturulur?


351

Normal ifade kullanmayan jQuery Validate eklentisini (kullanarak addMethod) kullanarak basit, özel bir kural nasıl oluşturulur ?

Örneğin, hangi işlev yalnızca bir grup onay kutusundan en az biri işaretlenirse geçerli olan bir kural oluşturur?


41
95 oy, sanırım bu ortalama bassistance.de/jquery-plugins/jquery-plugin-validation belgeleri belirsiz olabilir: P
Simon Arnold

Hala (4 yıl sonra) arama yapıp yapmadığınızı bilmiyorum, ancak bu öğrenmenize
Ron van der Heijden

Yanıtlar:


376

Bunun gibi bir şey yaparak basit bir kural oluşturabilirsiniz:

jQuery.validator.addMethod("greaterThanZero", function(value, element) {
    return this.optional(element) || (parseFloat(value) > 0);
}, "* Amount must be greater than zero");

Ve sonra bunu şöyle uygulayın:

$('validatorElement').validate({
    rules : {
        amount : { greaterThanZero : true }
    }
});

Onay kutularınızı doğrulamak için 'addMethod' içeriğini değiştirmeniz yeterlidir.


23
Bu nedir. İsteğe bağlı (öğe) || bu işlevde ne yapıyor? Her kurala sahip gibi görünüyor, ama neden "zorunlu" dışında herhangi bir kural için uygun olacağını söyleyemem.
machineghost

38
Dışarıda bırakmak, eleman gerekli olmasa bile yöntemin her zaman uygulanacağı anlamına gelir.
Mark Spangler

Öğe null olursa this.optional (element) doğru döndürür mü?
tnunamak

12
çalışması için, "miktar" sayfadaki bazı öğelerin kimliği ve adı olmalıdır?
Hoàng Long

6
Evet, miktar, bazı giriş formu alanının ad niteliğini ifade eder.
Mark Spangler

96
$(document).ready(function(){
    var response;
    $.validator.addMethod(
        "uniqueUserName", 
        function(value, element) {
            $.ajax({
                type: "POST",
                url: "http://"+location.host+"/checkUser.php",
                data: "checkUsername="+value,
                dataType:"html",
                success: function(msg)
                {
                    //If username exists, set response to true
                    response = ( msg == 'true' ) ? true : false;
                }
             });
            return response;
        },
        "Username is Already Taken"
    );

    $("#regFormPart1").validate({
        username: {
            required: true,
            minlength: 8,
            uniqueUserName: true
        },
        messages: {
            username: {
                required: "Username is required",
                minlength: "Username must be at least 8 characters",
                uniqueUserName: "This Username is taken already"
            }
        }
    });
});

Bu yöntemi denedim ve oldukça iyi çalışıyor, ancak, yine de "Tamam" başka bir msg döndüren erkekler hala "Tamam" takılı "Kullanıcı adı zaten alınmış", ne yanlış olabilir? Ayrıca yanlış ve doğru döndürme yerine değerleri yankılanarak düzgün döndürüldüğünü kontrol ettim ve bu çalışır. bana öyle geliyor ki tarayıcım dönüş yanlış almak değil, dönüş doğru? Bu beni çıldırtıyor ..
Mikelangelo

1
addethod'dan önce sonuç olarak adlandırılan bir değişken ekleyerek işe yaradı, gerçek, yanlış değerler başarı işlevi içinde düzgün kaydediliyor gibi görünüyor
Mikelangelo 27:10

23
Buna dikkat et. Bu tamamen işlevsel bir kod değildir, çünkü AJAX "başarılı", "dönüş yanıtı" ndan sonra geri gelecektir; , beklenmedik davranışlara neden olur
Malachi

1
@Malachi doğru. Bu, bunun yerine bir senkronizasyon çağrısı yaparak düzeltilebilir, ancak bu kötü. Bunu başarmanın başka bir yolu var mı acaba? Orada remotebaşkaları artan ama olmadı çalışma iki zaman uyumsuz doğrulamaları için gereken veya yanıta bağlı olarak birkaç hata iletileri olurdu eğer öyleyse bildiğim kadarıyla söyleyebilirim bu sadece bir doğrulama olanağı sağladığından yararlıdır.
Adam Bergmark

2
jquery validate için uzak bir yöntem var: jqueryvalidation.org/remote-method
TecHunter 22:14

70
// add a method. calls one built-in method, too.
jQuery.validator.addMethod("optdate", function(value, element) {
        return jQuery.validator.methods['date'].call(
            this,value,element
        )||value==("0000/00/00");
    }, "Please enter a valid date."
);

// connect it to a css class
jQuery.validator.addClassRules({
    optdate : { optdate : true }    
});

7
addClassRules cevaba güzel bir ektir.
Dört

@commonpike Tam da aradığım şey bu, Çok teşekkürler.
Simba

46

Özel Kural ve veri özelliği

Özel bir kural oluşturabilir ve bunu kullanarak bir öğeye ekleyebilirsiniz. data ve sözdizimini kullanarak özelliği kullanarakdata-rule-rulename="true";

Bu nedenle, bir grup onay kutusundan en az birinin işaretli olup olmadığını kontrol etmek için:

veri kural oneormorechecked

<input type="checkbox" name="colours[]" value="red" data-rule-oneormorechecked="true" />

addMethod

$.validator.addMethod("oneormorechecked", function(value, element) {
   return $('input[name="' + element.name + '"]:checked').length > 0;
}, "Atleast 1 must be selected");

Ayrıca , sözdizimini kullanarak bir kuralın iletisini geçersiz kılabilirsiniz (örneğin: En az 1 seçilmelidir) . data-msg-rulename="my new message" .

NOT

data-rule-rulenameYöntemi kullanırsanız, kural adının tamamen küçük olduğundan emin olmanız gerekir. JQuery doğrulama işlevi Bunun nedeni dataRulesde geçerlidir .toLowerCase()karşılaştırabilir ve HTML5 büyük harfe izin vermemesidir.

Çalışma Örneği

$.validator.addMethod("oneormorechecked", function(value, element) {
  return $('input[name="' + element.name + '"]:checked').length > 0;
}, "Atleast 1 must be selected");

$('.validate').validate();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.min.js"></script>

<form class="validate">
    red<input type="checkbox" name="colours[]" value="red" data-rule-oneormorechecked="true" data-msg-oneormorechecked="Check one or more!" /><br/>
    blue<input type="checkbox" name="colours[]" value="blue" /><br/>
    green<input type="checkbox" name="colours[]" value="green" /><br/>
    <input type="submit" value="submit"/>
</form>


2
only jquery.validate ver> = 1.10
Pavel Nazarov

Hayatım boyunca bunu resmi belgelerde bulamadım, keşke daha açık hale getirselerdi. Teşekkürler!
Josh Mc

22

Teşekkürler, işe yaradı!

İşte son kod:

$.validator.addMethod("greaterThanZero", function(value, element) {
    var the_list_array = $("#some_form .super_item:checked");
    return the_list_array.length > 0;
}, "* Please check at least one check box");

13

Bunun gibi özel bir kural ekleyebilirsiniz:

$.validator.addMethod(
    'booleanRequired',
    function (value, element, requiredValue) {
        return value === requiredValue;
    },
    'Please check your input.'
);

Ve böyle bir kural olarak ekleyin:

PhoneToggle: {
    booleanRequired: 'on'
}        

1

Bu durumda: kullanıcı kayıt formu, kullanıcının alınmayan bir kullanıcı adı seçmesi gerekir.

Bu, uzak sunucu ile zaman uyumsuz http isteği gönderecek özelleştirilmiş bir doğrulama kuralı oluşturmamız gerektiği anlamına gelir.

  1. html'nizde bir giriş öğesi oluşturun:
<input name="user_name" type="text" >
  1. form doğrulama kurallarınızı beyan edin:
  $("form").validate({
    rules: {
      'user_name': {
        //  here jquery validate will start a GET request, to 
        //  /interface/users/is_username_valid?user_name=<input_value>
        //  the response should be "raw text", with content "true" or "false" only
        remote: '/interface/users/is_username_valid'
      },
    },
  1. uzaktan kod şöyle olmalıdır:
class Interface::UsersController < ActionController::Base
  def is_username_valid
    render :text => !User.exists?(:user_name => params[:user_name])
  end
end
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.