2013-02-27 14 views
15

Con la mia configurazione di convalida jquery, ottengo il seguente errore quando si imposta onkeyup su true. Funziona se ho impostato a false, ma non ho ricevuto un feedback convalida fino a quando ho sfocatura il campo, e sto cercando di ottenere la convalida su ogni keyup:jQuery.validate.js onkeyup = errore vero

$("#signupForm").validate({ 
     onkeyup: true,   
     onclick: false 
     // rules omitted for brevity 
    } 

ottengo il seguente errore:

TypeError: validator.settings[eventType].call is not a function 
validator.settings[eventType].call(validator, this[0], event); 
jquery.validate.js line 391 
+0

Puoi creare un violino http://jsfiddle.net –

risposta

32

In realtà è necessario impostare l'opzione onkeyup ad una funzione che accetta l'elemento di essere stato approvato come parametro, in modo da provare a cambiare:

onkeyup: true, 

a

onkeyup: function(element) {$(element).valid()} 
+3

Semplicemente rimuovendo l'opzione 'onkeyup' si ripristina la funzionalità" onkeyup "già integrata nel plugin, che è un po 'più complessa di' $ (elemento) .valid() '. – Sparky

+0

Per qualche motivo, questa è stata la risposta che ha funzionato. Grazie! –

+1

@AdamLevitt, la rimozione di 'onkeyup' ripristina completamente la sua funzionalità predefinita, che è" su key-up ". Vedi: http://jsfiddle.net/ZvvTa/ – Sparky

4

@Sparky ha ragione, la risposta corretta è quella di rimuovere l'opzione onkeyup, mio ​​violino è stato lavorare perché ho rimosso l'opzione onkeyup non perché ho cambiato in keyup.

Per impostazione predefinita la convalida avverrà in caso di evento keyup, se si desidera disattivare questa funzione, è necessario aggiungere l'impostazione onkeyup: false.

Vedere la demo aggiornata.

Demo: Fiddle

+0

Questa risposta sembra decisamente buona, eppure per qualche motivo non funziona per me. –

+0

Questa risposta non funziona perché non ci sono opzioni per questo plugin. Vedi: http://docs.jquery.com/Plugins/Validation/validate#toptions – Sparky

+1

@Sparky grazie, penso che sia la seconda volta che mi stai correggendo su questo. Cercherò di non dimenticarlo di nuovo –

3
I valori booleani

non sono valori validi per l'evento onkeyup. Aggiungi invece una funzione, su ciò che è necessario fare. Provare qualcosa di simile:

onkeyup: function(element) { 
      $(element).valid(); 
    } 
    onblur: function(element) { 
     $(element).valid(); 
    } 
+1

Vero. Tuttavia, se l'OP vuole che la convalida si verifichi ad ogni evento keyup, ha semplicemente bisogno di rimuovere l'opzione 'onkeyup' per ripristinare la funzionalità" onkeyup "già integrata nel plugin. Non è nemmeno così semplice come $ (elemento) .valid() '. – Sparky

+2

Inoltre, la ** metà ** è corretta solo dichiarando che _ "i valori booleani non sono valori validi per l'evento onkeyup" _. Come da documentazione, un 'falso' booleano è il modo valido per disabilitare questa opzione. Solo un valore booleano 'true' non è valido. – Sparky

+0

Grazie .. utile sapere ... – Anusha

30

onkeyup è abilitato di default in modo che non è necessario impostarlo su true. Se lo fai, rompi la funzionalità già integrata nel plugin.

Sono disponibili tre opzioni:


1) lasciare l'opzione onkeyup di .validate(). Ciò mantiene la funzionalità onkeyupabilitata per impostazione predefinita. (Edit: "per default" significa che la convalida si verifica su ogni "key-up" evento solo dopo il campo viene inizialmente convalidato da un altro evento.)

DEMO: http://jsfiddle.net/ZvvTa/


2)onkeyup può essere impostato su false a disabilitare questa opzione.

DEMO: http://jsfiddle.net/ZvvTa/1/


3) Sostituire onkeyup con la propria funzione di callback per modificare come funziona. (Demo utilizza la funzione di default)

DEMO: http://jsfiddle.net/ZvvTa/2/

Di seguito è riportato il predefinita, non modificato la funzione, onkeyup callback:

onkeyup: function(element, event) { 
    if (event.which === 9 && this.elementValue(element) === "") { 
     return; 
    } else if (element.name in this.submitted || element === this.lastElement) { 
     this.element(element); 
    } 
} 

See: http://docs.jquery.com/Plugins/Validation/validate#toptions


EDIT:

Per impostazione predefinita, il plugin non fa alcuna convalida "key-up" fino dopo il campo viene inizialmente convalidato da un altro evento. (validazione "pigro")

Così qui è una versione più propriamente modificata della funzione di callback onkeyup che fornirà immediatoonkeyup convalida. (validazione "desideroso")

DEMO: http://jsfiddle.net/QfKk7/

onkeyup: function (element, event) { 
    if (event.which === 9 && this.elementValue(element) === "") { 
     return; 
    } else { 
     this.element(element); 
    } 
} 
+0

Sparky, grazie mille per i tuoi sforzi dedicati. Consiglierei di inserire questa funzione manualmente nell'istanza di onkeyup? O è sicuro sostituire l'implementazione predefinita nel codice jquery.validate.js? Sto assumendo il primo. –

+0

@AdamLevitt, YES, l'ipotesi iniziale è corretta. Non c'è bisogno di modificare il plugin Validate. È pensato per essere implementato all'interno dell'inizializzazione '.validate()', proprio come in [my jsFiddle] (http://jsfiddle.net/QfKk7/). – Sparky

+0

Grazie a @Sparky ... la tua terza soluzione ha risolto il mio problema "onfocusout" che non funziona la prima volta, proprio come hai detto tu. 'onfocusout: function (elemento, evento) { if (event.which === 9 && this.elementValue (element) ===" ") { return; } else { this.element (elemento); } – MarioAraya

1

ne dite di estendere onkeyup:

$('#signup-form').validate({ 

     onkeyup: function(element) { 
      var element_id = $(element).attr('id'); 
      if (this.settings.rules[element_id].onkeyup !== false) { 
       $(element).valid(); 
      } 
     }, 

Così ora all'interno di regole si può fare questo:

 rules: { 
      username: { 
       required: true, 
       minlength: 3, 
       maxlength: 25, 
       onkeyup: false, /* on blur validation */ 
      }, 
      password: { 
       required: true,     
       passwordmeter: true, 
       onkeyup: true, /* on keyup validation */ 
      }, 

Estendendo onkeyup, l'abbiamo reso un comportamento predefinito, quindi attaccare onkeyup: true è facoltativo.

+0

** Non funziona e causa un sacco di errori JavaScript **: https://jsfiddle.net/L7vza07w - Inoltre, le opzioni del plugin sono destinate a essere globali per l'intero modulo, non vengono mai assegnate su una base campo per campo all'interno dell'oggetto regole. – Sparky

+0

BTW - all'interno del metodo '.validate()', dovrebbe essere 'this.element (element)', mai '$ (elemento) .valid()'. In certe situazioni, quest'ultimo può causare un loop infinito – Sparky

Problemi correlati