derletztekick: Checkbox einmal vorhanden --> length: undefined

Hallo,

ich habe ein kleines Verständnisproblem, das sich zwar bspw. mit getElementsByName() lösen könnte aber dann immer noch nicht weiß, warum es so ist.

Warum wird bei einer einfach Abfrage:

  
<body onload="alert(document.forms[0].elements['rightdir'].length);">  
<form>  
  <input name="rightdir" type="checkbox" value="1" />  
</form>

nicht der Wert 1 sondern undefiniert zurück geliefert?

Erhöhe ich die Anzahl der Checkboxen, funktioniert es wieder:

  
<body onload="alert(document.forms[0].elements['rightdir'].length);">  
<form>  
  <input name="rightdir" type="checkbox" value="1" />  
  <input name="rightdir" type="checkbox" value="2" />  
</form>

und liefert korrekterweise 2. Warum wird bei einem nicht eine Länge von 1 zurückgegeben?

Vielen Dank!

Mit freundlichem Gruß
Micha

--
LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript
  1. Hi,

    Warum wird bei einem nicht eine Länge von 1 zurückgegeben?

    weil es sich nicht um eine Collection handelt, sondern um ein Checkbox-Element, welches nun mal nicht über eine length-Eigenschaft verfügt. Ja, dieses Verhalten ist inkonsequent.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Cheatah,

      weil es sich nicht um eine Collection handelt, sondern um ein Checkbox-Element, welches nun mal nicht über eine length-Eigenschaft verfügt.

      Der Type des Elements ist egal:

        
      <body onload="alert(document.forms[0].elements['rightdir'].length);">  
      <form>  
        <input name="rightdir" type="checkbox" value="1" />  
        <input name="rightdir" type="text" value="1" />  
      </form>
      

      liefert auch 2, was ich auch durchaus erwartet hätte (da ich ein ähnliches Ergebnis wie getElementsByName() erwartete) aber nach Deiner Aussage:

      Ja, dieses Verhalten ist inkonsequent.

      nicht nur inkosequent sondern falsch ist, habe ich das richtig verstanden?

      Mit freundlichem Gruß
      Micha

      --
      LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript
      1. Hi,

        weil es sich nicht um eine Collection handelt, sondern um ein Checkbox-Element, welches nun mal nicht über eine length-Eigenschaft verfügt.
        Der Type des Elements ist egal:

        richtig. Wenn eins davon vorhanden ist, ist es das Element; gibt es derer mehrere, ist es eine Collection.

        Ja, dieses Verhalten ist inkonsequent.
        nicht nur inkosequent sondern falsch ist, habe ich das richtig verstanden?

        Nein, so ist es definiert.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo Sven Rautenberg und Cheatah,

          danke Euch beiden für die Erklärung! Ich habs nun verstanden ;-)

          Schöne Grüße aus dem sonnigen Norden,
          Micha

          --
          LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript
      2. Moin!

        Der Type des Elements ist egal:

        <body onload="alert(document.forms[0].elements['rightdir'].length);">
        <form>
          <input name="rightdir" type="checkbox" value="1" />
          <input name="rightdir" type="text" value="1" />
        </form>

        
        >   
        > liefert auch 2, was ich auch durchaus erwartet hätte (da ich ein ähnliches Ergebnis wie getElementsByName() erwartete) aber nach Deiner Aussage:  
        >   
        > >  Ja, dieses Verhalten ist inkonsequent.  
        >   
        > nicht nur inkosequent sondern falsch ist, habe ich das richtig verstanden?  
          
        Nein, das ist nicht falsch.  
          
        Wenn im HTML-Formular zwei Elemente mit identischen Namen auftauchen, ist das aus Sicht von HTML kein Problem. Es ist auch aus Sicht des Formularabschickens auf dem Server kein Problem, denn die Formulardaten werden dann einfach zweimal ein name=value enthalten, bei dem der Name gleich ist (wie der Server dann weiß, welches Paar zu welchem Feld gehört, ist eine ganz andere Frage).  
          
        Javascript muß mit diesem Umstand auch irgendwie umgehen. Und tut das so:  
        - Wenn ein Elementname nur einmal vorkommt, ist es in der Elements-Collection ein ganz normales Objekt mit seinen Eigenschaften.  
        document.forms[x].elements[y].value ist definiert  
          
        - Wenn ein Elementname mehrfach vorkommt, wird aus dem normalen Element einfach ein Array, das eine length-Eigenschaft hat, und an die Eigenschaften des einzelnen Elements kommt man nur über einen Arrayindex ran.  
        document.forms[x].elements[y].value ist undefiniert  
        document.forms[x].elements[y].length ist definiert  
        document.forms[x].elements[y][z].value ist definiert  
          
        Dieses Verhalten ist in gewisser Weise etwas inkonsequent, aber wenn man es kennt, kann man sich drauf einstellen. Die Alternative wäre, dass sämtliche Formularelemente IMMER ein Array bilden und immer als document.forms[x].elements[y][0].value anzusprechen sind. Der relativ sinnlose Arrayindex kann aber mindestens genauso zu Verwirrungen führen - und er bläht die interne Struktur vermutlich auch etwas sinnlos auf.  
          
         - Sven Rautenberg
        
        -- 
        My sssignature, my preciousssss!
        
    2. Hallo,

      was hältst du denn von Folgendem:

        
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
      "http://www.w3.org/TR/html4/loose.dtd">  
      <html>  
      <head>  
      <title>Javascript Hölle</title>  
      <script type="text/javascript" language="JavaScript">  
      function farbausgabe()  
      {  
        var bereich=document.getElementById("test");  
        if(bereich.style.backgroundColor.indexOf("#")==-1)  
        {  
          alert("aha, sie surfen also - wahrscheinlich - mit Firefox");  
        }  
        alert(bereich.style.backgroundColor);  
      }  
      </script>  
      <noscript></noscript>  
      </head>  
      <body>  
      <div id="test" style="width:100px;height:100px;background-color:#ff0000;"></div>  
      <button onclick="farbausgabe()">Na, welche Farbe hat das DIV?</button>  
      </body>  
      </html>  
      
      

      Hab es auch mal verlinkt. Ich meine übrigens die unterschiedliche Ausgabe Firefox vs Rest der Welt (ok, ok, ist nur mit IE 6.0, FF 1.5.0.3 und Opera 8.54 getestet - von daher ist "Rest der Welt" wohl etwas übertrieben...)

      SCNR

      Liebe Grüße

      mbr

      1. Hallo mbr,

        »» Hallo,

        was hältst du denn von Folgendem: [...]

        Im Moment nichts, da es wenig mit meinem Problem zu tun hat, aber ein einfaches .toString(16) der einzelnen RGB-Anteile sollte Dein Problem lösen, sofern Du unbedingt die HEX-Angabe benötigst.

        Mit freundlichem Gruß
        Micha

        --
        LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript
      2. Hi,

        was hältst du denn von Folgendem:

        es ist ein von JavaScript zu 100% unabhängiges Problem und betrifft nur CSS.

        Ich meine übrigens die unterschiedliche Ausgabe Firefox vs Rest der Welt

        Ja. Firefox normalisiert den Wert. Was stört Dich daran?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo Cheatah,

          Ich meine übrigens die unterschiedliche Ausgabe Firefox vs Rest der Welt

          Ja. Firefox normalisiert den Wert. Was stört Dich daran?

          "normalisiert" - das muss ich mir merken. Eigentlich stört mich da nix dran. Bin bloss mal drüber gestolpert, als ich mit Javascript Farben manipulieren wollte und dazu den String #000000 (ist jetzt nur ein Beispiel) in die RGB Anteile zerlegen wollte (Nagel mich da jetzt nicht drauf fest, aber irgendwie mit substr(1,2), substr(3,2), usw... Funktionierte im IE, aber nicht im FF, wobei ich die Eigenschaft vorher genauso (nämlich als #000000) gesetzt hatte. Irgendwie ärgert mich das schon... ;-)

          liebe Grüße

          mbr