Netscape und .length BUG
Chris
- javascript
0 Robert Bamler0 Chris0 Robert Bamler0 Chris
0 peterS.
Hallo,
ein blöder Fehler in Netscape 4 hat mich doch glatt einen Tag Arbeit gekostet!
Probiert mal den Code unten aus. Warum ist denn die 'Länge' des Textfeldes zuerst 'undefined' und dann plötzlich '2'?
<html>
<head>
<script language="JavaScript" type="text/JavaScript">
function formSubmit() {
alert('Text: '+document.formular[1].length);
alert('Option: '+document.formular[0].length);
alert('Text: '+document.formular[1].length);
return false;
}
</script>
</head>
<body>
<form name="formular" method="get" action="" onSubmit="return formSubmit();">
<select name="select">
<option>1</option>
<option>2</option>
</select>
<input name="Text2" type="text">
<input type="submit" value="Test">
</form>
</body>
</html>
Als alternative, ob das Element wirklich eine 'Länge' besitzt, verwende ich folgendes Workaround:
document.formular[1][0]
Wenn jemand mehr zu diesem Problem weiß, bitte posten.
Ciao
Chris
Hallo Chris,
alert('Text: '+document.formular[1].length);
Was genau willst du damit auslesen? Was versuchst du, mit document.formular[1] anzusprechen? Das Textfeld? Das müsste mit document.formular.elements[1] adressiert werden. Dann gibt es aber auch keine Eigenschaft "length". Wenn du die Anzahl der eingegebenen Zeichen auslesen willst, solltest du document.formular.elements[1].value.length verwenden.
Hi Robert,
Was genau willst du damit auslesen? Was versuchst du, mit document.formular[1] anzusprechen?
Ich habe eine rekursive Funktion geschrieben, die die Werte aller Felder in einem Formular ausliest.
Stößt die Funktion z.B. auf ein 'select' oder 'radiobutton', dann ist .length gesetzt und die Rekursion beginnt.
Da aber NS4 leider den Wert komischerweise beibehält, musste ich anstelle:
if ( document.formular[1].length ) ...
das verwenden um ans Ziel zu kommen.
if ( document.formular[1][0] ) ...
Du könntest natürlich auch document.formular['Text2'].length bzw. document.formular['select'].length schreiben, was keinen Unterschied macht.
Ciao
Chris
Hallo Chris,
Stößt die Funktion z.B. auf ein 'select' oder 'radiobutton', dann ist .length gesetzt [...]
Woher hast du das? Bei select und radiobuttons gibt's AFAIK keine Eigenschaft "length". Nur eine Eigenschaft "options", die wiederum eine Eigenschaft "length" hat, weil es ein Array ist.
Was für deine Zwecke vielleicht sinnvoller wäre, ist die Eigenschaft "type" von "elements". Damit kannst du abfragen, was für einen Typ von Formularfeld du gerade vor dir hast:
if (document.formular.elements[0].type == "select" || document.formular.elements[0].type == "radio")
for (i=0; i<document.formular.elements[0].options.length; i++)
alert(document.formular.elements[0].options[i].value);
Oder du fragst ab, ob die "options"-Eigenschaft existiert:
if (document.formular.elements[0].options)
...
Ist aber IMHO unsicherer.
Du könntest natürlich auch document.formular['Text2'].length bzw. document.formular['select'].length schreiben, was keinen Unterschied macht.
Ja, weil es AFAIK bei beiden die Eigenschaft "length" nicht gibt. Schau mal unter http://selfhtml.teamone.de/javascript/objekte/elements.htm. Dort findest du keine length-Eigenschaft. Das muss zwar noch nicht heißen, dass es keine Browser gibt, die selbst eine length-Eigenschaft einführen. Aber es zeigt, dass diese Eigneschaft wohl nicht zu den "normalen" Eigenschaften zählt, die man in den meisten Systemen erwarten darf. Und ein Formularelement ist kein Array, hat also nicht "von Haus aus" eine length-Eigenschaft. (Ja, ich weiß, es ist ein assoziatives Array, weil das jedes Objekt ist. Ist mir jetzt aber egal ;-)
Viel Erfolg,
Robert
Hi Robert,
Stößt die Funktion z.B. auf ein 'select' oder 'radiobutton', dann ist .length gesetzt [...]
Woher hast du das? Bei select und radiobuttons gibt's AFAIK keine Eigenschaft "length". Nur eine Eigenschaft "options", die wiederum eine Eigenschaft "length" hat, weil es ein Array ist.
Aha, da hat sie sich also versteckt ;-)
Ich bin einfach so beim Programmieren darauf gestoßen, dass es eine .length gibt, z.B. document.formular.myRadio.length
Wie ist es aber mit Text oder Checkboxes, die den selben Namen haben?
Haben die auch eine Option? document.formular.myText[0] und document.formular.myText[1] funzen.
Den Type habe ich natürlich auch mit eibezogen, muss ja schließlich nach 'checked' und nicht nach 'value' fragen.
Oder du fragst ab, ob die "options"-Eigenschaft existiert:
if (document.formular.elements[0].options)
Wenn, wie oben erwähnt andere Felder mit gleichem Namen auch eine Option haben, warum nicht.
Ciao
Chris
gruss Chris,
ein blöder Fehler in Netscape 4 hat mich doch glatt einen Tag Arbeit gekostet!
noe, NN4 haut Dir nur das ergebnis Deines scripts um die ohren;
alert('Text: '+document.formular[1].length);
alert('Option: '+document.formular[0].length);
alert('Text: '+document.formular[1].length);
<form name="formular" method="get" action="" onSubmit="return formSubmit();">
<select name="select">
<option>1</option>
<option>2</option>
</select>
<input name="Text2" type="text">
<input type="submit" value="Test">
</form>
// anzahl der elemente im formular "formular"?
alert(document.forms["formular"].elements.length);
// name des ersten elements im formular "formular":
alert(document.forms["formular"].elements[0].name);
// usw.
// anzahl der options-eintraege im select-element
alert(document.forms["formular"].elements["select"].options.length);
by(t)e by(t)e - peterS. - pseliger@gmx.net
Hi Peter,
noe, NN4 haut Dir nur das ergebnis Deines scripts um die ohren;
Nur komisch, dass es im IE funktioniert.
Noch komischer, dass der Wert bei der ersten Abfrage ein 'undefined' zurückgibt und beim zeiten mal eine '2'!!!
Du solltest vorher genauer hinschauen, bevor du postest.
Ciao
Chris
gruss Chris,
Nur komisch, dass es im IE funktioniert.
der ist kein garant fuer fehlerfreies scripten;
Noch komischer, dass der Wert bei der ersten Abfrage ein 'undefined' zurückgibt und beim zeiten mal eine '2'!!!
stimmt - also muss im script mindestens ein fehler stecken;
Du solltest vorher genauer hinschauen, bevor du postest.
Ciao
Chris
willst Du nun meine hilfe oder nicht?
bis gleich - peterS. - pseliger@gmx.net
Hi Peter,
stimmt - also muss im script mindestens ein fehler stecken;
Warum Fehler bei mir? Wenn ich eine nicht vorhandene Option eines Objekts abfrage, sollte sie doch immer 'undefined' sein und nicht plötzlich bei einer zweiten Abfrage einen Wert haben.
willst Du nun meine hilfe oder nicht?
Gern, nur wann fängst du damit an mir zu helfen?
Ciao
Chris
also Chris,
willst Du nun meine hilfe oder nicht?
Gern, nur wann fängst du damit an mir zu helfen?
jetzt -
stimmt - also muss im script mindestens ein fehler stecken;
Warum Fehler bei mir? Wenn ich eine nicht vorhandene Option eines Objekts abfrage, sollte sie doch immer 'undefined' sein und nicht plötzlich bei einer zweiten Abfrage einen Wert haben.
ok - dem teil nach dem "?" stimme ich zu;
der hund liegt in der fehlerhaften js-syntax begraben, mit der
die formularelemente angesprochen werden sollen - insofern
bin ich auch nicht auf das verhalten des NN4 eingegangen, weil
eine beantwortung dieser frage in keiner weise zur loesung
Deines problems bei der auswertung des formulars beitraegt, und
man ueberdies nur spekulieren kann, warum sich der NN4 wie von
Dir beschrieben verhaelt;
(Roberts annahme halte ich jedoch fuer schluessig und sehr
wahrscheinlich -
Das könnte daran liegen, dass bei der ersten Adressierung der
length-Eigenschaft diese noch nicht vorhanden ist. Das Ansprechen
der Eigenschaft könnt NC4 als "Variablendeklaration"
interpretieren, wodurch er eine Eigenschaft mit dem Namen
"length" anlegt. Beim zweiten Ansprechen ist sie dann vorhanden
und hat einen Wert (warum gerade 2 weiß ich nicht). Ist aber nur
eine Spekulation.
- was wiederrum fuer den NN4 spricht, da er sich damit korrekt
verhaelt)
der js-code meines ersten postings war als anstoss fuer Dich
gedacht, die syntax zu ueberdenken, mit der Du Dein formular
ansprichst;
es tut mir leid, wenn Du meinen ersten satz -
noe, NN4 haut Dir nur das ergebnis Deines scripts um die ohren;
- als angriff verstanden hast - da fehlte halt ein ;-) an ende
ebendiesen;
falls ich mal wieder auf eine Deiner fragen in der mir eigenen
schreibart anworten sollte, verliere bitte nicht die fassung,
wie eben geschehen und denke erst einmal nach, bevor Du zurueck-
schiesst - hier das ergebnis meines frustabbaus auf Deinen
kommunikationsstil:
<html>
<head>
<title>selfForumChrisAndFormCheck.html</title>
<script type="text/javascript" language="JavaScript">
<!--
function formSubmit() {
// alert('Text: '+document.formular[1].length);
// alert('Option: '+document.formular[0].length);
// alert('Text: '+document.formular[1].length);
var formObject = document.forms["mainform"];
alert("mainform.elements.length = " + formObject.elements.length);
for (var i=0;i<formObject.elements.length;i++) {
if (formObject.elements[i].type == "select-one") {
var indexDefaultSelected = -1;
for (var k=0;k<formObject.elements[i].options.length;k++) {
if (formObject.elements[i].options[k].defaultSelected) {
indexDefaultSelected = k;
break;
}
}
alert("type of mainform-element[" + i + "] : "" + formObject.elements[i].type + ""\n\n[select-one-element].name = " + formObject.elements[i].name + "\n[select-one-element].options.length = " + formObject.elements[i].options.length + "\n\n[select-one-element].selectedIndex = " + formObject.elements[i].selectedIndex + "\n[select-one-element].indexDefaultSelected = " + indexDefaultSelected);
} else if (formObject.elements[i].type == "radio") {
var radioCollectionLength = formObject.elements[formObject.elements[i].name].length;
var indexChecked = -1;
var indexDefaultChecked = -1;
for (var k=0;k<radioCollectionLength;k++) {
if (formObject.elements[formObject.elements[i].name][k].checked) {
indexChecked = k;
}
if (formObject.elements[formObject.elements[i].name][k].defaultChecked) {
indexDefaultChecked = k;
}
}
alert("type of mainform-element[" + i + "] : "" + formObject.elements[i].type + ""\n\n[radio-element].name = " + formObject.elements[i].name + "\n[radio-element].length = " + formObject.elements[formObject.elements[i].name].length + "\n\n[radio-element].indexChecked = " + indexChecked + "\n[radio-element].indexDefaultChecked = " + indexDefaultChecked);
} else {
alert("type of mainform-element[" + i + "] : "" + formObject.elements[i].type +""");
}
}
// return false;
}
//-->
</script>
</head>
<body>
<form name="mainform" method="get" action="" target="_self" onSubmit="return formSubmit()">
<select name="dropdown01">
<option value="option01">0101</option>
<option value="option02">0102</option>
</select><br>
<select name="dropdown02">
<option value="option01">0201</option>
<option value="option02">0202</option>
<option value="option01" selected>0203</option>
<option value="option02">0204</option>
</select><br>
<input type="text" name="text01" value=""><br>
<input type="text" name="text02" value=""><br>
<input type="radio" name="radio01" value="01">01
<input type="radio" name="radio01" value="02" checked>02
<input type="radio" name="radio01" value="03">03 <br>
<input type="radio" name="radio02" value="01">01
<input type="radio" name="radio02" value="02">02
<input type="radio" name="radio02" value="03">03 <br>
<input type="submit" value="Test">
</form>
</body>
</html>
antworten zu noch offene fragen findest Du unter:
http://selfhtml.teamone.de/javascript/objekte/forms.htm,
http://selfhtml.teamone.de/javascript/objekte/elements.htm,
http://selfhtml.teamone.de/javascript/objekte/options.htm;
peterS. - pseliger@gmx.net
Hi Peter,
werde mir mal deinen Code näher ansehen. Vielen Dank für die Hilfe. Werde dann berichten, was daraus geworden ist.
Schuldige, hat wohl auch ein ;-) gefehlt ;-)
Bis denn
Chris
Hi Peter,
da habe ich beim Nachschauen noch was entdeckt:
http://selfhtml.teamone.de/javascript/objekte/options.htm#neue_elemente
Warum steht da etwas von document.Testform.Auswahl.length ???
Ich dachte das gibt es nich. Oder doch oder wie???
Ciao
Chris, der jetzt schlafen geht.
gruss Chris,
da habe ich beim Nachschauen noch was entdeckt:
http://selfhtml.teamone.de/javascript/objekte/options.htm#neue_elementeWarum steht da etwas von document.Testform.Auswahl.length ???
Ich dachte das gibt es nich. Oder doch oder wie???
unter http://selfhtml.teamone.de/javascript/objekte/options.htm#length
findet man diese aussage:
"Speichert die Anzahl der Einträge einer Auswahlliste. Sie können
die Anzahl der Einträge sowohl mit document.Formularname.Listenname.length
als auch mit document.Formularname.Listenname.options.length
bestimmen. Beide Angaben enthalten die gleichen Werte."
die laengere variante hat den vorteil, dass schon durch die
nennung von ".options" deutlich wird, worum es geht - aus
demselben grund ziehe ich die ausfuehrlichere arrayschreib-
weise der kuerzeren (mit dem punktoperator) vor;
Ciao
Chris, der jetzt schlafen geht.
jo - gute nacht und by(t)e by(t)e - peterS. - pseliger@gmx.net
Hallo Chris,
Noch komischer, dass der Wert bei der ersten Abfrage ein 'undefined' zurückgibt und beim zeiten mal eine '2'!!!
Das könnte daran liegen, dass bei der ersten Adressierung der length-Eigenschaft diese noch nicht vorhanden ist. Das Ansprechen der Eigenschaft könnt NC4 als "Variablendeklaration" interpretieren, wodurch er eine Eigenschaft mit dem Namen "length" anlegt. Beim zweiten Ansprechen ist sie dann vorhanden und hat einen Wert (warum gerade 2 weiß ich nicht). Ist aber nur eine Spekulation. Wäre mal interessant, wenn du die Anzahl der Einträge im <select> änderst und dann schaust, ob in der dritten alert-Box immer noch die "richtige" Zahl ausgegeben wird.
Robert
PS: Kleiner Tip: Einmal tiiiiiieeeeef durchatmen ;-)
Hi,
Noch komischer, dass der Wert bei der ersten Abfrage ein 'undefined' zurückgibt und beim zeiten mal eine '2'!!!
Wäre mal interessant, wenn du die Anzahl der Einträge im <select> änderst und dann schaust, ob in der dritten alert-Box immer noch die "richtige" Zahl ausgegeben wird.
Ich glaube, dass war der richtige Gedanke. NS legt die Eigenschaft neu an, und zwar mit dem Wert, den die vorherige Abfrage eines Elements, die eine .length hatte zurückgegeben hat.
Danke, wenigstens habe ich jetzt eine plausieble Erklärung für dieses Phänomen.
Ciao
Chris