Claus Peter: Selektierte Elemente bei multi select unter Opera ermitteln

Hallo,

wenn ich mit Javascript auf ein Multiselect unter Opera 7.21 zugreife

function GetSelected(pFormElt) // pFormElt == Select
    {
    var i;
    var aSelected = new Array();

// get selected elts
    for(i=0; i<pFormElt.options.length; i++)
      {
      aSelected[i] = pFormElt.options[i].selected;
      }
    }

dann werden mir nicht nur die aktuell markierten Einträge als "true" ausgegeben, sondern auch die Einträge, die vorher markiert waren.

Beispiel: beim Seitenaufbau sind die Elemente 1, 4, und 5 selektiert. Ich klicke auf Element 2, jetzt ist nur Element 2 markiert. Das obige Script liefert aber als Ausgabe 1, 2, 4 und 5. Beim Absenden aber wird nur Element 2 gepostet. IE funktioniert einwandfrei.

Was mache ich falsch?

Vielen Dank im voraus für eure Hilfe

cp

  1. im prinzip ist es schon ok, was da steht,
    bisschen verfeinern und es klappt:

    1. nim die definition von deinem array (aSelected) aus der funktion raus, mach sie global

    2. nach ablauf der anweisungen, die du für die bearbeitung der gewonnen werte brauchst, schreibst du neue initialisierung desselben arrays, dadurch werden alle alten werte gelöscht und du kannst dein array mit neuen werten ausfüllen

    beispiel:

    var aSelected = new Array();

    function GetSelected(pFormElt) // pFormElt == Select
         {
          var i;

    aSelected[0] = 5;
      aSelected[1] = 4;
          aSelected[2] = 3;

    //mit werten wird was gemacht ....

    aSelected = new Array(); //array ist jetzt wieder leer

    }

    1. Hallo Shirinka,

      mir ist noch nicht ganz klar, was Du meinst.

      Das Problem bei der Scripverarbeitung ist, dass die Anweisung

      aSelected[i] = pFormElt.options[i].selected;

      unter Opera einen falschen Wert liefert, weil

      pFormElt.options[i].selected

      auch die alten selektierten Einträge als "true" zurückliefert. Das habe ich mit

      alert("Element: " + i + " selektiert: " + pFormElt.options[i].selected);

      getestet. Mit Hilfe dieser Einträge wird dann die Liste neu aufgebaut.

  2. Hi,

    zwischenzetlich habe ich zwei Lösungen gefunden:

    1. Aufruf einer Funktion bei jedem Klick auf die Liste

    onClick="Dummy()"

    wobei Dummy() eine leere Funktion sein kann

    1. Initialisierung der Listenelemente ohne Default

    also so:

    pOption = new Option(Wert1, Wert2, 0, Select or not);
                                          ^
                                          |immer 0 wegen Opera, sonst Problem

    pSelect.options[Element] = pOption;

    Viele Grüsse

    cp