Andreas Dölling: Dynamisch gefüllte Select-Box - Moz-Problem

Hallo,

ich habe ein Eingabeformular mit zwei Select-Feldern: "Unternehmen" und "Abteilungen". Letzteres wird in Abhängigkeit von der Auswahl in "Unternehmen" per "Ajax" dynamisch mit den entsprechenden Abteilungen gefüllt.
Das klappt alles ganz wunderbar.
Bei bereits vorliegenden Datensätzen, die bearbeitet werden, soll nun aber die Abteilung schon vorausgewählt werden. Sprich: ich klicke in einer Liste den zu bearbeitenden Datensatz an, woraufhin das Formular mit den entsprechenden Daten zwecks weiterer Bearbeitung gefüllt wird. Dabei wird das Unternehmen vorausgewählt. Daraufhin werden per Ajax die dazugehörenden Abteilungen ausgelesen. Und schließlich soll nun die richtige Abteilung vorausgewählt werden.

Im IE klappt das wie gewünscht. Im Firefox dagegen wechselt die Anzeige der SELECT-Box nicht auf den aktivierten Eintrag, d.h. sie bleibt auf "Bitte auswählen" stehen.
Wenn ich allerdings in untenstehender Funktion den Kommentar vor dem  alert() entferne, so verhält sich auch der Firefox so, wie ich es möchte. Er wechselt die Anzeige der SELECT-Box auf die aktivierte Abteilung.

Ich hoffe, Ihr könnt nachvollziehen, was ich Euch mitteilen möchte (es ist Montagmorgen und der Sprachapparat noch ein bißchen träge.....).

Kennt Ihr dieses Phänomen? Und habt Ihr eine Lösung dafür?
Bin für Tipps oder weiterführende Links dankbar.

Ciao,
Andreas

Hier noch die betreffende und eigentlich unspektakuläre Funktion:
function fillSelectBoxInitially(departmentId) {
 var selectObjCompanies   = document.forms['data_form'].elements['company_id'];
 var selectObjDepartments  = document.forms['data_form'].elements['department_id'];
 var companyId = selectObjCompanies.options[selectObjCompanies.options.selectedIndex].value;
 getDepartments(companyId); // holt per "Ajax" die Abteilungen  zum Unternehmen aus der Datenbank
 for(var i=0; i<selectObjDepartments.options.length; i++) {
  //alert(i);
  if(selectObjDepartments.options[i].value == departmentId) {
   selectObjDepartments.options[i].selected = true;
  } else {
   selectObjDepartments.options[i].selected = false;
  }
 }
}

  1. Hallo,

    Kennt Ihr dieses Phänomen? Und habt Ihr eine Lösung dafür?

    Probiere es mal so (Anzahl der Optionen nur 1x auslesen und nicht bei jedem for-Durchlauf):

      
    var anz=selectObjDepartments.options.length;  
      
    for(var i=0; i<anz; i++) {  
    // ...  
    }
    

    MfG, Thomas

    1. Hallo Thomas,

      danke für Deine Antwort.
      Meine Funktion sieht jetzt so aus:

      function fillSelectBoxInitially(departmentId) {
       // [...]
       getDepartments(companyId);
       var optionsLength = selectObjDepartments.options.length;alert(optionsLength);
      alert(optionsLength);
       for(var i=0; i<optionsLength; i++) {
        alert(i);
        // [...]
       }
      }

      Jetzt tritt das Phänomen auf, daß mir der Firefox für optionsLength immer 1 zurückgibt. Entsprechend wird die for-Schleife jetzt nur noch einmal durchlaufen.
      Das ist mir völlig unerklärlich.

      VOR dem dynamischen Füllen der Abteilungen-Select-Box hat das Feld ja auch genau eine Auswahloption. Das alert() und die Schleife kommen aber DANACH.
      Sehr merkwürdig das Ganze. Es scheint ja fast so, als bräuchte Firefox ein Weilchen, um die neu gefüllte Select-Box zu "verinnerlichen"...
      Hm, bin im Moment ein wenig ratlos.

      Thanx und ciao,
      Andreas

  2. Hallo,

    ich glaube, jetzt ist bei mir der Groschen gefallen: in meiner Funktion rufe ich eine andere Funktion getDepartments() auf, die wiederum per XMLHttpRequest eine Anfrage an den Server schickt.
    Im Moment läuft meine Funktion dann aber sofort weiter, ohne daß sichergestellt ist, daß die Abfrage schon erledigt ist.
    Das heißt: zu dem Zeitpunkt, zu dem die for-Schleife startet, ist die SELECT-Box noch gar nicht gefüllt.
    Die alerts sorgen für die nötige Zeit, damit die Ajax-Funktion beendet werden kann.

    Eigentlich ganz einfache Sache. Ich muß warten, bis getDepartments() fertig ist, bevor ich weitermache.

    Ciao,
    Andreas