globe: verkettete auswahlliste - javascript Problem

Beitrag lesen

n'abend,

ich möchte das Javascript von Rodney gerne so abändern, dass man in der 3. Auswahlliste IMMER "nur" die gleiche Auswahlmöglichkeit hat! (bei mir wäre es jeweils eine Monatsauswahl von Jan. bis Dez.). Der Wert muss dabei auch übergeben werden - wie bei den anderen Listen.

sofern ich dein Anliegen verstanden habe, sollen (in deinem Fall) lediglich die erstem beiden Auswahllisten aus dem Datenspeicher (Optionsdaten) gefüllt werden. Die letzte Auswahlliste soll immer eine Auswahl der Monate ermöglichen, unabhängig von den zuvor gewählten Optionen.

Von Haus aus bietet das LinkedSelection-Objekt eine derartige Vorgehensweise nicht. Man kann das aber sehr wohl "nachfrickeln".

Für die Befüllung der nachfolgenden Auswahlliste ist grundsätzlich der ChangeHandler zuständig. Diesen müssen wir abändern, damit bei einer neuen Auswahl in der vorletzten Auswahlliste die neuen Optionen für die letzte Auswahlliste nicht aus dem Datenspeicher gelesen werden. Das könnten wir in etwa so hinbekommen:

var changeHandler = function()  
  {  
    var value = this.selectedValue();  
  
    // Auf die nächste Auswahlliste folgende Auswahllisten müssen wieder  
    // in den default-Zustand versetzt werden  
    if( typeof(this.nextSelect) == 'object' )  
    {  
      for( var i = this.nextSelect.selectID + 1; i < selects.length; i++ )  
        selects[i].replaceOptions( new Array() );  
    }  
  
    // Abbrechen, wenn ein Dummy-Wert ausgewählt wurde  
    if( value == '--' )  
    {  
      if( this.selectID < selects.length )  
        selects[ this.selectID +1 ].replaceOptions( new Array() );  
  
      return;  
    }  
  
    if( typeof(this.nextSelect) == 'object' )  
    {  
      /*  
       * nextSelect ist eine Auswahlliste  
       */  
  
      // prüfe ob wir bei der vorletzten Auswahlliste angelangt sind <--- In diesem Block sind die Änderungen passiert.  
      if( this.nextSelect.id == selects[ selects.length -1 ].id )  
      {  
       var monthdata = [ ['Jan','Januar'], ['Feb', 'Februar'], ['Mar', 'März'], ['Apr', 'April'] ];  
        this.nextSelect.replaceOptions( monthdata );  
      }  
      else  
      {  
     // Wenn keine Daten zur gemachten Auswahl zur Verfügung stehen,  
     // müssen wir sicherstellen, dass wir auf keine nicht vorhandenen Objekte zugreifen.  
     if( !data[ this.nextSelect.id ][ value ] )  
     {  
       if( !data[ this.nextSelect.id ] )  
         data[ this.nextSelect.id ] = {};  
  
       data[ this.nextSelect.id ][ value ] = new Array();  
     }  
  
     // Neue Optionen in der nächsten Auswahlliste setzen  
     this.nextSelect.replaceOptions( data[ this.nextSelect.id ][ value ] );  
      }  
  
      // Wenn die Auswahlstrecke nicht beendet ist, muss die Callback-Funktion  
      // dennoch aufgerufen werden, damit entsprechend auf Änderungen  
      // reagiert werden kann.  
      callback( new Array() );  
    }  
    else  
    {  
      /*  
       * Die Auswahlstrecke ist absolviert  
       */  
  
      // Wahlen der einzelnen Listen in ein Array schreiben um  
      // dieses an die Callback-Funktion zu übergeben.  
      var selected = new Array();  
      for( var i = 0; i < selects.length; i++ )  
      {  
        selected.push( { 'id' : selects[i].id,  
                 'value': selects[i].selectedValue(),  
                 'text' : selects[i].selectedText() } );  
      }  
      callback( selected );  
    }  
  };

Dass dies nur ein "Quick-Hack" ist, versteht sich von selbst. Eigentlich würde man das gerne generischer lösen.

weiterhin schönen abend...

--
Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|