[FRAGE] Formular-Validierung während(!) der Eingabe

FullHouse

New member
Hallo Leute,
ich verwende zu Validierung der eibgebenen Daten eine AJAX-Request.
Das JS sieht so aus:

Code:
$(document).ready(function(){
	$("form.register").change(function() {
		$.post("check.php", $("form.register").serialize(), function( data ) {
			if( data.username == "inuse" ) 
				{
				$("span#username_error").slideDown();
			
				}
		
			else if (data.username == "available")
				{
				$("span#username_error").hide();
			
				}
				
			else if (data.username == "") 
				{
				$("span#username_error").hide();
			
				}
			
			

			if (data.password == "tooshort") {
			 
			    $("span#password_error").slideDown();
			}

			else if (data.password == "") {
			    $("span#password_error").hide();
			    
			}

		

			if (data.password_again == "missmatch") {
			    $("span#password_again_error").slideDown();
			}
				
			if( data.email == "notvalid" )
				$("span#email_error").slideDown();
			else
				$("span#email_error").hide();
		}, "json");
	});
});

in meiner check.php abprüfe ich dementsprechend die Daten und schicke einen Wert in der dataVariable zurück. Klappt alles super. Allerdings ist das Problem das ich die Fehlermeldung erst bekomme wenn ich irgendwo hin klicke oder den Tabulator betätige.

Ich weiß nicht was ich änder muss, dass die Meldungen schon währen dem tippen auftauchen...

Danke im voraus!
 
Dann müsstest du ein anderes Event nehmen, z.B. onkeydown an die gewünschten Felder binden. Im Moment hast du ein onchange an die ganze form gebunden. Wann das im Einzelnen feuert weiß ich garnicht so genau, denn was zählt als Änderung in einer form? Würde das auf jeden Fall auf Feldebene machen.
 
onchange feuert nach einer Änderung erst wenn das Element den Focus verliert, wenn ich mich richtig erinnere.
onkeydown/onkeyup ist auch nicht das Wahre, du erfasst damit keine Änderungen die per C&P mit der Maus eingefügt werden.
Ich habe immer mittels Timer das Feld auf Änderungen getestet und dann reagiert.
 
Ja, stimmt, guter Hinweis von jspit! Das hatte ich ganz vergessen. Ich hab das selbst auch an manchen Stellen mit Timer gelöst. Ist zwar doof aber die einzige Chance.
 
Genau für sowas gibt es das "input"-Event... wird auch von allen modernen Browsern unterstützt: https://developer.mozilla.org/en-US/docs/Web/Events/input

@jspit: die ganze Zeit den Inhalt der Elemente zu pollen ist nicht wirklich ressourcenschonend...

@FullHouse: willst du wirklich deinen Server mit so viel Requests bombardieren? Du bekommst da für jeden Buchstaben der Nutzernamens, für jedes Zeichen in der Emailadresse und für jedes Zeichen des Passworts und der Passwortwiederholung einen Request. Wenn du das so haben willst, würde ich mindestens einen Timeout zwischen zwei Requests

PS: @FullHouse: ich hoffe stark, dass du https einsetzt. Denn du schreist das Passwort des Nutzers ja gerade durch die Leitung.
Was du da überprüfst (Länge und Übereinstimmung) kann und sollte man auf jeden Fall auf dem Client erledigen. Warum gehst du dafür auf den Server? Macht deine Anwendung nur unsicherer und langsamer.
 
Genau für sowas gibt es das "input"-Event... wird auch von allen modernen Browsern unterstützt: https://developer.mozilla.org/en-US/docs/Web/Events/input
Kannte ich noch nicht, aber geahnt, das es da schon was gibt.

@jspit: die ganze Zeit den Inhalt der Elemente zu pollen ist nicht wirklich ressourcenschonend...
Nicht, wenn ich sinnvolle Pollraten wähle und erstmal prüfe, ob sich im Feld etwas geändert hat.
Sinnvolle Pollraten sind dabei für mich Zeiten, bei denen der Nutzer die Reaktionszeit noch nicht als störed empfindet,
z.B. 300 ms.
Die Prüfung auf eine Änderung ist ein Klacks und belastet den Client wenig.
Meine Kenntnisse über die Internas von Javascript halten sich in Grenzen. Deshalb mal ketzerisch gefragt:
Ist ein input-event sehr viel ressourcenschonender als ein Timerevent ?
Den Server mit sinnlosen Requests zu bombardieren bringt nichts, da sind wir uns einig.
Du selbst schlägst vor, ein Timeout oder einfach ausgedrückt eine Zwangspause zwischen den Requests einzuhalten.
Nutze ich Timerevents mit Zeiten dieser Größe, kann ich beides erschlagen.

LG jspit
 
Zuletzt bearbeitet:
Nicht, wenn ich sinnvolle Pollraten wähle und erstmal prüfe, ob sich im Feld etwas geändert hat.
Finde ich schon. Es geht dabei auch nicht um die Pollraten, sondern darum, dass der Benutzer ja die meiste Zeit auf der Seite liest und nicht schreibt. Also mal angenommen, dass jemand 2 Minuten braucht um ein kurzes Formular auszufüllen, so sind das ca. 360 Funktionsaufrufe. Auch wenn bei den meisten nur geprüft wird, ob sich was geändert hat, so muss die Funktion doch trotzdem aufgerufen werden.

Ist ein input-event sehr viel ressourcenschonender als ein Timerevent ?
Ich würde sagen, dass sich das die Waage hält, ABER das input-event kommt wirklich nur dann, wenn sich auch wirklich was geändert hat.

Nutze ich Timerevents mit Zeiten dieser Größe, kann ich beides erschlagen.
Wenn du die Timeouts aber nur dann startest, wenn sich auch wirklich was geändert hat, belastest du den Client dadurch trotzdem weniger. Und wirklich viel Aufwand ist das auch nicht.
 
Zurück
Oben