Deus Figendi: Ganz andere (fast) Lösung!

Beitrag lesen

Das einzige Problem ist, das bei Falsch- oder gar keiner Eingabe die Alert-Box 2x erscheint! Einfach auf Speichern klicken, und ihr seht was ich meine...

Warum tut sie das bzw. ist das so?

Weil du die Funktion checkDatum() zweimal aufrufst, einmal im Formular "onSubmit" und einmal im Subit-Input "onClick".
Ohne mich festlegen zu wollen, denke ich ersteres ist die bessere Idee, einfach falls jemand nicht klickt sondern das Formular anders absendet.
Wenn du möchtest kannst du die Überprüfung aber auch schon onBlur auf dem Datums-Input durchführen.
Dabei würde ich auch auf alert() verzichten und stattdessen:
Entweder raten was das für ein Datum sein soll und direkt ins Value reinschreiben, der Benutzer kann es dann ja nochmal korrigieren.
Oder du "markierst" den Fehler irgendwie optisch, z.B. indem du den Hintergrund des Input rot schaltest oder ein Element darunter oder darüber einfügst, welches die Fehlermeldung enthält.
(oder beides, automatisch korrigieren und optisch drauf hinweisen "schau's dir nochmal an")
"Alert" ist meistens eher nervig als nützlich.
In keinem Fall kommst du darum herum das ganze auf der Serverseite nochmal zu prüfen. Was du dann machst sei dir überlassen, entweder zu rätst einfach irgendwie was für ein Datum das nun gewesen sein mag (fehlertollerantes Parsen) oder du schreibst einen Default-Wert in die Datenbank, die die auslesende Software dann als "Geburtsdatum nicht angegeben" interpretiert oder du gibst das Formular wieder zurück und bittest um Korrektur.

Derzeit prüfst du gegen
/^\d\d.\d\d.\d\d\d\d/
Wäre es nicht besser gegen /^\d?\d.\d?\d.(\d\d){1,2}$/ zu prüfen? Das ist immernoch nicht sehr präzise (weil eben alle Ziffern gültig sind) aber ein Schritt besser imho. (Man kann den gleichen Ausdruck auch anders schreiben, aber ich glaube diese Variante ist recht Zeichen-Sparsam, keine Ahnung ob sie performant ist.)

Wenn dir die Sache mit den führenden Nullen so wichtig ist füge sie einfach selbst hinzu.
Du benutzt Perl und ich hab keine Ahnung von Perl, daher hier Pseudocode:
Setze Datums-Array auf Teile($_POST['geboren'],'.');
Solange ($Datums-Array[0].Länge < 2) Mach { Setze $Datums-Array[0] auf '0'+$Datums-Array[0]; }
Solange ($Datums-Array[1].Länge < 2) Mach { Setze $Datums-Array[1] auf '0'+$Datums-Array[1]; }
Wenn ($Datums-Array[2].Länge == 1 ODER $Datums-Array[2].Länge == 3) Mach { Setze $Fehler auf "wahr"; /* Damit das Formular zur Korrektur zurück gegeben wird */ }
Wenn ($Datums-Array[2].Länge == 2) Mach { Setze $Datums-Array[0] auf '19'+$Datums-Array[0]; }

Aber wie andere schon sagten ist es eigentlich viel einfacher und sinnvoller das Perl machen zu lassen:
Versuche {
 Mach-Datum-Aus-Zeichenkette($_POST['geboren']);
} /*bei misslingen*/ fangeFehler {
 Gibt_Formular_zurueck_weil_es_einer_Korrektur_bedarf();
}

(Pseudocode-Code-Wörterbuch:
Sete auf = Variablen setzen
Teile = split/explode...
Solange = while oder if+repeat
[0] = Array-Zugriff auf einzelne Elemente
Mach = Bedingte Anweisung
Wenn = if
ODER = OR | ||
"wahr" = true

  • = Verkettungsoperator
    Versuche...fangeFehler = try...catch (in manchen Sprachen auch ohne try dafür mit if)
    Mach-Datum-Aus-Zeichenkette() = String2Date, parseDate, date_parse (...)
    )
--
sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(