Konflikt zwischen jQuery Validate und maskierter Eingabe
Ich habe ein Formular mit beiden jQuery Validierung und Masked Input Telefonnummer und US-zip-code-Felder.
Beispielsweise für einen US-zip-code-Maskierte Eingabe erlaubt nur zahlen eingegeben werden, und Kräfte, die entweder das format "99999" oder "99999-9999" (wo 9 kann eine beliebige Zahl). Die Validierung der Regel erfordert die gleichen. Aber in einigen Fällen, Überprüfen markiert ein Feld als invalid, wenn es sollte eigentlich gültig sein.
Code Besonderheiten
Regex, jQuery Validierung wird auf dem Feld Postleitzahl ist ^\d{5}$|^\d{5}\-\d{4}$
.
Die Maske bin ich die Anwendung mit Maskierter Eingabe .mask('99999?-9999')
Schritte zum reproduzieren
Einen Konflikt zwischen Ihnen erzeugt wird, wenn ich den folgenden Code:
- Füllen Sie eine ungültige Postleitzahl (sagen wir, drei Ziffern)
- Reiter vom Spielfeld entfernt. Maskierte Eingabe löscht die Eingabe (das erwartete Verhalten) und jQuery Validierung markiert Sie als ungültig, weil es leer ist (auch erwartet).
- Gehen Sie zurück zu den zip-Feld und geben Sie eine gültige 5-stellige zip.
- Reiter vom Spielfeld entfernt. Ist es immer noch als ungültig markiert. Dies ist ein unerwartetes.
Dieses problem ist nicht passieren, wenn ich beim ausfüllen eines 9-stelligen zip.
Hypothese
Ich denke, dieser Fehler ist weil in dem Fall die 5-stellige PLZ, Maskierte Eingabe wurde vorübergehend eingestellt "-____" um dem Benutzer zu zeigen, dass Sie können geben Sie Optional einen Bindestrich und vier weitere Ziffern. Diese entfernt an blur, aber bevor es entfernt wird, wird das Feld validiert wird, und schlägt fehl, da die Unterstriche sind nicht zulässig.
Diese Hypothese wird unterstützt durch die Tatsache, dass, wenn das Formular anschließend erneut validiert, das zip-Feld übergeben werden. Ich habe getan, diese zwei Möglichkeiten:
- Mit dem Absenden des Formulars; alle Felder sind re-validiert, wenn der submit-button geklickt wird, wird das zip-Feld geht, und übermittelt das Formular.
- Durch die Einrichtung einer
blur
Veranstaltung, die erneut überprüft, ob ein bestimmtes Feld. Zum Beispiel:$("#PLZ").blur(function(){ $(this).closest('form').validate().element($(this)); });
Diese dienen als hacky Lösungist aber nicht sehr befriedigend, weil 1) die default-Einstellungen bereits re-Validierung auf Unschärfe, so ist dieses sich wiederholende, und 2) Bedarf es der zusätzlichen code, der neben der normalen überprüfung von Regeln.
Hat sonst jemand dieses Problem? Haben Sie eine elegantere Lösung als das einrichten einer zusätzlichen blur-Ereignis-listener?
Update: die Anwendung der hacky Lösung
Sogar mit dem hacky Lösung oben funktioniert nicht so schön wie ich möchte. Zum Beispiel, das nicht funktioniert:
$appDiv.delegate('input,select,textarea','blur',function(){
$(this).closest('form').validate().element($(this));
});
...kommt noch dies:
$('input,select,textarea').live('blur',function(){
$(this).closest('form').validate().element($(this));
});
...aber das bedeutet:
$('input,select,textarea').each(function(){
$(this).blur(function(){
$(this).closest('form').validate().element($(this));
});
});
Da diese Elemente, die von AJAX geladen werden, die .each
- version muss jedes mal ausgeführt, wenn ein Formular-Abschnitt geladen wird.
InformationsquelleAutor der Frage Nathan Long | 2010-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich war eigentlich auf der Suche nach einer Antwort auf exakt diese Frage. Endete, herauszufinden, eine zuverlässige Abhilfe.
Da ich die Definition meiner eigenen validator-Methode für die PLZ habe ich es geändert, so dass Sie entfernen Sie den Bindestrich, wenn die Länge der PLZ 6 war, nachdem ich entfernt die Platzhalter aus dem Wert.
Sah es so aus:
Also die PLZ ich bin Validierung werden die Platzhalter Hinzugefügt, indem die input-plugin und der Bindestrich entfernt werden, wenn die PLZ eingegeben wird, hat nur 5 numerische Ziffern (6, einschließlich der Bindestriche). Also es wird überprüft, es richtig zu stellen.
InformationsquelleAutor der Antwort Adrian
Versuchte ich folgende Lösung, und es funktioniert wie ein Charme.
Was löst das problem event bestellen.
Wenn ein element maskiert, es wird überprüft, maskedinput plugin auf
blur
, aber gleiche element validiert durch den validator plugin auffocusout
Ereignis (was ist ein wrapper für die Unschärfe, die auf nicht-ie-Browser), die aufgerufen wird, bevor maskedinput die Unschärfe.In dieser situation input-element hat den Wert
"(___) ___ __ __"
wenn der validator prüft den Wert. Wenn der code erreicht maskedinput das blur-Ereignis-plugin-tests und löscht den Wert, da es keine gültige Eingabe.Validierung Ergebnis kann unterschiedlich sein für jede Validierung Fall. Zum Beispiel
required
Regeln passieren mit Erfolg seit element einen Wert hat. nicht erforderlichnumber
Felder wird scheitern, selbst wenn wir lassen Sie die Eingabe leer, da eine Maske wie"999"
getestet werden kann, wie12_
den obigen code testet, ob form maskierter Eingabe-Validierung befestigt ist, und erinnert daran, focusout-Ereignisprozedur. Da unsere handler angeschlossen ist, wie die neueste, hoffentlich wird es genannt.
Einer Warnung, code einfach kopiert Verhalten der validation plugin. Es wird wahrscheinlich funktionieren, für ein Jahrzehnt, aber nicht, wenn die Validierung plugin entscheidet, Dinge zu tun, anders als jetzt.
aufrichtig
InformationsquelleAutor der Antwort
Einfach Haken in der Maske() Funktion und fügen Sie einige zusätzliche Logik, um Feuer Ihre eigene Unschärfe-Logik, nach der die Standard-Maske der Unschärfe-Logik:
Außerdem können Sie feststellen, das "exists ()" - Funktion. Dies ist etwas, das ich verwenden viel mit meiner jQuery-Selektoren:
InformationsquelleAutor der Antwort Greg H
Ich hatte ein ähnliches problem und konnte es lösen, ändern der Standard-Platzhalter-Zeichen auf eine leere Zeichenfolge.
War ich mit einem
.mask('9?99');
war und Validierung mit einem einfachen 'Anzahl' - Regel, und wurde mit der gleichen Art von Konflikt.Änderte ich die Maske Erklärung zu
.mask('9?99',{placeholder:''});
und... nicht mehr in Konflikt. 🙂Es ist ein mögliches problem in Ihrem Fall, weil der
-
in der zip-code wird immer eingefügt, in der form von der Maske plugin. Ich denke, Sie können ändern Sie die regexp zu^\d{5}\-$|^\d{5}\-\d{4}$
(matching der Strich in beiden Fällen) und es sollten dann überprüfen.Sowieso, Sie veröffentlicht eine Weile her, und wahrscheinlich brauche das nicht mehr, aber vielleicht jemand anderes helfen. 🙂
InformationsquelleAutor der Antwort Miguel Pinto
Ist es egal, die Bestellung, dass Sie die Bindung? Zum Beispiel, gibt es einen Unterschied zwischen
und
Ich denke, dass die Bindungen sollten Feuer um.
InformationsquelleAutor der Antwort Jarrett Meyer
Ich habe versucht, einige der Lösungen, aber keine für mich gearbeitet, ich bin mit 'bootstrapValidator' (http://bootstrapvalidator.com/) und 'jquery.maskedinput' (http://digitalbush.com/projects/masked-input-plugin/) also wenn noch jemand dieses problem haben, meine Lösung war:
Mein input war gekennzeichnet mit:
Sowie das vollständige Skript wie dieses:
Dieser code ändert die standard-Verhalten der "bootstrapValidator", sondern war die einzige Möglichkeit, die ich erhielt, zu lösen, den Fehler zu finden.
Weiß ich nicht über performance-Probleme, also bitte ändern und verbessern den code ^^
Hoffe, dass diese Hilfe ^_^
InformationsquelleAutor der Antwort Luís Gustavo Batista