2009-08-26 2 views
0

Ich habe den folgenden Code - es wird verwendet, um ein Dropdown zu laden, wenn der Benutzer auf ein Dropdown mit nur die geladene Standardoption klickt, weil dieses Dropdown ist ziemlich groß und IE doesn ' t so sehr. Hier ist der Code:IE 6 Javascript ersetzen wählen Drop-Down-Problem

function populateDropDown(id, code) { 
    var currentSelect = document.getElementById(id); 
    <%--Don't enable the dropdown if it has more than one entry already - assume this to be populated.--%> 
    if(currentSelect.length == 1) { 
      currentSelect.remove(0); 
      var selectedIndex = 0; 
      for(var index = 0; index < codes.length; index++) { 
        var newOption = document.createElement('option'); 
        newOption.value = codes[index]; 
        newOption.text = values[index]; 
        try { 
          currentSelect.add(newOption, null); // standards compliant 
        } 
        catch(ex) 
        { 
          currentSelect.add(newOption); // IE only 
        } 
        if(codes[index] == code) { 
          selectedIndex = index; 
        } 
      } 
      currentSelect.selectedIndex = selectedIndex; 
    } 
} 

Dieser Code funktioniert in Opera 9.x, IE 7 - aber nicht IE 6 (teste ich in Opera, weil ich Opera Dragonfly mag - aber es ist wirklich nur in IE 7 arbeiten und 6).

In IE 6 füllt der Code die Dropdown-Liste, aber er setzt den ausgewählten Wert auf den ersten Wert in der Dropdown-Liste, nicht auf den ausgewählten Wert. Der ausgewählte Wert wird in den anderen beiden genannten Browsern auf den richtigen Wert gesetzt.

Ich bin kein Javascript Guru auf irgendeine Weise - also wenn jemand weiß, warum IE 6 dies tut und wie man es umgehen kann, würde das geschätzt werden. Beachten Sie auch, dass der Kommentar dort ein JSP-Kommentar ist - es wird entfernt, bevor dieses Javascript an den Browser gesendet wird (es ist kein ungültiger Kommentar).

+0

Woher kommt Code in if (Codes [Index] == Code)? –

+0

Sorry, Russ, vergessen, die Signatur hinzuzufügen. Die Signatur ist funktionsName (ID, Code). Der Code stammt von dem ursprünglich ausgewählten Wert über eine JSP-EL-Funktion (daher sollte die Überprüfung nicht das bereits aufgefüllte Dropdown-Menü ausfüllen). Wenn es in diesem Dropdown-Menü nicht mehr als zwei Optionen gibt, gibt es * größere * Probleme !) – MetroidFan2002

+0

Bearbeitet, um die Signatur hinzuzufügen. – MetroidFan2002

Antwort

1

Ich habe dieses genaue Problem schon einmal kennengelernt. Wenn Sie versuchen, auf dynamisch erstellte untergeordnete Elemente eines select-Elements (Optionen) zuzugreifen, bevor der Fokus dem Dokument zurückgegeben wird, schlägt das Setzen von selectedIndex fehl und wird standardmäßig auf das erste Element angewendet.

Ich poste zurück, wenn ich den Artikel finden kann, in dem ich den Fehler gefunden habe. Bleiben Sie dran!

UPDATE:

es gefunden!

Statt die selectedIndex auf dem <select> Element der Einstellung finden Sie das <option> Element, das Sie wollen und legen Sie seine true-Attribut ‚ausgewählt‘:

var currentSelect = document.getElementById(id); 
if(currentSelect.length == 1) { 
     currentSelect.remove(0); 
     var selectedIndex = 0; 
     for(var index = 0; index < codes.length; index++) { 
       var newOption = document.createElement('option'); 
       newOption.value = codes[index]; 
       newOption.text = values[index]; 
       try { 
         currentSelect.add(newOption, null); // standards compliant 
       } 
       catch(ex) 
       { 
         currentSelect.add(newOption); // IE only 
       } 
       if(codes[index] == code) { 
         selectedIndex = index; 
       } 
     } 
     // currentSelect.selectedIndex = selectedIndex; 
     // Try this: 
     currentSelect.options[selectedIndex].setAttribute('selected', true); 
} 
+0

Hey Cory - das ist interessant. Ich werde es versuchen, sobald ich morgen reinkomme und wenn es funktioniert (was ich hoffe), werde ich deine Antwort akzeptieren. Bis dahin musst du mit einem upvote kommen :) – MetroidFan2002

+0

Kein Problem. Ich stieß auf genau dieses Problem, aber verwendete jQuery. In IE7, IE8 und FF2 + funktionierte alles wie erwartet, in IE6 jedoch fehlgeschlagen. Hier ist der Artikel, den ich gefunden habe: http://brh.numbera.com/experiments/browserdemos/ie6-adding-options.html –

+0

Ich akzeptiere deine Antwort, aber ich füge meine eigene hinzu - deine Antwort hat geholfen mich. – MetroidFan2002

0

Cory Kommentare mir geholfen, aber seinen Code nicht produzieren die Ergebnisse, die ich unter IE 6 erhofft hatte. Er wies jedoch darauf hin, dass der Fokus das Problem sein könnte. Das folgende Snippet macht es unter IE 6 richtig auszuwählen - es sieht wirklich komisch aus, weil es das Drop-down lädt und dann auswählt, aber die Funktionalität ist was ich will und es ist schneller als statisches HTML zu laden.

currentSelect.focus(); 
currentSelect.selectedIndex = selectedIndex; 

am Eingang Fokussierung, dann den gewählten Index Einstellung funktioniert in IE 6 - obwohl der Drop-Down mit dem ersten Eingang springt wirklich schnell, und springt dann zurück. Aber solange es funktioniert ...

+0

Vielleicht versuchen Sie diese dann: anstatt 'currentSelect 'zu tun.focus(); 'bevor Sie' selectedIndex' einstellen, probieren Sie eine Zeitüberschreitung bei der Einstellung: 'setTimeout (function() {currentSelect.selectedIndex = selectedIndex;}, 0);' –