2011-10-16 10 views
16

Sto usando jQuery Validate plugin v.1.9.0 funziona molto bene. Ma sto affrontando questo problema, una volta che l'utente invia il modulo & se ci sono errori, visualizza correttamente il messaggio di errore. Il problema è che non aggiorna il messaggio se l'utente intraprende un'azione per porre rimedio a tale errore. Per esempio. se è richiesto un campo, al primo messaggio, l'utente inizia a digitare, quindi quel messaggio dovrebbe sparire.Uso del plugin jQuery validate: onfocusout, onkeyup notworking come previsto sul sito di produzione

nella documentazione si afferma che onfocusout & onkeyup sono utilizzati per questo scopo & di default sono impostate su true. La cosa divertente è che sembra funzionare sulla mia workstation locale ma fallisce (silenziosamente) una volta che ho caricato il mio codice sul sito di produzione. Ho pensato che stavo scherzando regalmente in qualche modo così ho sparato jsfiddle and put relevant code per vedere se succede anche lì.

Sono rimasto stupito nel vedere che succede anche lì. Quindi la mia domanda è: perché funziona sulla mia macchina locale ma non sui siti di produzione?

P.S. Self-contained esempio a http://jsfiddle.net/tankchintan/cge44/5/

UPDATE

Per replicare il problema, fare -

  1. Vai alla pagina jsfiddle.
  2. Senza compilare nessun campo premere invia il modulo.
  3. Mostrerà un messaggio di errore accanto a ciascun campo.
  4. Ora inizia a digitare in uno qualsiasi dei campi.
  5. Si noterà che il messaggio di errore non scompare, anche se la regola è soddisfatta. Sulla mia macchina locale l'errore di mesaage va via, una volta che ho digitato qualcosa sul campo.

risposta

16

Questo problema esiste anche in alcuni degli esempi sul sito web JQuery.

Ho trovato che il problema si verifica quando l'elemento di input non ha alcun tipo. I browser Web presumono che il tipo sia "testo" se non specificato, ma jquery.validate ha un problema con questo. Il vostro elemento di input dovrebbe essere simile a questo:

<input id="cname" name="name" type="text" class="required" minlength="2" /> 
+0

Questo ha funzionato per me ... aveva alcuni elementi di input mancanti del tipo. Una volta aggiunto, la convalida ha funzionato perfettamente su questi elementi. Non sono sicuro del motivo per cui questo non è stato selezionato come risposta. –

+2

Tutti i miei input specificano il tipo e sto riscontrando lo stesso problema. Se inizio a digitare, non innescare il validatore finché non faccio clic sull'ingresso (sfocatura). Ma quando torno all'input e digito, la key-up agisce come previsto dopo ogni colpo successivo. È solo il primo clic/tipo che non funziona come previsto. Dovendo aggiungere manualmente eventi onkeyup per riattivare il validatore ... deludente. –

+4

EDIT: Questo spiega il comportamento, la documentazione dello stato "Prima di un campo è contrassegnato come non valido, la convalida è pigro: Prima di inviare il modulo per la prima volta, l'utente può scheda attraverso i campi senza ottenere messaggi fastidiosi - egli non si ottiene intercettato prima che avesse la possibilità di inserire effettivamente un valore corretto " –

0

Penso che il comportamento predefinito sia quello di nascondere solo quel messaggio quando il campo viene convalidato ad es. "Inserisci un indirizzo email valido" scompare dopo aver inserito "[email protected]", che a mio avviso ha senso.

Vedi demo: http://jquery.bassistance.de/validate/demo/

Penso che si potrebbe cercare di fare qualcosa di simile a questo: jquery validate: focusCleanup: true and focusInvalid: false don't work as expected

+0

Grazie per la risposta. In realtà sto cercando di fare esattamente quello che sta succedendo nel link dimostrativo che hai inviato. Voglio solo che il comportamento predefinito/standard del messaggio di errore scompaia quando l'utente intraprende un'azione in tal senso. Puoi anche vederlo dal link jsfiddle che ho inviato. – Chantz

2

A quanto pare questo non funziona se la libreria jQuery è troppo nuovo. Stavo vivendo la stessa cosa, il ripristino da jquery v1.7.2 alla v1.3.2 risolveva il problema.

La pagina di esempio su http://jquery.bassistance.de/validate/demo/ utilizza 1.3.2, ma non sono sicuro della versione specifica di jquery in cui si è verificata questa rottura.

27

Utilizzare questo posto!

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

Grazie, risolto il mio problema! La convalida lenta del plug-in dovrebbe essere un'impostazione, quindi i campi vengono convalidati rapidamente se necessario. –

+0

Questa è stata una grande soluzione semplice per me. Il mio problema era che avevo già un gestore di focusout che stava modificando il valore dell'input. Impostando l'opzione onfocusout: false e aggiungendo la chiamata .valid() al mio gestore di focusout, è stato risolto un problema di evento asincrono molto complesso. –

+3

Non funziona per me nella ver 1.13.1 –

2

le seguenti opere per me:

$(document).ready(function() { 
     $("#myFormElement").submit(function (event) { 
      var validator = $.data($('form')[0], 'validator'); 
      validator.settings.onfocusout = function (element) { $(element).valid(); }; 
      validator.settings.onkeyup = function (element) { $(element).valid(); }; 
     }); 

     var validator = $.data($('form')[0], 'validator'); 
     validator.settings.onfocusout = false; 
     validator.settings.onkeyup = false; 
    }); 

Disabilita convalida onKeyUp iniziale. Se l'utente fa clic su Invia, riattiviamo la convalida in modo che, una volta che il campo è valido, gli venga dato un feedback immediato.

io non sono sicuro perché queste proprietà sono booleana inizialmente e poi callback sull'evento presentare. Ho trovato il metodo solo impostando le proprietà su true nell'evento di invio, che ha causato un'eccezione nella libreria di convalida (stava tentando la funzione di chiamata).

Problemi correlati