Hallo, zab,
Ich möchte ein Formular auf die Eingabe einiger Daten prüfen.
(ob das ein sinnvoller weg ist, steht auf einem anderen Blatt ;))
Sinnvoll ist das Überprüfen von Formulardaten in jedem Fall.
Nur wenn du es mit JavaScript löst, musst du dich nicht wundern, wenn jemand das Formular missbraucht und beispielweise eine Denial of Service-Attacke startet, bei welcher er das JavaScript einfach außer Acht lässt.
Bei einer serverseitigen Überprüfung hast du nahezu hunderprozentige Sicherheit, vor allem kannst du auch eventuelle Missbrauchsversuche loggen und so weiter...
Folgendes Script habe ich den <body> eingebaut:
<script language="javascript" type="text/javascript">
Das language-Attribut ist im Grunde genommen überflüssig.
<!--
function chkzabform(){
if (document.zabform.von.value == ""){
alert("Bitte Füllen Sie das Feld "Name" aus!");
Das maskieren ist unnötig, wenn du Hochkommata als Begrenzungszeichen verwendest: 'ich bin ein "String" mit vielen "Anführungszeichen", welcher "nicht" maskiert werden müssen'
if (document.zabform.Email.value.indexOf('@') == -1){
Das ist natürlich eine unzureichende Überprüfung der Netzpostadresse, @murks@murks@murks@murks@ wäre demnach zulässig.
document.zabform.submit();
Wie ich später zeigen werde, ist diese Anweisung überflüssig.
Ansich wirklich keine komplizierte Sache, doch dadurch, dass ich nicht auf "schöne" Buttons zum Absenden und Zurücksetzen verzichten möchte, habe ich ein Bild eingebaut, dass bei Klick dieses oben genannte Script aufrufen soll.
<a href="#" onclick="chkzabform()"><img src="layoutpics/form-absenden.gif /></a>
Das ist suboptimal, zudem funktioniert es nur, wenn der Benutzer JavaScript aktiviert hat, für grafische Submitbuttons gibt es einen viel einfacheren und interoperableren Weg:
http://selfhtml.teamone.de/html/formulare/formularbuttons.htm#grafische
Im IE6, Netscape6 und Mozilla läuft das Ding und bringt das gewünschte Ergebnis, doch der IE5 und der Opera weigern sich einfach das Formular nach der Prüfung abzuschicken.
Das ist komisch, dafür habe ich keine Erklärung, aber da du es abenteuerlich gelöst hast, ist es nicht verwunderlich.
Womöglich gerät das manuelle Absenden des Formulars mit dem "automatischen" zusammen und das zweite hebt das erste auf (<guess />).
Ich habe schon eine Alternative ausprobiert, in dem ich folgenden Code verwendet habe.
<a href="javascript:chkform1()">.......
Nenene, das ist noch schlimmer.
Dann wird der check auch wieder ausgeführt, doch sobald ich die Alertmeldung bei falscher Eingabe wegklicke, ersetzt der Browser die Seite durch eine leere Seite mit dem Inhalt : "false"
Das ist klar, schließlich wird false als Rückgabewert angegeben, somit navigiert der Browser "false" an. ;) Das ist dasselbe wie href="javascript:false".
Vielleicht kann mir hier jemadn sagen was ich falsch mache und wiese dieses "false" in der Site auftaucht.
Zuerst solltest du grafische Eingabefelder wie in obiger URL beschrieben lösen.
Dann nimmst du den submit()-Aufruf aus der Funktion heraus und trägt den Funktionsaufruf nicht in ein a-Starttag ein (der fällt weg), aber auch nicht in das <input type="image ... /> Element, sondern in das onsubmit-Attribut des zugehörigen form-Elements:
<form name="zabform" onsubmit="return chkzabform()" ...>
...
<p><input type="image" src="layoutpics/form-absenden.gif" alt="Formular absenden" ... /></p>
</form>
Beim Absenden des Formulars wird die Funktion aufgerufen. Wenn alles okay ist, gibt die Funktion true zurück und das Formular wird dann normal abgesendet (das Bedarf keines sonstigen Befehls), bei false wird es nicht abgesendet (so sollte es sein, ich bekomme es gerade nicht hin, komischerweise). Diese Art ist auch unter http://selfhtml.teamone.de/javascript/beispiele/formulareingaben.htm beschrieben.
Täusche ich mich, oder ist die Funktion ein wenig suboptimal - wenn $foo Felder fehlerhaft sind, nützen die ersten $foo-1 focus()-Befehle gar nichts, weil doch erst $foo alert()-Befehle aufgerufen werden und somit nur der $foo-te focus()-Befehl Sinn macht. ($foo-1) focus()-Befehle sind überflüssig, da der Fokus danach noch ($foo-1)-mal geändert wird, bevor der Benutzer überhaupt zur Eingabe kommt. ;)
Vorschlag: man führe eine Variable ein, welche enthält, ob schon Fehler gefunden sind. Anfangs ist diese false, wenn ein Fehler gefunden wird, wird sie true. Vor jeder folgenden focus()-Anweisung wird überprüft, ob schon Fehler gefunden worden sind, falls es der Fall ist, wird der Fokus nicht neu gesetzt, falls nicht, wird der Fokus auf das fehlerhafte Eingabefeld gesetzt.
Somit ist immer das erste fehlerhafte Eingabefeld nach der Überprüfung selektiert und der Fokus muss nicht erst mehrmals springen bevor das letzte fehlerhafte Formularfeld fokussiert wurde.
Doch, ich täusche mich. return false hat anscheinend die Wirkung, dass es die aktuelle Funktion beendet.
function murks () {
alert('murks1');
return false;
alert('murks2');
}
Das zweite alert wird die Welt wohl nie zu Gesicht bekommen.
Okay, dann vergiss es. :) Vielleicht sind die Überlegungen trotzdem irgendwie hilfreich, ansonsten ignoriere sie.
Mathias
"Die größten Kritiker der Elche waren früher selber welche"
(Prof. Fritz Weigle alias F. W. Bernstein)
Stimme für eine Übergangslösung für Benutzerstylesheets!
http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=36 Vote NOW! ;)