Ich habe ein Formular, das beides verwendet jQuery validieren y Maskierte Eingabe für die Felder Telefonnummer und US-Postleitzahl.
Für eine US-Postleitzahl zum Beispiel erlaubt die maskierte Eingabe nur die Eingabe von Zahlen und erzwingt entweder das Format "99999" oder "99999-9999" (wobei 9 eine beliebige Zahl sein kann). Die Validierungsregel verlangt dasselbe. In einigen Fällen wird jedoch ein Feld als ungültig markiert, obwohl es eigentlich gültig sein sollte.
Besonderheiten des Codes
Der Regex, den jQuery Validate für das Postleitzahlenfeld verwendet, lautet ^\d{5}$|^\d{5}\-\d{4}$
.
Die Maske, die ich mit Masked Input anwende, lautet .mask('99999?-9999')
Schritte zur Reproduktion
Zu einem Konflikt zwischen ihnen kommt es, wenn ich Folgendes tue:
- Geben Sie eine ungültige Postleitzahl ein (z. B. drei Ziffern)
- Tabulator weg vom Feld. Masked Input löscht die Eingabe (erwartetes Verhalten) und jQuery Validate markiert sie als ungültig, weil sie leer ist (ebenfalls erwartet).
- Gehen Sie zurück zum Feld für die Postleitzahl und geben Sie eine gültige 5-stellig Reißverschluss.
- Tab weg vom Feld. Sie ist immer noch als ungültig gekennzeichnet. Dies ist unerwartet .
Dieses Problem ist no passieren, wenn ich eine 9-stellige Postleitzahl eingebe.
Hypothese
Ich denke, dass dieser Fehler darauf zurückzuführen ist, dass im Falle der 5-stelligen Postleitzahl die maskierte Eingabe vorübergehend "-____" eingefügt hat, um dem Benutzer zu zeigen, dass er optional einen Bindestrich und vier weitere Ziffern eingeben kann. Dieser wird bei Unschärfe entfernt, aber bevor er entfernt wird, wird das Feld überprüft und schlägt fehl, da Unterstriche nicht zulässig sind.
Diese Hypothese wird durch die Tatsache gestützt, dass bei einer erneuten Validierung des Formulars das Feld für die Postleitzahl akzeptiert wird. Ich habe dies auf zwei Arten getan:
-
Beim Absenden des Formulars werden alle Felder erneut validiert, wenn auf die Schaltfläche "Absenden" geklickt wird, das Feld für die Postleitzahl akzeptiert wird und das Formular abgesendet wird.
-
Durch die Einrichtung einer
blur
Ereignis, das dieses spezifische Feld erneut validiert. Zum Beispiel:$("#zipcode").blur(function(){ $(this).closest('form').validate().element($(this)); });
Dies kann als Notlösung dienen , ist aber nicht sehr zufriedenstellend, weil 1) die Standardeinstellungen bereits eine erneute Validierung bei Unschärfe vorsehen, so dass dies eine Wiederholung ist, und 2) es zusätzlichen Code neben den normalen Validierungsregeln erfordert.
Ist noch jemandem dieses Problem aufgefallen? Haben Sie eine elegantere Lösung? als einen zusätzlichen Unschärfe-Ereignis-Listener einzurichten?
Update: Anwendung der hackigen Lösung
Selbst die Anwendung der obigen Notlösung funktioniert nicht so gut, wie ich es gerne hätte. Zum Beispiel funktioniert dies nicht:
$appDiv.delegate('input,select,textarea','blur',function(){
$(this).closest('form').validate().element($(this));
});
...und das hier auch nicht:
$('input,select,textarea').live('blur',function(){
$(this).closest('form').validate().element($(this));
});
...aber das hier schon:
$('input,select,textarea').each(function(){
$(this).blur(function(){
$(this).closest('form').validate().element($(this));
});
});
Da diese Elemente per AJAX geladen werden, muss die .each
Version muss jedes Mal ausgeführt werden, wenn ein Formularabschnitt geladen wird.