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

Schreibe einen Kommentar