flashnfantasy: Auswahlmenüs in Formularen

Beitrag lesen

Gehe mal folgenden Code durch, er funktioniert für alle Browser.
Habe damit eine komplette Verwaltung auf JS-Ebene geschaffen.
Bei dem Absenden des Formulars wird auch brauchbare Infos erzeugt.
Wie genau das aber jetzt geht weiß ich auch nicht mehr, ist schon einige Zeit her...

Ich glaube dfeld musste nur einmal definiert werden und ist dann die 'Datenbank'

/*

JS-Auswahllisten

das Datenfeld wird gefüllt mit
  [*] putSubs (dfeld, main, sub, index);
  wobei [sub] ein einzelnes Element der Unterauswahl von [main] ist und [sub] ein eindeutiger Namens-Bezeichner,
  wichtig nachher für die Formularverarbeitung...
  Bsp. putSubs (subs, 'Reptilien', 'Schlange', 673);

dfeld = new Array() global initialisiert.

Es wird eine Liste [dfeld] angelegt, in der die einzelnen Elemente folgende Eigenschaft haben:

name -> eindeutiger Bezeichner
    array -> weitere Liste mit Elementen.

Die Unterliste hat wiederum den Aufbau

name -> eindeutiger Bezeichner
    index -> zugeordnete ID.

[*] Mit makeOpt(dfeld, main, sub, id)
  wird in der Auswahlliste [main] das Element mit dem namen=[id] ausgewählt
  und in der Auswahlliste [sub] die Unterauswahl dieses Elementes aufgezeigt

[*] makeSub(dfeld, main, sub, textFeld, textid)
  ist die Auswahlfunktion.
  Im Kopf der der Auswahlliste steht etwa folgendes

<select name="main" onClick="makeSub(subs,'main','sub1','titel','ti'); makeSubGrey('sub2'); makeSubGrey('sub3');">

dabei ist

dfeld    = das Datenfeld
    main     = der Name der Auswahlliste
    sub      = der Name der Nachfolgeliste
    textfeld = ein Text-Feld, in die Auswahl angezeigt wird
    textid   = der Identifier, wichtig nachher für die Formularverarbeitung.
               Tip: Der Identifier kann auch in einem nicht sichtbaren Feld stehen.

*/

function putSubs(dfeld, main, sub, index)
{
var subA = null;
for (var i=0;  i < dfeld.length; i++)
{
   if (dfeld[i].name == main) subA = dfeld[i];
}
if (subA == null)
{
   subA = new Object();
   subA.array = new Array();
   subA.name = main;
   dfeld.push(subA);
}
entry = new Object();
entry.name = sub;
entry.index = index;
subA.array.push(entry);
}

function makeSubGrey(sub)
{
var subElement = document.getElementsByName(sub)[0];
if (subElement != null)
{
   subElement.style.backgroundColor = "#dddddd";
   subElement.innerHTML = "";
}
}

function makeOpt(dfeld, main, sub, id)
{
if (0 < id)
{
   var mainElement = document.getElementsByName(main)[0];
   var subElement = document.getElementsByName(sub)[0];

if (mainElement != null)
   {
     for (var i=0;  i < mainElement.options.length; i++)
     {
       thisOption = mainElement.options[i];
       if (thisOption.value == id) thisOption.selected = true;
       else thisOption.selected = false;
     }
   }

if (subElement != null)
   {
      var subA = null;
      subElement.style.backgroundColor = "#dddddd";
      subElement.length = 0;
      for (var i=0;  i < dfeld.length; i++)
      {
        if (dfeld[i].name == id) subA = dfeld[i];
      }
      if (subA != null)
      {

for (var j=0;  j < subA.array.length; j++)
        {
          subElement.options[subElement.length] = new Option(subA.array[j].name,subA.array[j].index,false,true);;
        }
        subElement.style.backgroundColor = "#ffffff";
      }
   }
}
}

function makeSub(dfeld, main, sub, textFeld, textid)
{
// Sucht aus Main das geklickte Feld
// Setzt in Sub das zugehörge unterfeld
var mainElement = document.getElementsByName(main)[0];
var subElement = document.getElementsByName(sub)[0];
var textElement = document.getElementsByName(textFeld)[0];
var textidElement = document.getElementsByName(textid)[0];

if (subElement != null)
{
   subElement.style.backgroundColor = "#dddddd";
   subElement.length = 0;
}

if (mainElement != null)
{
// Suchen des entsprechenden Eintrages
var subA = null;
for (var i=0;  i < mainElement.options.length; i++)
{
   thisOption = mainElement.options[i];
   if (thisOption.selected)
   {
     for (var j=0;  j < dfeld.length; j++)
     {
       if (dfeld[j].name == thisOption.value) subA = dfeld[j];
       //alert (thisOption.text);
     }
     if (textElement != null && textidElement != null)
     {
       textElement.value = thisOption.text;
       textidElement.value = thisOption.value;
     }
   }
}

// Erstellen des neuen Feldes
if (subA != null && subElement != null)
{
   for (var j=0;  j < subA.array.length; j++)
   {
     subElement.options[subElement.length] = new Option(subA.array[j].name,subA.array[j].index,false,true);
   }
   subElement.style.backgroundColor = "#ffffff";
}
}
}