André Laugks: Fehlermeldung beim Füllen eines Auswahlmenüs

Hallo!

Mit dem folgenden JavaScript soll über ein Auswahlmenü (rel) gefüllt werden und bestimmte Elemente per JS vorselektiert werden.

Problem, ich kann nur einmal in dem Auswahlmenü (mat_id) Material auswahlen. Bei zweiten mal bekomme ich eine Fehlermeldung. Die lautet im IE, daß liste[] kein Objekt ist und im NN bekomme ich gar keine Fehlermeldung aber das Auswahlmenü wird mit 3x "undefined" gefüllt.

Ich habe keine Ahnung woran es liegen kann. Ich finde der fehler nicht.

// Arrays werden am Server "gebaut"
// 5;Beta-SP;1 -> id;Bezeichnung;Auswahl(0/1)

var werte = new Array();
werte[1] = new Array("5;Beta-SP;1", "2;CD;1", "6;CD-Rom;0", "1;Cassette;0", "3;DAT;0", "8;DV;0", "9;DVC Pro;0", "10;DVD;0", "7;Digi-Beta;0", "12;Film 16mm;0", "13;Film 32mm;0", "11;Film 8mm;0", "14;HD;0", "15;High 8;0", "4;MP3;0", "17;Super 16;0", "16;Super 8;0", "18;VHS;0");
werte[2] = new Array("5;Beta-SP;0", "2;CD;1", "6;CD-Rom;0", "1;Cassette;0", "3;DAT;0", "8;DV;0", "9;DVC Pro;0", "10;DVD;0", "7;Digi-Beta;0", "12;Film 16mm;0", "13;Film 32mm;0", "11;Film 8mm;0", "14;HD;0", "15;High 8;0", "4;MP3;0", "17;Super 16;0", "16;Super 8;0", "18;VHS;1");

function fuellen()
{
  // mat_id der Auswahl ermitteln
  mat_id = document.formular.mat_id.options[document.formular.mat_id.   options.selectedIndex].value;

if(mat_id != 'ka')
    {

// Select-Feld leeren falls es gefüllt ist
    ist_anzahl = document.formular.rel.length;
    for(var i = 0; i < ist_anzahl; i++)
      {
        document.formular.rel.options[document.formular.rel.length-1] = null;
      }

// Array mit dem Array passend zur mat_id füllen
    liste = new Array();
    liste = werte[mat_id];

// Auswahlmenü füllen
    for(var i = 0; i < liste.length; i++)
     {
       //alert(liste[i]);
       werte = liste[i].split(";"); // <<-- FEHLERMELDUNG
       if(werte[2] == 1)
         {
           selecten = true;
         }
         else
           {
             selecten = false;
           }
       option_element = new Option(werte[1],werte[0],false,selecten);
       document.formular.rel.options[document.formular.rel.length] = option_element;
     }

}

}

<form name="formular">

<select name="mat_id" onchange="fuellen()">
  <option value="1">1. Material</option>
  <option value="2">2. Material</option>
</select>
<br><br>

<select multiple size="5" name="rel"></select>
</form>

MfG, André Laugks

--
L-Andre @ gmx.de
  1. verschiebe mal dein werte-array

    var werte = new Array();
    werte[1] = new Array("5;Beta-SP;1", "2;CD;1", "6;CD-Rom;0", "1;Cassette;0", "3;DAT;0", "8;DV;0", "9;DVC Pro;0", "10;DVD;0", "7;Digi-Beta;0", "12;Film 16mm;0", "13;Film 32mm;0", "11;Film 8mm;0", "14;HD;0", "15;High 8;0", "4;MP3;0", "17;Super 16;0", "16;Super 8;0", "18;VHS;0");
    werte[2] = new Array("5;Beta-SP;0", "2;CD;1", "6;CD-Rom;0", "1;Cassette;0", "3;DAT;0", "8;DV;0", "9;DVC Pro;0", "10;DVD;0", "7;Digi-Beta;0", "12;Film 16mm;0", "13;Film 32mm;0", "11;Film 8mm;0", "14;HD;0", "15;High 8;0", "4;MP3;0", "17;Super 16;0", "16;Super 8;0", "18;VHS;1");

    direkt in die funktion, also hinter function
    "fuellen(){"

    .. dann kommt bei mir keine fehlermeldung mehr, bin mir nur net sicher, ob es auch so funzt, wie du dir das dann vorstellst...

    gruß hein

  2. Hallo André,

    Problem, ich kann nur einmal in dem Auswahlmenü (mat_id) Material auswahlen. Bei zweiten mal bekomme ich eine Fehlermeldung. Die lautet im IE, daß liste[] kein Objekt ist und im NN bekomme ich gar keine Fehlermeldung aber das Auswahlmenü wird mit 3x "undefined" gefüllt.

    :-) du bist ganz böse über den Fehler lokale - globale Variable gestolpert

    var werte = new Array();

    das ist eine globale Variable

    function fuellen()
        liste = werte[mat_id];

    hier füllst du deine Hilfsvariable mit Inhalten der globalen Variable

    werte = liste[i].split(";"); // <<-- FEHLERMELDUNG

    hier überschreibst du die globale Variable

    Im ersten Durchlauf ist noch alles ok, im zweiten Durchlauf existiert aber dein Index nicht mehr und das verursacht die Fehlermeldung

    Abhilfe: mache deine lokale Variable werte in deiner Funktion tatsächlich zu einer lokalen Variablen, also

    var werte = liste[i].split(";");

    oder nimm eine andere Bezeichnung. Deshalb hilft auch hein seine Lösung. Durch die Verschiebung der Definition des Arrays Werte in die Funktion wird dieses bei jedem Funktionaufruf neu initialisiert, da wirkt sich das Überschreiben nicht mehr aus.

    Viele Grüße

    Antje

    1. Hallo!

      :-) du bist ganz böse über den Fehler lokale - globale Variable gestolpert

      Rrrrrrrrrrrrrr..., Vielen Dank!

      MfG, André Laugks

      --
      L-Andre @ gmx.de