Chris: Netscape und .length BUG

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

  1. 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.

    --
    What I "discovered" was that happiness is not something that happens. [...] Happiness, in fact, is a condition that must be prepared for, cultivated, and defended privately by each person.
      -- Mihaly Csikszentmihalyi
    1. 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

      1. 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

        --
        What I "discovered" was that happiness is not something that happens. [...] Happiness, in fact, is a condition that must be prepared for, cultivated, and defended privately by each person.
          -- Mihaly Csikszentmihalyi
        1. 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

  2. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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

            2. 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.

              1. gruss Chris,

                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???

                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

      2. 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 ;-)

        --
        What I "discovered" was that happiness is not something that happens. [...] Happiness, in fact, is a condition that must be prepared for, cultivated, and defended privately by each person.
          -- Mihaly Csikszentmihalyi
        1. 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