jQuery Validate Plugin - Come creare una semplice regola personalizzata?


351

Come si crea una regola semplice e personalizzata utilizzando il plug-in jQuery Validate (utilizzando addMethod) che non utilizza un regex?

Ad esempio, quale funzione creerebbe una regola che convalida solo se è selezionata almeno una delle caselle di controllo?


41
95 voti positivi, suppongo che questo significhi bassistance.de/jquery-plugins/jquery-plugin-validation la documentazione potrebbe non essere chiara: P
Simon Arnold

Non so se stai ancora cercando (4 anni dopo), ma questo potrebbe aiutare learn.jquery.com/plugins/…
Ron van der Heijden,

Risposte:


376

Puoi creare una semplice regola facendo una cosa del genere:

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

E quindi applicandolo in questo modo:

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

Basta modificare il contenuto di 'addMethod' per convalidare le caselle di controllo.


23
Cos'è this.optional (elemento) || facendo in quella funzione? Sembra che ogni regola lo abbia, ma non so dire perché sarebbe rilevante per qualsiasi regola tranne "obbligatorio".
machineghost,

38
Lasciarlo significherebbe che il metodo sarebbe sempre applicato, anche quando l'elemento non è richiesto.
Mark Spangler,

Presumo che this.optional (element) restituisca vero se element è null?
tnunamak,

12
per l'esecuzione, "quantità" dovrebbe essere l'id e il nome di alcuni elementi nella pagina?
Hoàng Long,

6
Sì, importo si riferisce all'attributo name di alcuni campi del modulo di input.
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"
            }
        }
    });
});

Ho provato questo metodo e funziona abbastanza bene, tuttavia, gli uomini che restituiscono qualsiasi altro messaggio che non sia vero non convalida ancora "ok" è bloccato in "Nome utente è già preso", cosa può esserci di sbagliato? ho anche verificato che sia restituito correttamente facendo eco ai valori invece di restituire false e true, e questo funziona. mi sembra che il mio browser non stia rilevando il ritorno false, return true? questo mi sta facendo impazzire ..
Mikelangelo,

1
ha funzionato inserendo una variabile che si chiama risultato prima dell'aggiunta, sembra che i valori veri, falsi si stiano registrando correttamente nella funzione di successo
Mikelangelo,

23
Stai attento con questo. Questo non è un codice completamente funzionale in quanto il "successo" di AJAX tornerà dopo "risposta di ritorno"; corre, causando comportamenti inaspettati
Malachia il

1
@Malachi è corretto. Questo può essere risolto eseguendo una chiamata di sincronizzazione, ma è brutto. Mi chiedo se ci sia un altro modo per raggiungere questo obiettivo? C'è remotecome altri hanno suggerito, ma per quanto posso dire che consente solo una convalida, quindi non funzionerebbe se è necessario eseguire due convalide asincrone o avere più messaggi di errore a seconda della risposta.
Adam Bergmark,

2
esiste un metodo remoto per validare jquery: jqueryvalidation.org/remote-method
TecHunter

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 è una bella aggiunta alla risposta.
Quattro

@commonpike Questo è esattamente quello che stavo cercando, grazie mille.
Simba,

46

Regola personalizzata e attributo dati

È possibile creare una regola personalizzata e collegarla a un elemento utilizzando l' dataattributo utilizzando la sintassidata-rule-rulename="true";

Quindi per verificare se almeno uno di un gruppo di caselle di controllo è spuntato:

Dati-regola-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");

E puoi anche sovrascrivere il messaggio di una regola (cioè: Atleast 1 deve essere selezionato) usando la sintassi data-msg-rulename="my new message".

NOTA

Se si utilizza il data-rule-rulenamemetodo, è necessario assicurarsi che il nome della regola sia tutto minuscolo. Questo perché la funzione di convalida jQuery si dataRulesapplica .toLowerCase()al confronto e le specifiche HTML5 non consentono maiuscole.

Esempio di lavoro

$.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
solo per jquery.validate ver> = 1.10
Pavel Nazarov,

Per la mia vita non sono riuscito a trovarlo nella documentazione ufficiale, vorrei che lo chiarissero. Grazie!
Josh Mc

22

Grazie, ha funzionato!

Ecco il codice finale:

$.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

Puoi aggiungere una regola personalizzata come questa:

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

E aggiungilo come una regola come questa:

PhoneToggle: {
    booleanRequired: 'on'
}        

1

In questo caso: modulo di registrazione utente, l'utente deve scegliere un nome utente non utilizzato.

Ciò significa che dobbiamo creare una regola di convalida personalizzata, che invierà una richiesta http asincrona con il server remoto.

  1. crea un elemento di input nel tuo html:
<input name="user_name" type="text" >
  1. dichiarare le regole di convalida del modulo:
  $("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. il codice remoto dovrebbe essere come:
class Interface::UsersController < ActionController::Base
  def is_username_valid
    render :text => !User.exists?(:user_name => params[:user_name])
  end
end
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.