thomas: Elements Array mit einem Element

unter http://de.selfhtml.org/javascript/objekte/anzeige/elements_allgemeines.htm

ist ein schönes Beispiel, in dem der Zugriff auf Elemente eines forms per array erklärt wird.

Der Quelltext lautet sinngemäß so:

<html><head><title>Test</title>
</head><body>
<form name="Formular" action="" method="get">
<input type="radio" name="Favoriten" value="Heino">
<input type="radio" name="Favoriten" value="Gildo">
<input type="radio" name="Favoriten" value="Marianne">
</form>
<script type="text/javascript">
document.Formular.Favoriten[0].checked = true;
</script>
</body></html>

so funktioniert auch alles wunderbar.

entfehrnt man allerdings die Zeilen

<input type="radio" name="Favoriten" value="Gildo">
<input type="radio" name="Favoriten" value="Marianne">

funktioniert es nicht mehr. scheinbar funktioniert der Zugriff über das Array erst ab 2 oder mehr Elementen.
Wieso ist das so?

  1. Tag thomas.

    In der Erläuterung zu

    http://de.selfhtml.org/javascript/objekte/anzeige/elements_allgemeines.htm

    steht nicht

    document.Formular.Favoriten[0].checked = true;

    sondern

    document.Formular.Favoriten[2].checked = true;

    entfehrnt man allerdings die Zeilen
    <input type="radio" name="Favoriten" value="Gildo">
    <input type="radio" name="Favoriten" value="Marianne">
    funktioniert es nicht mehr.

    Logisch, weil es nur 1 Element gibt, keine drei mehr. Somit ist das Checken eines dritten Radiobuttons (Index Nummer 2) unmöglich, da nicht vorhanden. Außerdem ist bei nur einem Radiobutton die Indexangabe [n] überflüssig, da es mangels weiterer Elemente keines Indexes bedarf. Das Objekt selber mit seinen spezifischen Eigenschaften existiert natürlich, nur der Zugriff muss dann ohne Indexangabe erfolgen:

    <form name="Formular" action="" method="get">  
      <input type="radio" name="Favoriten" value="Heino">  
    </form>  
      
    <script type="text/javascript">
    

    document.Formular.Favoriten.checked = true;
    </script>

    scheinbar funktioniert der Zugriff über das Array erst ab 2 oder mehr Elementen.

    Ja, sonst ist es kein Array.

    Siechfred

    1. Hallo,

      das im Beispiel
      document.Formular.Favoriten[2].checked = true;
      is klar. Ich hab das nur geändert, weil es ja sonst klar ist, das es mit einem Element nicht funktioniert. Deshalb habe ich auch hingeschrieben :"steht sinngemäß"

      Aber trotzdem müsste es meiner Meinung nach auch mit einem Element funktionieren. Ein array ist es ja eigentlich trotzdem. wenn auch eins mit nur einem Element. Aber das sollte das array ja nicht stören.

      Ich bin auf das ganze gestoßen als ich eine dynamische Seite programmiert habe. Es kommt also vor, das manchmal 1 Element da ist, manchmal mehrere. Trotzdem will ich per javascript auf die gleiche Art und Weise drauf zugreifen. Ich könnte natürlich eine fall unterscheidung implementieren. das finde ich aber ziemlich umständlich. eigentlich bin ich eher aus Neugierde an der Antwort interessiert. Es hat ja bestimmt einen logischen Grund das es sich so verhält, und der würde mich interessieren.

      thomas

      1. Aber trotzdem müsste es meiner Meinung nach auch mit einem Element funktionieren. Ein array ist es ja eigentlich trotzdem. wenn auch eins mit nur einem Element. Aber das sollte das array ja nicht stören.

        Nein, denn es ist kein Array sondern eine Collection, diese wird erst gebildet, wenn es mehrere Elemente mit gleichen Namen in einem Formular gibt.

        Struppi.

        1. Nein, denn es ist kein Array sondern eine Collection, diese wird erst gebildet, wenn es mehrere Elemente mit gleichen Namen in einem Formular gibt.

          Wie kommst du drauf, das es eine Collection ist? Ich hab noch nie ein objekt in einer collection einfach mit eckigen klammern angesprochen. dazu hab ich auch nirgends was gefunden. Haste n Link zur der entsprechenden Stelle in ner spezifikation oder so?

          aber davon abgesehen is es ja ziemlich egal ob collection oder array. Das seltsame ist ja, das sie erst gebildet wird, wenn es mehr als ein Element ist. Und dafür würde mich halt der Grund interessieren. wenn ich besispielsweise mit
          document.forms[0].reset()
          ein formular resette funktioniert das ja egal wie viele formulare in dem dokument enthalten sind. Hier braucht man scheinbar keine 2. Im Beispiel aus meiner Frage schon. Und genau der Grund dafür würde mich interessieren.

          thomas

          1. Nein, denn es ist kein Array sondern eine Collection, diese wird erst gebildet, wenn es mehrere Elemente mit gleichen Namen in einem Formular gibt.
            Wie kommst du drauf, das es eine Collection ist? Ich hab noch nie ein objekt in einer collection einfach mit eckigen klammern angesprochen. dazu hab ich auch nirgends was gefunden. Haste n Link zur der entsprechenden Stelle in ner spezifikation oder so?

            Nein. Ich hab ein paar Dokumente zu HTMLCollection gefunden

            http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#ID-75708506
            http://forum.de.selfhtml.org/archiv/2003/12/t66415/#m379197

            Aber nicht wo dieses Verhalten erklärt wird.

            Aber du kannst es prüfen:

              
            <input type="button" value="klick"  
            onclick="alert(this.form.test);">  
            <input type="text" name="test">  
            </form>  
              
            <form>  
            <input type="button" value="klick"  
            onclick="alert(this.form.test.item(0).value)">  
            <input type="text" name="test" value="test 1">  
            <input type="text" name="test" value="test 2">  
            </form>  
            
            

            aber davon abgesehen is es ja ziemlich egal ob collection oder array. Das seltsame ist ja, das sie erst gebildet wird, wenn es mehr als ein Element ist. Und dafür würde mich halt der Grund interessieren. wenn ich besispielsweise mit
            document.forms[0].reset()

            Du sprichst ja auch das nullte Element direkt an, wenn die Formulare alle den gleichen Namen haben kannst du diese nicht mit forms.name[] indizieren. Im gegensatz zu elements.

            ein formular resette funktioniert das ja egal wie viele formulare in dem dokument enthalten sind. Hier braucht man scheinbar keine 2. Im Beispiel aus meiner Frage schon. Und genau der Grund dafür würde mich interessieren.

            Der Grund wäre interessant bzw. die Frage wo das steht. Ich weiß es nicht.

            Es ist aber insofern logisch, da dieses Verhalten nur elements zeigt (zumindest bei den Tests die ich gemacht habe), weil es ja durchaus mehrere elements mit gleichen Namen geben kann.

            Struppi.

        2. Hallo,

          eine Collection, diese wird erst gebildet, wenn es mehrere Elemente mit gleichen Namen in einem Formular gibt.

          Wo soll das definiert sein?

          Mathias

          1. Hallo,

            eine Collection, diese wird erst gebildet, wenn es mehrere Elemente mit gleichen Namen in einem Formular gibt.

            Wo soll das definiert sein?

            Naja, anders gefragt, weil ich »Collection« als eine Fachbegriff aus DOM (HTML) verstehe:

            elements ist eine Collection mit allen Elementknoten der Felder des jeweiligen Formulars (input, textarea, select usw.).

            Wenn ich elements.name schreibe, ist das gemäß DOM HTML elements.namedItem("name"), gibt mir also zunächst einmal einen Elementknoten mit der ID bzw. dem ersten Knoten mit dem name-Attributwert »name«. Keine weitere Collection!

            Die Logik, dass elements.name eine Collection (im Sinne von HTMLCollection gemäß DOM HTML) zurückgibt, ist also nicht definiert.

            Kleiner Test:
            document.forms.namedItem("Formular").elements.namedItem("Favoriten") → [object HTMLInputElement]
            document.forms.Formular.elements.Favoriten → [object NodeList]

            Das müsste gemäß DOM 2 HTML identisch sein.

            Aber wo sonst ist dieses Verhalten definiert? Ich denke, das ist ein Erbe aus Netscape Client JavaScript:
            http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.3/reference/radio.html#1193137
            »All the radio buttons in a single group must have the same value for the NAME attribute. This allows them to be accessed as a single group. For a given form, the JavaScript runtime engine creates an individual Radio object for each radio button in that form. It puts in a single array all the Radio objects that have the same value for the NAME attribute. It puts that array in the elements array of the corresponding Form object.«

            Da steht zwar nicht ausdrücklich, dass es bei einem Radiobutton keinen Array gibt, aber zumindest erklärt es den Unterschied bei namedItem().

            Mathias

            1. eine Collection, diese wird erst gebildet, wenn es mehrere Elemente mit gleichen Namen in einem Formular gibt.

              Wo soll das definiert sein?

              Naja, anders gefragt, weil ich »Collection« als eine Fachbegriff aus DOM (HTML) verstehe:

              ...

              elements ist eine Collection mit allen Elementknoten der Felder des jeweiligen Formulars (input, textarea, select usw.).

              Das habe ich falsch benannt bzw. falsch gedacht. Es ist eine nodeList

              Wenn ich elements.name schreibe, ist das gemäß DOM HTML elements.namedItem("name"), gibt mir also zunächst einmal einen Elementknoten mit der ID bzw. dem ersten Knoten mit dem name-Attributwert »name«. Keine weitere Collection!

              jop.

              Die Logik, dass elements.name eine Collection (im Sinne von HTMLCollection gemäß DOM HTML) zurückgibt, ist also nicht definiert.

              Im Prinzip ja, wobei eine HTMLCollection eine List of Nodes ist.

              Kleiner Test:
              document.forms.namedItem("Formular").elements.namedItem("Favoriten") → [object HTMLInputElement]
              document.forms.Formular.elements.Favoriten → [object NodeList]

              Ich hatte das auch erst später getestet.

              Aber wo sonst ist dieses Verhalten definiert? Ich denke, das ist ein Erbe aus Netscape Client JavaScript:

              Die Frage hab ich mir noch nicht gestellt, dafür bist du zuständig ;-)

              http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.3/reference/radio.html#1193137
              »All the radio buttons in a single group must have the same value for the NAME attribute. This allows them to be accessed as a single group. For a given form, the JavaScript runtime engine creates an individual Radio object for each radio button in that form. It puts in a single array all the Radio objects that have the same value for the NAME attribute. It puts that array in the elements array of the corresponding Form object.«

              Da steht zwar nicht ausdrücklich, dass es bei einem Radiobutton keinen Array gibt, aber zumindest erklärt es den Unterschied bei namedItem().

              Aber noch nicht warum dieses Verhalten auf alle Elemente angewandt wird.

              Struppi.