Ashura: IE: Setzen von (default)Selected-Eigenschaft

Hallo.

Ich lasse mir hier gerade per JS ein Formular in den Dokumentenbaum einhängen, aber der IE hat ein Problem damit, die selected-Eigenschaft abhängig vom Rückgabewert des Trinitätsoperators zu setzen.

Hier einmal ein Beispielcode:

window.onload = function() {  
  var testArr = ['Foo', 'Bar', 'Baz', 'Qux'];  
  var testSel = 'Baz';  
  
  var myForm = document.createElement('form');  
  var mySelect = document.createElement('select');  
  
  for (var i = 0; i < testArr.length; i++) {  
    var myOption = new Option(testArr[i],  
                              testArr[i].toLowerCase(),  
                              (testArr[i] == testSel ? true : false));  
  
    mySelect.options[mySelect.options.length] = myOption;  
  }  
  
  myForm.appendChild(mySelect);  
  document.body.appendChild(myForm);  
}

Die Ausgaben von testArr[i] und testSel sind wie erwartet beim Wert „Baz“ identisch und dennoch setzt der IE nicht die defaultSelected-Eigenschaft.
Füge ich den gleichen Operator für den vierten Parameter vom Option-Objekt ein, wird hier dann zwar die selected-Eigenschaft gesetzt, aber ein Element zu früh. In obigem Beispiel wird damit also „Bar“ an Stelle von „Baz“ vorselektiert. Das gleiche passiert auch, wenn ich explizit die selected-Eigenschaft folgendermaßen setze:

myOption.selected = (testArr[i] == testSel ? true : false);

Wo liegt mein (oder des IEs) Fehler?

Einen schönen Sonntag noch.

Gruß, Ashura

--
sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
„It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
[HTML Design Constraints: Logical Markup]
  1. Wo liegt mein (oder des IEs) Fehler?

    Das würd mich auch interessieren. Ich hab mir mal outerHTML angeschaut, da ist dann tatsächlich die falsche option "selected".

    Wenn man in die Schleife einen alert() einbaut funktioniert es richtig oder wenn man eine vorhandenes Select-Element benutzt oder wenn man dynamisch erst das Feld einbaut, dann wartet und dann die Options erzeugt.

    Struppi.

    1. Hallo Struppi.

      Wenn man in die Schleife einen alert() einbaut funktioniert es richtig

      Das kann ich hier gerade nicht nachvollziehen. Ungeachtet dessen, wo ich ein alert() einbaue, wird stets die falsche Option ausgewählt.

      oder wenn man eine vorhandenes Select-Element benutzt

      Dies kann ich nachvollziehen, auch wenn es mir beim dynamischen Generieren des Formulares nicht weiterhelfen kann.

      oder wenn man dynamisch erst das Feld einbaut, dann wartet und dann die Options erzeugt.

      Auch dies kann ich nachvollziehen.

      Offenbar verschluckt sich der IE hier an irgend etwas.

      Einen schönen Sonntag noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
      [HTML Design Constraints: Logical Markup]
  2. Hallo Ashura,

    myOption.selected = (testArr[i] == testSel ? true : false);

    abgesehen vom mysteriösen Verhalten des IE: warum so umständlich? Der Vergleichsoperator ergibt bereits das Ergebnis true oder false, so dass

    myOption.selected = (testArr[i]==testSel);

    nicht nur kürzer, sondern IMHO auch übersichtlicher und effizienter ist. Deine etwas schwerfällige Formulierung mit dem Fragezeichen-Operator erinnert mich an Ausdrücke wie if (variable==true), bei denen ich mich regelmäßig veräppelt fühle: Ist es wahr, dass die Variable wahr ist?

    Schönen Abend noch,
     Martin

    --
    F: Was ist eigentlich aus deinem schlimmen Durchfall geworden?
    A: Mein Arzt hat mir Valium verschrieben.
    F: Und das hilft?
    A: Naja, ich mach mir immer noch in die Hose. Aber inzwischen ist es mir egal.
    1. Hallo Martin.

      Der Vergleichsoperator ergibt bereits das Ergebnis true oder false, so dass

      myOption.selected = (testArr[i]==testSel);

      nicht nur kürzer, sondern IMHO auch übersichtlicher und effizienter ist.

      Womit du natürlich absolut recht hast. (Klar, was sollte ein Vergleich auch sonst zurück geben.)

      Deine etwas schwerfällige Formulierung mit dem Fragezeichen-Operator erinnert mich an Ausdrücke wie if (variable==true), bei denen ich mich regelmäßig veräppelt fühle: Ist es wahr, dass die Variable wahr ist?

      In diesem Falle ist die verkürzte Schreibe in der Tat nützlich, danke.

      Einen schönen Sonntag noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
      [HTML Design Constraints: Logical Markup]