Convalida jQuery: abilita la convalida per i campi nascosti


186

Nella nuova versione del plugin 1.9 di validazione jQuery per impostazione predefinita la validazione dei campi nascosti è stata ignorata . Sto usando CKEditor per il campo di input textarea e nasconde il campo e lo sostituisce con iframe. Il campo è lì, ma la convalida è disabilitata per i campi nascosti. Con il plugin di validazione versione 1.8.1 tutto funziona come previsto.

Quindi la mia domanda è come abilitare la validazione per i campi nascosti con il plugin di validazione v1.9.

Questa impostazione non funziona:

$.validator.setDefaults({ ignore: '' });


Il collegamento per "la convalida dei campi nascosti ignorati" è morto.
Beepye,

La convalida sta funzionando di default per me con <input type="text" name="myfield" id="myfield" required="required" style="display: none;">. Non ho dovuto modificare alcuna impostazione o fare qualcosa di speciale.
squarecandy,

Risposte:


329

L'autore del plugin dice che dovresti usare "parentesi quadre senza virgolette" ,[]

http://bassistance.de/2011/10/07/release-validation-plugin-1-9-0/

Release: Validation Plugin 1.9.0: "... Un'altra modifica dovrebbe rendere più semplice la configurazione di moduli con elementi nascosti, questi sono ora ignorati di default (l'opzione" ignore "ha": hidden "ora come impostazione predefinita). In teoria, questo potrebbe interrompere una configurazione esistente. Nel caso improbabile che ciò avvenga effettivamente, è possibile correggerlo impostando l'opzione ignore su “[]” (parentesi quadre senza virgolette). "

Per modificare questa impostazione per tutti i moduli:

$.validator.setDefaults({ 
    ignore: [],
    // any other default options and/or rules
});

(Non è richiesto che .setDefaults()rientri nella document.readyfunzione)

O per un modulo specifico:

$(document).ready(function() {

    $('#myform').validate({
        ignore: [],
        // any other options and/or rules
    });

});

MODIFICA :

Vedi questa risposta per come abilitare la convalida su alcuni campi nascosti ma ignorarne ancora altri.


MODIFICA 2 :

Prima di lasciare commenti che "questo non funziona" , tieni presente che l'OP sta semplicemente chiedendo del plugin jQuery Validate e la sua domanda non ha nulla a che fare con il modo in cui ASP.NET, MVC o qualsiasi altro framework Microsoft possono alterare il normale di questo plugin comportamento atteso. Se si utilizza un framework Microsoft, il funzionamento predefinito del plug-in jQuery Validate viene sovrascritto dal plug-in di Microsoft unobtrusive-validation.

Se hai problemi con il unobtrusive-validationplugin, fai riferimento a questa risposta: https://stackoverflow.com/a/11053251/594235


26
Forse il voto negativo può darmi un feedback costruttivo. Altrimenti, la risposta è completamente autonoma, fornita correttamente, fornisce esempi di codice ed è tecnicamente corretta secondo l'autore del plugin.
Sparky

1
@StijnVanBael, no, è falso. Vedi: jsfiddle.net/F4w92/1 e vedi anche il mio secondo commento sulla risposta di Jerick .
Sparky

4
Ben detto @Sparky. I voti negativi sono probabilmente una specie di vendetta, ho riscontrato lo stesso ..
Omar,

1
JSFiddle non funziona più perché le librerie sono caricate in HTTP anziché HTTPS. Versione aggiornata: jsfiddle.net/F4w92/31
hotips

1
Ho effettuato il downgrade anche perché non funziona per me utilizzando l'ultima versione, ho dovuto usare: $ ("form"). Data ("validator"). Settings.ignore = ""; come altra risposta da muggito @James
Mark Homer

73

Questo ha funzionato per me, all'interno di un sito ASP.NET MVC3 dove avevo lasciato il framework per impostare la convalida discreta ecc., Nel caso sia utile a chiunque:

$("form").data("validator").settings.ignore = "";

2
Mi piace anche questo perché significa che posso farlo in determinate circostanze, piuttosto che cambiare il comportamento predefinito.
Steve Owen,

5
Ho dovuto farlo in questo modo, perché l'utilizzo di .validate () per modificare le opzioni non funzionava.
Farinha,

1
questa è la soluzione corretta per la convalida discreta, ho provato tutte le altre soluzioni, potrebbero funzionare nel caso in cui NON utilizzassero discrete. Se stai usando discreto qui è il posto giusto.
Hakan Fıstık,

Ho dovuto usare questo metodo anche per una validazione discreta per lavorare con Bootstrap Accordion
bsod_

Quando lo cambio a questo il modulo non è convalidato. Uso discreto core .net
Offir Pe'er

64

Assicurati di mettere

 $.validator.setDefaults({ ignore: '' });

NON dentro$(document).ready


2
Risposta eccellente. Un collegamento alla documentazione è utile per le persone, ma una risposta semplice è più preziosa. L'OP era sulla buona strada, ma metterlo al di fuori di $ (documento). È già il trucco.
Kevin Zych,

3
@KevinZych, Apparentemente, non fa assolutamente alcuna differenza se $.validator.setDefaults()viene posizionato all'interno o all'esterno del gancio pronto per DOM. Confronta questo jsFiddle con questo jsFiddle .
Sparky

Interessante @Sparky, i tuoi violini sono una prova eccellente. Dovrei tornare indietro e guardare il codice che ho riparato usando questa soluzione e scoprire perché sono arrivato alla conclusione che doveva essere all'interno del gestore pronto DOM. Deve essere stata un'altra ragione.
Kevin Zych,

Justin spiega perché l'esecuzione all'interno di doc ready causa problemi. Tuttavia, questa risposta non è una buona opzione perché è difficile garantire che qualcosa al di fuori del documento pronto verrà eseguito PRIMA del documento pronto. Doc.ready non attenderà l'esecuzione degli script al di fuori di esso. Niente di personale, ma questa non è una risposta affidabile.
AaronS

Finalmente ho una risposta ... Grazie mille
sp9

29

Quindi approfondirò il perché questo non funziona perché sono il tipo di persona che non riesce a dormire la notte senza sapere ahah. Sto usando jQuery validate 1.10 e Microsoft jQuery Unobtrusive Validation 2.0.20710.0, pubblicato il 29/01/2013.

Ho iniziato cercando il metodo setDefaults in jQuery Validate e l'ho trovato sulla riga 261 del file non miniato. Tutto ciò che questa funzione fa davvero è unire le tue impostazioni json a quelle esistenti $.validator.defaultsche sono inizializzate con la proprietà ignore impostata su ": hidden" insieme alle altre impostazioni predefinite definite in jQuery Validate. Quindi a questo punto abbiamo ignorato Ignora. Ora vediamo dove si fa riferimento a questa proprietà di default.

Quando ho tracciato il codice per vedere dove $.validator.defaultsviene fatto riferimento. Ho notato che è stato utilizzato solo dal costruttore per un validatore di moduli, la riga 170 in jQuery convalida il file non minificato.

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

A questo punto un validatore unirà tutte le impostazioni predefinite che sono state impostate e lo collegherà al validatore del modulo. Quando si esamina il codice che sta eseguendo la convalida, l'evidenziazione, la non evidenziazione, ecc., Tutti usano l'oggetto validator.settings per estrarre la proprietà ignore. Quindi dobbiamo assicurarci che se vogliamo impostare l'ignore con il metodo setDefaults, deve avvenire prima che venga chiamato $ ("form"). Validate ().

Se stai usando Asp.net MVC e il plug-in discreto, ti renderai conto dopo aver esaminato il javascript che convalida viene chiamato in document.ready. Ho anche chiamato il mio setDefaults nel blocco document.ready che verrà eseguito dopo gli script, jquery validate e discreto perché ho definito quegli script nell'html prima di quello che contiene la chiamata. Quindi la mia chiamata ovviamente non ha avuto alcun impatto sulla funzionalità predefinita di saltare elementi nascosti durante la convalida. Ci sono un paio di opzioni qui.

Opzione 1 - Potresti, come ha sottolineato Juan Mellado, avere la chiamata al di fuori del documento, che verrebbe eseguita non appena lo script sarà stato caricato. Non sono sicuro del tempismo di questo dato che i browser sono ora in grado di eseguire il caricamento di script parallelo. Se sono troppo cauto, per favore correggimi. Inoltre, ci sono probabilmente modi per aggirare questo, ma per le mie esigenze non sono andato su questa strada.

Opzione 2a - La scommessa sicura ai miei occhi è semplicemente quella di sostituire l' $.validator.setDefaults({ ignore: '' });interno del documento $("form").data("validator").settings.ignore = "";. Ciò modificherà la proprietà ignore effettivamente utilizzata da jQuery validate quando si esegue ogni convalida sugli elementi per il modulo specificato.

Opzioni 2b : dopo aver esaminato un po 'di più il codice, è possibile utilizzare anche $("form").validate().settings.ignore = "";come impostazione della proprietà ignore. Il motivo è che quando si esamina la funzione di convalida verifica se un oggetto validatore è già stato memorizzato per l'elemento del modulo tramite la $.data()funzione. Se trova un oggetto validatore memorizzato con l'elemento form, restituisce semplicemente l'oggetto validatore invece di crearne un altro.


Grazie per la risposta dettagliata!
davidallyoung,

Ottimo lavoro come risposta OP non ha funzionato per me in MVC 5
Mark Homer

la tua analisi mi ha aiutato molto a risolvere uno dei miei problemi di convalida. +1
pgcan

15

Questo ha funzionato per me all'interno di un sito ASP.NET. Per abilitare la validazione su alcuni campi nascosti usa questo codice

$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";

Per abilitare la validazione per tutti gli elementi del modulo usa questo $("form").data("validator").settings.ignore = "";

Si noti che li usano all'interno $(document).ready(function() { })


8

Appena aggiunta ignore: []nella pagina specifica per il modulo specifico, questa soluzione ha funzionato per me.

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });

1

Questo funziona per me.

jQuery("#form_name").validate().settings.ignore = "";

0

La convalida stava funzionando per me sull'invio del modulo, ma non stava eseguendo la convalida guidata dall'evento reattivo sull'input negli elenchi di selezione scelti.

Per risolvere questo problema, ho aggiunto quanto segue per attivare manualmente l'evento di convalida jquery che viene aggiunto dalla libreria:

$(".chosen-select").each(function() {
  $(this).chosen().on("change", function() {
    $(this).parents(".form-group").find("select.form-control").trigger("focusout.validate");
  });
});

jquery.validate ora aggiungerà la .validclasse all'elenco di selezione sottostante.

Avvertenza: ciò richiede un modello html coerente per gli input del modulo. Nel mio caso, ogni input archiviato è racchiuso in un div.form-groupe ogni input ha .form-control.


-15

Basta trovare il testo ignore: ": nascosto" nel file di convalida jquery e commentarlo. Dopo un commento questo non perderà mai alcun elemento nascosto per convalidare ...

Grazie


5
Non è mai una buona idea commentare casualmente il codice in una libreria di terze parti.
Jacques,
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.