jQuery Validate - Aktiviert die Validierung für ausgeblendete Felder


186

In der neuen Version von jQuery Validation Plugin 1.9 wird die Validierung von versteckten Feldern standardmäßig ignoriert . Ich verwende CKEditor für das Textfeld-Eingabefeld und es versteckt das Feld und ersetzt es durch iframe. Das Feld ist vorhanden, aber die Validierung für ausgeblendete Felder ist deaktiviert. Mit dem Validierungs-Plugin Version 1.8.1 funktioniert alles wie erwartet.

Meine Frage ist also, wie man die Validierung für versteckte Felder mit dem Validierungs-Plugin v1.9 aktiviert.

Diese Einstellung funktioniert nicht:

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


Der Link für "Validierung versteckter Felder ignoriert" ist tot.
Beepye

Die Validierung funktioniert bei mir standardmäßig mit <input type="text" name="myfield" id="myfield" required="required" style="display: none;">. Ich musste keine Einstellungen ändern oder etwas Besonderes tun.
Squarecandy

Antworten:


328

Der Autor des Plugins sagt, Sie sollten "eckige Klammern ohne Anführungszeichen" verwenden .[]

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

Release: Validation Plugin 1.9.0: "... Eine weitere Änderung sollte das Einrichten von Formularen mit versteckten Elementen vereinfachen. Diese werden jetzt standardmäßig ignoriert (Option" Ignorieren "hat jetzt standardmäßig": versteckt "). Theoretisch ist dies der Fall In dem unwahrscheinlichen Fall, dass dies tatsächlich der Fall ist, können Sie das Problem beheben, indem Sie die Ignorier-Option auf "[]" setzen (eckige Klammern ohne Anführungszeichen). "

So ändern Sie diese Einstellung für alle Formulare:

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

(Es ist nicht erforderlich, .setDefaults()dass innerhalb der document.readyFunktion sein)

ODER für eine bestimmte Form:

$(document).ready(function() {

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

});

EDIT :

In dieser Antwort erfahren Sie, wie Sie die Validierung für einige ausgeblendete Felder aktivieren, andere jedoch ignorieren.


EDIT 2 :

Bevor Sie Kommentare hinterlassen, dass "dies nicht funktioniert" , denken Sie daran, dass das OP lediglich nach dem jQuery Validate-Plugin fragt und seine Frage nichts damit zu tun hat, wie ASP.NET, MVC oder ein anderes Microsoft-Framework den Normalzustand dieses Plugins ändern können erwartetes Verhalten. Wenn Sie ein Microsoft-Framework verwenden, wird die Standardfunktion des jQuery Validate-Plugins vom Microsoft- unobtrusive-validationPlugin überschrieben.

Wenn Sie Probleme mit dem unobtrusive-validationPlugin haben, lesen Sie stattdessen diese Antwort: https://stackoverflow.com/a/11053251/594235


26
Vielleicht kann mir der Down-Voter konstruktives Feedback geben. Andernfalls ist die Antwort vollständig in sich geschlossen, enthält die richtigen Quellen, enthält Codebeispiele und ist gemäß dem Autor des Plugins technisch korrekt.
Sparky

1
@StijnVanBael, nein, das ist falsch. Siehe: jsfiddle.net/F4w92/1 und auch meinen zweiten Kommentar zu Jericks Antwort .
Sparky

4
Gut gesagt, @Sparky. Die Abstimmungen sind wahrscheinlich eine Art Rache, ich habe das gleiche erlebt ..
Omar

1
Die JSFiddle funktioniert nicht mehr, da die Bibliotheken in HTTP anstelle von HTTPS geladen werden. Aktualisierte Version: jsfiddle.net/F4w92/31
hotips

1
Ich habe auch downvoted, da dies bei mir mit der neuesten Version nicht funktioniert, musste verwenden: $ ("form"). Data ("validator"). Settings.ignore = ""; als andere Antwort von @James unten
Mark Homer

71

Dies funktionierte für mich innerhalb einer ASP.NET MVC3-Site, auf der ich das Framework verlassen hatte, um eine unauffällige Validierung usw. einzurichten, falls es für jemanden nützlich ist:

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

2
Ich mag dieses auch, da es bedeutet, dass ich es unter bestimmten Umständen tun kann, anstatt das Standardverhalten zu ändern.
Steve Owen

5
Ich musste es so machen, weil die Verwendung von .validate () zum Ändern der Optionen nicht funktionierte.
Farinha

1
Dies ist die richtige Lösung für die unauffällige Validierung. Ich habe alle anderen Lösungen ausprobiert. Sie könnten funktionieren, falls sie NICHT unauffällig verwendet werden. Wenn Sie unauffällig verwenden, ist hier der richtige Ort.
Hakan Fıstık

Musste diese Methode auch für eine unauffällige Validierung verwenden, um mit Bootstrap Accordion zu arbeiten
bsod_

Wenn ich es in dieses ändere, wird das Formular nicht validiert. Ich benutze unauffälligen .net-Kern
Offir Pe'er

64

Stellen Sie sicher, zu setzen

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

NICHT drinnen$(document).ready


2
Hervorragende Antwort. Ein Link zur Dokumentation ist gut für die Menschen zu lernen, aber eine direkte Antwort ist imo wertvoller. Er OP war auf dem richtigen Weg, aber es außerhalb von $ (Dokument) zu setzen, ist bereits der Trick.
Kevin Zych

3
@ KevinZych, Anscheinend macht es absolut keinen Unterschied, ob $.validator.setDefaults()er innerhalb oder außerhalb des DOM-Ready- Handers platziert ist. Vergleichen Sie diese jsFiddle mit dieser jsFiddle .
Sparky

Interessant @Sparky, Ihre Geigen sind ein ausgezeichneter Beweis. Ich müsste zurückgehen und mir den Code ansehen, den ich mit dieser Lösung repariert habe, und herausfinden, warum ich zu dem Schluss gekommen bin, dass er sich im DOM-fähigen Handler befinden muss. Muss ein anderer Grund gewesen sein.
Kevin Zych

Justin erklärt, warum das Ausführen in doc ready Probleme verursacht. Diese Antwort ist jedoch keine gute Option, da es schwierig ist zu garantieren, dass etwas außerhalb von doc ready ausgeführt wird, BEVOR doc ready. Doc.ready wartet nicht darauf, dass Skripte außerhalb von Doc.ready ausgeführt werden. Nichts persönliches, aber dies ist keine verlässliche Antwort.
AaronLS

Endlich habe ich eine Antwort. Vielen Dank
sp9

29

Also werde ich etwas tiefer gehen, warum dies nicht funktioniert, weil ich die Art von Person bin, die nachts nicht schlafen kann, ohne zu wissen, haha. Ich verwende jQuery validate 1.10 und Microsoft jQuery Unobtrusive Validation 2.0.20710.0, die am 29.01.2013 veröffentlicht wurden.

Ich habe zunächst in jQuery Validate nach der setDefaults-Methode gesucht und sie in Zeile 261 der nicht minimierten Datei gefunden. Alles, was diese Funktion wirklich tut, ist, Ihre json-Einstellungen mit den vorhandenen zusammenzuführen, $.validator.defaultsdie initialisiert werden, wobei die ignore-Eigenschaft zusammen mit den anderen in jQuery Validate definierten Standardeinstellungen auf ": hidden" gesetzt wird. An diesem Punkt haben wir also Ignorieren überschrieben. Lassen Sie uns nun sehen, wo auf diese Standardeigenschaft verwiesen wird.

Als ich den Code durchgesehen habe, um zu sehen, wo $.validator.defaultsverwiesen wird. Ich habe festgestellt, dass es nur vom Konstruktor für einen Formularvalidator verwendet wird, Zeile 170 in jQuery validate unminified file.

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

Zu diesem Zeitpunkt führt ein Validator alle festgelegten Standardeinstellungen zusammen und hängt sie an den Formularvalidator an. Wenn Sie sich den Code ansehen, der die Validierung, Hervorhebung, Hervorhebung usw. durchführt, verwenden alle das Objekt validator.settings, um die Eigenschaft ignore abzurufen. Wir müssen also sicherstellen, dass das Ignorieren mit der setDefaults-Methode festgelegt wird, bevor $ ("form"). Validate () aufgerufen wird.

Wenn Sie Asp.net MVC und das unauffällige Plugin verwenden, werden Sie feststellen, dass die Validierung in document.ready aufgerufen wird, nachdem Sie sich das Javascript angesehen haben. Ich habe auch meine setDefaults im document.ready-Block aufgerufen, der nach den Skripten ausgeführt wird, jquery validate und unauffällig, da ich diese Skripte im HTML-Code vor demjenigen definiert habe, in dem der Aufruf enthalten ist. Mein Aufruf hatte also offensichtlich keinen Einfluss auf die Standardfunktionalität des Überspringens versteckter Elemente während der Validierung. Hier gibt es einige Möglichkeiten.

Option 1 - Sie könnten, wie Juan Mellado betonte, den Aufruf außerhalb des Dokuments haben. Dieser wird bereits ausgeführt, sobald das Skript geladen wurde. Ich bin mir nicht sicher, wann dies geschehen soll, da Browser jetzt in der Lage sind, parallele Skripte zu laden. Wenn ich nur übervorsichtig bin, korrigieren Sie mich bitte. Es gibt wahrscheinlich auch Möglichkeiten, dies zu umgehen, aber für meine Bedürfnisse bin ich diesen Weg nicht gegangen.

Option 2a - In meinen Augen ist es sicher, einfach das $.validator.setDefaults({ ignore: '' });Innere des document.ready-Ereignisses durch zu ersetzen $("form").data("validator").settings.ignore = "";. Dadurch wird die Ignoriereigenschaft geändert, die tatsächlich von jQuery validate verwendet wird, wenn jede Validierung Ihrer Elemente für das angegebene Formular durchgeführt wird.

Optionen 2b - Nachdem Sie sich den Code etwas genauer angesehen haben, können Sie auch $("form").validate().settings.ignore = "";die Ignoriereigenschaft festlegen. Der Grund dafür ist, dass beim Betrachten der Validierungsfunktion überprüft wird, ob über die $.data()Funktion bereits ein Validatorobjekt für das Formularelement gespeichert wurde . Wenn ein mit dem Formularelement gespeichertes Validatorobjekt gefunden wird, wird nur das Validatorobjekt zurückgegeben, anstatt ein anderes zu erstellen.


Vielen Dank für die ausführliche Antwort!
Davidallyoung

Gute Arbeit, da die OP-Antwort für mich in MVC 5
Mark Homer

Ihre Analyse hat mir sehr geholfen, eines meiner Validierungsprobleme zu beheben. +1
pgcan

15

Dies funktionierte für mich innerhalb einer ASP.NET-Site. Verwenden Sie diesen Code, um die Validierung für einige ausgeblendete Felder zu aktivieren

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

Verwenden Sie diese Option, um die Validierung für alle Elemente des Formulars zu aktivieren $("form").data("validator").settings.ignore = "";

Beachten Sie, dass Sie sie innerhalb verwenden $(document).ready(function() { })


8

ignore: []Diese Lösung wurde gerade auf der spezifischen Seite für das spezifische Formular hinzugefügt und hat für mich funktioniert.

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

1

Das funktioniert bei mir.

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

0

Die Validierung funktionierte bei der Formularübermittlung für mich, führte jedoch nicht die reaktive ereignisgesteuerte Validierung bei der Eingabe in die ausgewählten Auswahllisten durch.

Um dies zu beheben, habe ich Folgendes hinzugefügt, um das von der Bibliothek hinzugefügte jquery-Validierungsereignis manuell auszulösen:

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

jquery.validate fügt die .validKlasse nun der zugrunde liegenden Auswahlliste hinzu .

Vorsichtsmaßnahme: Dies erfordert ein konsistentes HTML-Muster für Ihre Formulareingaben. In meinem Fall wird jede eingegebene Eingabe in a eingeschlossen div.form-group, und jede Eingabe hat .form-control.


-15

Finden Sie einfach den Text ignorieren: ": versteckt" in Ihrer jquery-Validierungsdatei und kommentieren Sie ihn. Nach einem Kommentar verliert es niemals versteckte Elemente, um es zu validieren ...

Vielen Dank


5
Niemals eine gute Idee, Code in einer Bibliothek eines Drittanbieters zufällig auskommentieren.
Jacques
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.