Claudia Hensen: IE: Problem mit getElementsByName ?

Hallo zusammen,

ich habe da ein kleines Problem, für das ich im Moment keine gute Lösung finde. Vielleicht hat dazu ja einer eine Idee.

Ich möchte ein "intelligentes Formular" bauen, bei dem je nach Auswahl in einer Selectbox ein bestimmtes Element angezeigt wird. Zu diesem Zweck habe ich die anzuzeigenden Elemente in verschiedene Div-Container gelegt und diesen den Namen "typen" gegeben.
Bei Auswahl passiert dann folgendes:

var l=document.Eintrag.TypenAuswahl.value;
for (var i = 0; i<document.getElementsByName("typen").length; i++) {
 document.getElementsByName("typen")[i].style.display=(i==l)?"block":"none";
}

Unter Firefox funktioniert es genau so, wie ich das will, aber der Internet Explorer gibt für document.getElementsByName("typen") den Wert 0 zurück...!
Wenn ich den Containern hingegen die ID "typen" gebe, funktioniert es auch im IE. Aber zum einen finde ich das mehr als unschön, und zum anderen sollen die IDs durch eine Datenbankabfrage für jeden Container erstellt werden, so dass ich die Funktionsweise des Scripts eigentlich brauche.

Hat da jemand einen Tipp?

Danke im Voraus,
CH

  1. Hallo Claudia,

    kann es sein, dass du ohne Not DIV-Containern ein Namens-Attribut gibst, wo das gar nicht valide ist, anstatt es den Select-Boxen selbst zu geben, wo das gestattet ist?

    Gruß Gernot

    1. Hallo Gernot,

      es sieht folgendermaßen aus:

      <select name="TypenAuswahl">
      <option value=0>---</option>
      [.....]
      </select>

      [.....]

      <div name="typen" id="xyz" style="display:none">
      ...
      </div>
      <div name="typen" id="abc" style="display:none">
      ...
      </div>
      <div name="typen" id="stu" style="display:none">
      ...
      </div>

      Warum darf man Div-Containern keinen Namen geben? Es scheint mir das einfachste zu sein, um sie von anderen Divs, die in der JS-Funktion außer Acht gelassen werden sollen, zu unterscheiden...

      1. Hallo Claudia,

        <div name="typen" id="xyz" style="display:none">
        ...
        </div>

        Was ist denn in diesen ausgebelndeten Bereichen, seinerseits wieder Unterauswahlmöglichkeiten? Dann brauchst du die DIV-Container vielleicht nicht und kannst die Formularelemente gleichen Namens über ihren Index in der gemeinesamen Collection ein- und ausblenden.

        Warum darf man Div-Containern keinen Namen geben? Es scheint mir das einfachste zu sein, um sie von anderen Divs, die in der JS-Funktion außer Acht gelassen werden sollen, zu unterscheiden...

        Das ist nun mal so definiert. Namensattribute sind nur für ganz wenige Elemente (Formularelemente und Bilder) erlaubt. Du könntest aber alle DIV-Container, von denen jeweils nur einer eingeblendet sein soll, ihrerseits noch einmal in einen DIV-Container packen, dem du eine ID gibst. Wenn sich darin dann ausschließlich die ein- und auszublenden DIVs befinden und diese auch keine weiteren Kind-Divs haben, kannst du alle deine Divs in diesem Bereich über

        document.getElementById('deinGruppierungsDiv').getElementsByTagNames()

        gemeinsam und mittels Index getrennt ansprechen.

        Gruß Gernot

        1. Hallo nochmal,

          document.getElementById('deinGruppierungsDiv').getElementsByTagNames()

          besser so:

          document.getElementById('deinGruppierungsDiv').getElementsByTagName('DIV')

          Gruß Gernot

          1. document.getElementById('deinGruppierungsDiv').getElementsByTagName('DIV')

            Das klingt gut, so werd ich's machen.
            Ich dachte, das mit dem Name-Attribut ginge schon in Ordnung, wenn Mozilla das so kennt :) Jedenfalls danke für die freundliche Aufklärung und Hilfe.

      2. Hello out there!

        Warum darf man Div-Containern keinen Namen geben?

        Weil das die Regeln von HTML (die in den DTDs festgeschrieben sind) nicht gestatten. [HTML401 §21]

        <!ATTLIST DIV
          %attrs;                              -- %coreattrs, %i18n, %events --
          %align;                              -- align, text alignment --
          %reserved;                           -- reserved for possible future use --
          >

        Die referenzierten Entities sind weiter oben deklariert:

        <!ENTITY % reserved "">

        gibt nichts her …

        <!ENTITY % align "align (left|center|right|justify)  #IMPLIED"
                           -- default is left for ltr paragraphs, right for rtl --
          >

        … das auch nur das 'align'-Attribut …

        <!ENTITY % attrs "%coreattrs; %i18n; %events;">

        … weitere Entities:

        <!ENTITY % coreattrs
         "id          ID             #IMPLIED  -- document-wide unique id --
          class       CDATA          #IMPLIED  -- space-separated list of classes --
          style       %StyleSheet;   #IMPLIED  -- associated style info --
          title       %Text;         #IMPLIED  -- advisory title --"
          >

        <!ENTITY % i18n
         "lang        %LanguageCode; #IMPLIED  -- language code --
          dir         (ltr|rtl)      #IMPLIED  -- direction for weak/neutral text --"
          >

        <!ENTITY % events
         "onclick     %Script;       #IMPLIED  -- a pointer button was clicked --
          ondblclick  %Script;       #IMPLIED  -- a pointer button was double clicked--
          onmousedown %Script;       #IMPLIED  -- a pointer button was pressed down --
          onmouseup   %Script;       #IMPLIED  -- a pointer button was released --
          onmouseover %Script;       #IMPLIED  -- a pointer was moved onto --
          onmousemove %Script;       #IMPLIED  -- a pointer was moved within --
          onmouseout  %Script;       #IMPLIED  -- a pointer was moved away --
          onkeypress  %Script;       #IMPLIED  -- a key was pressed and released --
          onkeydown   %Script;       #IMPLIED  -- a key was pressed down --
          onkeyup     %Script;       #IMPLIED  -- a key was released --"
          >

        Nirgendwo taucht das 'name'-Attribut auf; folglich gibt es dieses für das 'div'-Element nicht.

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)