IE <option> Bug?

Andreas Gaisbauer

Erfahrenes Mitglied
Hallo zusammen,

also entweder ich bin montags noch nicht ganz aufnahmefähig, oder der IE 6.0 SP1 hat ernsthafte probleme...
Also follgendes: Ich hab in einem Formular 6 Select Felder mit jeweils 3 Einträgen. Von diesen 18 Einträgen darf aber nur immer einer selected sein. Ok, mein erster Versuch: onchange speichere ich das ausgewählte Element in einer Variablen. Dannach gehe ich in einer Schleife alle Einträge durch und setzte (sofern der selectedIndex != -1 ist) das feld auf false, nach dem Motto feld[feld.selectedIndex].selected = false. IE und Opera - kein Problem - IE ignoriert selected = false komplett :(.
Zweiter Versuch: Ich merke mir wieder (bei onchange) das selektierte Element und rufe dannach ein reset() auf das Form-Objekt auf und setze das selektierte Element auf selected. Läuft auch wieder im IE und Opera problemlos, aber - wie könnte es anders sein - im IE nicht. Ich häng mal den Code an...
PHP:
<html>
<head>
  <script type="text/javascript">

  var DEMO_TOUREN = 3; 
   
  function setValues(){
    for(var x=1; x<=6; x++){
      for(var y=0; y<DEMO_TOUREN; y++){
        var obj = document.getElementById('p'+x);
        var tour = new Option('DEMOTOUR'+x+y,x+y,false,false);
        obj.options[obj.length] = tour;
      }
    }
  }
  window.onload=setValues;
    
    
  function setUni(elem){
    var x = elem.selectedIndex;
    document.tour.reset();
    elem[x].selected = true;   
  }
    
  </script>
</head>
<body>

<form name="tour" id="tour">
<table>
  <tr>
    <th>Programm 1</th>
    <th>Programm 2</th>
    <th>Programm 3</th>
  </tr>
  <tr>
    <td>
      <select size="5" name="p1" id="p1" onChange="setUnique(this)"></select>
    </td>
    <td>
      <select size="5" name="p2" id="p2" onChange="setUnique(this)"></select>
    </td>
    <td>
      <select size="5" name="p3" id="p3" onChange="setUnique(this)"></select>    
    </td>
  </tr>
  <tr>
  <tr>
    <th>Programm 4</th>
    <th>Programm 5</th>
    <th>Programm 6</th>
  </tr>
    <td>
      <select size="5" name="p4" id="p4" onChange="setUnique(this)"></select>
    </td>
    <td>
      <select size="5" name="p5" id="p5" onChange="setUnique(this)"></select>
    </td>
    <td>
      <select size="5" name="p6" id="p6" onChange="setUnique(this)"></select>    
    </td>
  </tr>
</table>
</form>
</body>
</html>
So, wo ist mein Fehler? Ich sehe keinen - auch keinen Logischen. Lustigerweise ist als vorgabe, das es NUR im IE >= 5.5 laufen muss ;).
Ich schreib in der Zwischenzeit einen dreckigen Workaround (über innerHTML), aber eigentlich möchte ich den nicht in der Live Version benutzen müssen...

bye bye
 
Zuletzt bearbeitet:
:rolleyes: Tach

Benenn mal die Funktion setUni in setUnique um.
Dann geht's.
Siehe deinen Funktionsaufruf bei onChange...

MfG

Ollek81
 
Nene, daran liegts nicht - hatte es immer setUnique() - hab mich blos beim zusammenstellen des Beispiels vertan... Wie gesagt im Mozilla läuft es ja, also liegts nicht an einem falschen aufruf...
 
Hi,

bei mir im IE 6.0 mit SP1 läuft es so, wie Du es dir vorstellst. Es ist immer nur ein
Eintrage gewählt.

Ciao
Quaese
 
Hi

Bei mir läuft es auch so, wie du es willst. Ebenfalls IE6 SP1 auf XP und IE6 auf Win98.

Da hat dein IE wohl ne Macke... Komisch...

Gruß

Ollek81
 
Shit, das hab ich befürchtet :( - dann haut das CMS im Hintergrund was kaputt... Naja - der Workaround läuft...

Original Skript: 3 Zeilen
Workaround: 110 Zeilen :p

naja egal,

dankeschön für's testen...
 
110 Zeilen :eek: ?! Es gibt doch mehrere Wege... bei mir funktioniert dein Script auch... aber 'n anderer Weg wäre z.B.:
Code:
  function setUnique(elem){ 
      var e;
      for(var x=1; x<=6; x++) {
          e = document.getElementById('p'+x);
          if (elem.id != e.id) {
              e.selectedIndex = -1;
          }
      }
  }
... evtl. sowas in der Art?

Gruss
Jan
 
Original geschrieben von Stuck Mojo
110 Zeilen :eek: ?! Es gibt doch mehrere Wege... bei mir funktioniert dein Script auch... aber 'n anderer Weg wäre z.B.:
Code:
  function setUnique(elem){ 
      var e;
      for(var x=1; x<=6; x++) {
          e = document.getElementById('p'+x);
          if (elem.id != e.id) {
              e.selectedIndex = -1;
          }
      }
  }

... evtl. sowas in der Art?
Hi Jan,
hatte ich auch schon - hat auch nicht geklappt. Das Problem ist dass das CMS im Hintergrund die Formular und die ID's verändert :( - Eigentlich schlimm bei einen CMS in der Preisklasse... Ich hab das Skript jetzt so abändern müssen das ich bei jedem onchange das Formular "fake" absende, die Werte Puffere, und dann das ganze Formular über innerHTML neu aufbauen lasse. Das neu aufbauen lassen braucht den großteil der Zeilen, da es ziemlich viel HTML Code ist...

bye
 
:) ...hier mal ne Lösung ohne den Formularnamen oder die Anzahl oder die IDs deiner Elemente zu kennen ;)
Code:
  function setUnique(elem){ 
      var f = elem.form;
      
      if (!f._boxes_)
          f._boxes_ = {};
          
      f._boxes_[elem.id] = elem;
      
      for (var i in f._boxes_) {
          if (f._boxes_[i].id != elem.id)
              f._boxes_[i].selectedIndex = -1;
      }
  }
Gruss
Jan
 
@ StuckMojo

Auflösung:

Der Server bzw das Servlet im Hintergrund hat sämtliche < > in den Form Tags und den Javascripts gekilled - wer sich das einfallen hat lassen, gehört eingesperrt. Das ganze konnte ich nach längerem Studium der Doku umgehen. Anstatt <form> wird jetzt halt &application.lt;form&application.gt; bzw for(var x; x&application.le;y.length; x++) gesetzt. Am ursprünglichen JS Code war nichts falsch.

Trotzdem Danke für deine Bemühungen

bye bye
 

Neue Beiträge

Zurück