abfangen von Formularelementen
Stephan
- javascript
Um Fehler bei der Eingabe in einer Online-Umfrage zu vermeiden, kontrolliere ich die Eingaben per Javascript und lasse eventuelle Fehler von Javascript markieren. Das klappt für 99% der Fragen auf der Seite. Die Formelemente einer Frage kann ich nicht abfangen.
for(var i=0; document.forms[0].elements[i];++i)
{
//klappt nicht
if(document.forms[0].elements[i].name == 'f30i1')
{
alert('found f30i1!');
//12 formelemente sollen übersprungen werden
i=i+12;
}else{
alert('element f30i1 not found');
}
// klappt
if(document.forms[0].elements[i].name == 'f29j')
{
//3 formelemente sollen übersprungen werden
i=i+3;
}
}
Um ein nicht auffinden des Elements zu kontrollieren, habe ich eine else-Anweisung rangehangen, die aber auch keinen Ton von sich gibt wenn das Formelement angesprochen werden sollte.
Einige Zeilen später wird ein Formelement mit der selben if-Abfrage ohne Probleme Abgefangen "if(document.forms[0].elements[i].name == 'f29j')".
Sieht jemand einen Fehler?
Hi,
ich hab keine großartige Ahnung, aber ich sag dir mal einfach, was mir auffällt:
for(var i=0; document.forms[0].elements[i];++i)
MfG
Rouven
hi,
- Du inkrementierst deine Schleife mit ++i statt i++. Ohne es auszuprobieren, es könnte sein, dass du durch das pre-increment das 0. Element überspringst.
Nein, das spielt hier keine Rolle.
Kannst du leicht kontrollieren, in dem du mal
javascript:for(i=0;i<3;i++) { alert(i); }
und
javascript:for(i=0;i<3;++i) { alert(i); }
in der Adresszeile deines Browsers aufrufst.
gruß,
wahsaga
for(var i=0; document.forms[0].elements[i];++i)
- Die Schleife läuft bis document.forms[0].elements[i]!? Willst du darauf hinaus "ein solches Element muss existieren", oder meintest du eigentlich über alle Elemente?
Das ist eine Variante der for Schleife statt des üblichen i < X, da die Definition ist:
for( Aktion am Anfangder Schleife; Abbruchbedingung der Schleife; Aktion am Ende der Schleife)
Die Abruchbedingung kann irgendwas sein, was false ergibt, wenn die Schleife beendet wird.
- Du inkrementierst deine Schleife mit ++i statt i++. Ohne es auszuprobieren, es könnte sein, dass du durch das pre-increment das 0. Element überspringst.
Ich hab es auch nicht ausprobiert, aber es sollte nicht so sein, da das erst am Schleifenende passiert.
Eigentlich wird oft dazu geraten, die pre-increment Variante zu verwenden. Da sie schneller ist. Bei der Postvariante muss jedesmal eine Kopie der Variabel erzeugt werden (da der Rückgabewert, das i vor der Erhöhung ist).
Der Geschwindigkeitsvorteil dürfte allerdings meistens nicht meßbar sein und spielt wohl vor allem ene Rolle, wenn du operatoren überlädst (was in JS nicht geht) und mit komplexen Objekten arbeitest.
Struppi.
Ich versteh zwar nicht ganz worauf du hinaus willst, aber warum arbeitest du nicht mit else if?
for(var i=0; document.forms[0].elements[i];++i)
{
//klappt nicht
if(document.forms[0].elements[i].name == 'f30i1')
{
alert('found f30i1!');
//12 formelemente sollen übersprungen werden
i=i+12;}else{
alert('element f30i1 not found');
Die Medlung halte ich für Unnötig, da sie ja jedesmal kommt, wenn das element nicht so heißt, also wahrscheinlich oft.
}
Stattdessen :
var name = document.forms[0].elements[i].name;
if( name == 'f30i1')
{
i += 12; // kürzere Schreibweise von i = i + 12
}
else if(name == 'f29j')
{
i += 3;
}
else
{
alert ('kein passendes Element gefunden');
}
Struppi.