Markus**: while wird vorzeitig beendet, warum?

warum ersetzt die Funktion test() nur den ersten Kindknoten vom Typ "option", obwohl es noch weitere gibt? (while (c!=null))
Und bevor jemand fragt, warum ich das so kompliziert programmiere und nicht einfach die vorhandenen Knoten manipuliere, kann ich nur sagen: "Vielen Dank an Firma Microsoft!".

Die Funktion und der dazugehörige Source.

###JAVASCRIPT

  
function test() {  
  var c = document.getElementById("departure_time"+tour).firstChild;  
  while (c!=null)  
   {  
   if (c.nodeName == 'OPTION')  
    {  
    var m = document.getElementById("silver").cloneNode(false);  
    var text = document.createTextNode(c.getAttribute("value").substr(0,5));  
    m.appendChild(text);  
    var val = document.createAttribute("value");  
    m.setAttributeNode(val);  
    m.setAttribute("value", c.getAttribute("value"));  
    document.getElementById("departure_time"+tour).replaceChild(m, c);  
    }  
   c = c.nextSibling;  
   }  
 }  

###HTML

  
.  
.  
.  
<select style="display:none;">  
<option id="red" disabled="disabled" class="strikeout"></option>  
<option id="silver"></option>  
</select>  
.  
.  
.  
.  
   <select size="1" id="departure_time24" name="departure_time" onchange="sendRoute('24', '9')">  
  
    <option value="00:00:00" disabled="disabled" class="strikeout">00:00</option>  
    <option value="00:30:00">00:30</option>  
    <option value="01:00:00">01:00</option>  
    <option value="01:30:00">01:30</option>  
    <option value="02:00:00">02:00</option>  
    <option value="02:30:00">02:30</option>  
    <option value="03:00:00">03:00</option>  
    <option value="03:30:00">03:30</option>  
    <option value="04:00:00">04:00</option>  
    <option value="04:30:00">04:30</option>  
    <option value="05:00:00">05:00</option>  
    <option value="05:30:00">05:30</option>  
    <option value="06:00:00">06:00</option>  
    <option value="06:30:00">06:30</option>  
    <option value="07:00:00">07:00</option>  
    <option value="07:30:00">07:30</option>  
    <option value="08:00:00">08:00</option>  
    <option value="08:30:00">08:30</option>  
    <option value="09:00:00">09:00</option>  
    <option value="09:30:00">09:30</option>  
    <option value="10:00:00" disabled="disabled" class="strikeout">10:00</option>  
    <option value="10:30:00">10:30</option>  
    <option value="11:00:00">11:00</option>  
    <option value="11:30:00">11:30</option>  
    <option value="12:00:00">12:00</option>  
    <option value="12:30:00">12:30</option>  
    <option value="13:00:00">13:00</option>  
    <option value="13:30:00">13:30</option>  
    <option value="14:00:00">14:00</option>  
    <option value="14:30:00">14:30</option>  
    <option value="15:00:00">15:00</option>  
    <option value="15:30:00">15:30</option>  
    <option value="16:00:00">16:00</option>  
    <option value="16:30:00">16:30</option>  
    <option value="17:00:00">17:00</option>  
    <option value="17:30:00">17:30</option>  
    <option value="18:00:00" disabled="disabled" class="strikeout">18:00</option>  
    <option value="18:30:00">18:30</option>  
    <option value="19:00:00">19:00</option>  
    <option value="19:30:00">19:30</option>  
    <option value="20:00:00">20:00</option>  
    <option value="20:30:00">20:30</option>  
    <option value="21:00:00">21:00</option>  
    <option value="21:30:00">21:30</option>  
    <option value="22:00:00">22:00</option>  
  
    <option value="22:30:00">22:30</option>  
    <option value="23:00:00">23:00</option>  
    <option value="23:30:00">23:30</option>  
   </select>  
.  
.  
.  

Hoffe, das Problem ist verständlich formuliert!

Gruß, Markus**

  1. Hi,

    document.getElementById("departure_time"+tour).replaceChild(m, c);

    Jetzt hast du c also aus dem Dokument rausgekickt, in dem du es durch m ersetzt hast.

    c = c.nextSibling;

    c ist nicht mehr. Dass es dir noch einen nextSibling liefert, ist damit auch nicht anzunehmen.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi,

      document.getElementById("departure_time"+tour).replaceChild(m, c);

      Jetzt hast du c also aus dem Dokument rausgekickt, in dem du es durch m ersetzt hast.

      c = c.nextSibling;

      c ist nicht mehr. Dass es dir noch einen nextSibling liefert, ist damit auch nicht anzunehmen.

      MfG ChrisB

      Vielen Dank! WARUM sind Antworten nicht immer so konkret?

      Gruß, Markus**

      1. Vielen Dank! WARUM sind Antworten nicht immer so konkret?

        Weil es die Fragen auch nicht immer sind.

        Gruß, LX

        --
        X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: Unusual
        X-Please-Search-Archive-First: Absolutely Yes
  2. warum ersetzt die Funktion test() nur den ersten Kindknoten vom Typ "option", obwohl es noch weitere gibt? (while (c!=null))

    Warum nutzt du nicht einfach http://de.selfhtml.org/javascript/objekte/options.htm@title=options?

    Und bevor jemand fragt, warum ich das so kompliziert programmiere und nicht einfach die vorhandenen Knoten manipuliere, kann ich nur sagen: "Vielen Dank an Firma Microsoft!".

    Der Punkt ist, das sind Formularelemente und die kann man wesentlich einfacher manipulieren und brauchst nicht diesen mühseligen Weg über das DOM zu gehen.

    var text = document.createTextNode(c.getAttribute("value").substr(0,5));

    Wobei ich das schon für falsch halte, wieso erzeugst du hier ein Attribut? Jedes Option hat von alleine ein Attribut value, das musst du nicht erzeugen.

    m.appendChild(text);
        var val = document.createAttribute("value");
        m.setAttributeNode(val);
        m.setAttribute("value", c.getAttribute("value"));
        document.getElementById("departure_time"+tour).replaceChild(m, c);

    und vor allem kann man das Attribut value Prima ändern, es ist les- und beschreibbar.

    Du schießt hier mit Kanonen auf Spatzen.

    Struppi.

    1. Warum nutzt du nicht einfach http://de.selfhtml.org/javascript/objekte/options.htm@title=options?

      weil: zitat: "Und bevor jemand fragt, warum ich das so kompliziert programmiere und nicht einfach die vorhandenen Knoten manipuliere, kann ich nur sagen: "Vielen Dank an Firma Microsoft!"."

      Und bevor jemand fragt, warum ich das so kompliziert programmiere und nicht einfach die vorhandenen Knoten manipuliere, kann ich nur sagen: "Vielen Dank an Firma Microsoft!".

      Wobei ich das schon für falsch halte, wieso erzeugst du hier ein Attribut? Jedes Option hat von alleine ein Attribut value, das musst du nicht erzeugen.

      OK, geb ich Dir recht! Ich erzeuge es in <option>Wert</option>, welches ich klone, nicht drin steht. Soviel zur Intention die dahinter steht.

      und vor allem kann man das Attribut value Prima ändern, es ist les- und beschreibbar.

      ich will nicht das VALUE-Attribut ändern, sondern die Farbe! ;-)

      Du schießt hier mit Kanonen auf Spatzen.

      siehe Zitat oben!

      Struppi.

      Markus**

      1. Hi,

        Warum nutzt du nicht einfach http://de.selfhtml.org/javascript/objekte/options.htm@title=options?
        weil: zitat: "Und bevor jemand fragt, warum ich das so kompliziert programmiere und nicht einfach die vorhandenen Knoten manipuliere, kann ich nur sagen: "Vielen Dank an Firma Microsoft!"."

        Ein Selbstzitat mit ironisch gemeintem Dank erklaert trotzdem noch nicht, warum du so vorgehst, wie du vorgehst.
        Mir scheint es auf den ersten Blick naemlich auch reichlich kompliziert.

        Vielleicht gibt es ja eine einfachere Moeglichkeit, die keinen sarkastischen Dank an Microsoft erfordert, weil sie auch im IE funtkioniert - aber du hast sie noch nicht gefunden?
        Das koennte man allerdings nur dann beurteilen, wenn du auch mal beschreibst, wozu das ganze eigentlich dienen soll.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hi,

          Warum nutzt du nicht einfach http://de.selfhtml.org/javascript/objekte/options.htm@title=options?

          Ein Selbstzitat mit ironisch gemeintem Dank erklaert trotzdem noch nicht, warum du so vorgehst, wie du vorgehst.
          Mir scheint es auf den ersten Blick naemlich auch reichlich kompliziert.

          Vielleicht gibt es ja eine einfachere Moeglichkeit, die keinen sarkastischen Dank an Microsoft erfordert, weil sie auch im IE funtkioniert - aber du hast sie noch nicht gefunden?

          OK, dann suche ich sozusagen ein "options[#].disabled = "true"[|"false"]"
          disabled ist per definition in <option> möglich: http://de.selfhtml.org/html/referenz/attribute.htm#option

          Das koennte man allerdings nur dann beurteilen, wenn du auch mal beschreibst, wozu das ganze eigentlich dienen soll.

          Auch das: das dient dazu ein <option disabled="disabled"> on the fly in einer auswahlliste zu generieren. Da Internet Explorer sich noch dazu weigert, DOM generierte class Attribute auch auszuwerten, d.h. ich formatiere den Text EINER BESTIMMTEN Auswahl mit class neu, um "disabled" zu simulieren. IE lässt sich aber von der neuen Klasse nicht beeindrucken, Farbe bleib im Ursprungszustand.
          OK, könnte ich nun mit options[#].style.color umfärben, das wird interpretiert, so ist aber immernoch nicht das "disabled" problem gelöst, was ich ja auch in anderen Browsern nutzen möchte, oder?

          MfG ChrisB

          Gruß Markus**

          1. Hi,

            OK, dann suche ich sozusagen ein "options[#].disabled = "true"[|"false"]"
            disabled ist per definition in <option> möglich: http://de.selfhtml.org/html/referenz/attribute.htm#option

            Stimmt, dass der IE das nicht zu unterstuetzen scheint, hatte ich ja selbst letztens mal kurz getestet.

            Da Internet Explorer sich noch dazu weigert, DOM generierte class Attribute auch auszuwerten, d.h. ich formatiere den Text EINER BESTIMMTEN Auswahl mit class neu, um "disabled" zu simulieren. IE lässt sich aber von der neuen Klasse nicht beeindrucken, Farbe bleib im Ursprungszustand.

            Kann ich beim Testen ebenfalls nachvollziehen - als Workaround scheint es aber zu funktionieren, nach dem zuweisen der Klasse ueber optionXY.className die Option mal kurz mit sich selbst zu ersetzen,
            selectElement.replaceChild(optionXY, optionXY);

            • danach zeigt mir der IE die Option mit den "neuen" Formatierungen der zuvor vergebenen Klasse an.

            OK, könnte ich nun mit options[#].style.color umfärben, das wird interpretiert, so ist aber immernoch nicht das "disabled" problem gelöst, was ich ja auch in anderen Browsern nutzen möchte, oder?

            Auch wenn der IE sich vom disabled-Attribut unbeeindruckt zeigt, laesst er mich es dennoch per JavaScript abfragen - liefert true oder false zurueck.

            Da erschiene es mir doch einfacher (als das, was ich dich derzeit veranstalten sehe), in der Behandlung der Selectauswahl mit onchange abzufragen, ob die gewaehlte Option disabled=true hat, und dann entsprechend zu reagieren - z.B. durch Auswahl einer Default-Option, oder der davor zuletzt gewaehlten.

            Kannst ja mal pruefen, ob das eine brauchbare Alternative fuer dich darstellt.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Hi,

              Jau...

              Kann ich beim Testen ebenfalls nachvollziehen - als Workaround scheint es aber zu funktionieren, nach dem zuweisen der Klasse ueber optionXY.className die Option mal kurz mit sich selbst zu ersetzen,
              selectElement.replaceChild(optionXY, optionXY);

              • danach zeigt mir der IE die Option mit den "neuen" Formatierungen der zuvor vergebenen Klasse an.

              das mit dem "selectElement.replaceChild(optionXY, optionXY);" hatte ich nicht probier, weil nicht drauf gekommen! Dennoch blieben wir dann im DOM und schießne mit Spatzen auf Kanonen, oder so ähnlich! ;)

              Auch wenn der IE sich vom disabled-Attribut unbeeindruckt zeigt, laesst er mich es dennoch per JavaScript abfragen - liefert true oder false zurueck.

              Hab ich genauso auch festgestellt. In erster Linie ging es mir darum das disabled überhaupt ein- bzw. auszubauen aus der Auswahlbox

              Kannst ja mal pruefen, ob das eine brauchbare Alternative fuer dich darstellt.

              MfG ChrisB

              Thanks, Markus!

              1. das mit dem "selectElement.replaceChild(optionXY, optionXY);" hatte ich nicht probier, weil nicht drauf gekommen! Dennoch blieben wir dann im DOM und schießne mit Spatzen auf Kanonen, oder so ähnlich! ;)

                Naja, das ganze erklärt nicht, warum du createAttribut, createTextNode usw. verwendest, wenn es ein einfaches a.value = b.value tut.

                Und was das Aussehen angeht, funktioniert es im IE einwandfrei, wenn du die style Attribute direkt überschreibst. Fall es unbedingt eine Klasse sein muss, dann würde es sich anbieten das stylesheet auszulesen und dem option zuweisen.

                Struppi.

                1. Naja, das ganze erklärt nicht, warum du createAttribut, createTextNode usw. verwendest, wenn es ein einfaches a.value = b.value tut.

                  Und was das Aussehen angeht, funktioniert es im IE einwandfrei, wenn du die style Attribute direkt überschreibst. Fall es unbedingt eine Klasse sein muss, dann würde es sich anbieten das stylesheet auszulesen und dem option zuweisen.

                  Struppi.

                  Es geht ja im Grunde nur um das einfügen des dissabled Attributs. Wenn ich dann schonmal das Element im DOM hab, warum sollte ich dann die anderen Attribute nicht auch damit setzen?

                  Gruß, Markus

                  1. Es geht ja im Grunde nur um das einfügen des dissabled Attributs. Wenn ich dann schonmal das Element im DOM hab, warum sollte ich dann die anderen Attribute nicht auch damit setzen?

                    Weil es umständlicher ist und bei manchen Attributen nicht funktioniert (im IE).

                    Ich hab es soweit verstanden es geht um disable, aber mein IE reagiert gar nicht auf das Attribut, weder im HTML Code noch wenn man es mit JS ändert. Habt ihr jetzt einen Weg gefunden um ein option auf disable zu stellen?

                    Struppi.

                    1. Es geht ja im Grunde nur um das einfügen des dissabled Attributs. Wenn ich dann schonmal das Element im DOM hab, warum sollte ich dann die anderen Attribute nicht auch damit setzen?

                      Weil es umständlicher ist und bei manchen Attributen nicht funktioniert (im IE).

                      Ich hab es soweit verstanden es geht um disable, aber mein IE reagiert gar nicht auf das Attribut, weder im HTML Code noch wenn man es mit JS ändert. Habt ihr jetzt einen Weg gefunden um ein option auf disable zu stellen?

                      Struppi.

                      OK, also:

                      ###HIN:

                      document.getElementsByName("departure_time")[a].options[x].style.color = 'red';  
                      document.getElementsByName("departure_time")[a].options[x].style.textDecoration = 'line-through';  
                      c.setAttribute("disabled", "false");
                      

                      ###ZURÜCK:

                      document.getElementsByName("departure_time")[a].options[x].style.color = 'black';  
                      document.getElementsByName("departure_time")[a].options[x].style.textDecoration = 'none';  
                      c.removeAttribute("disabled");
                      

                      Einverstanden? :)

                      Gruß, Markus**

                      1. Einverstanden? :)

                        Warum nicht ;-)

                        Aber - wenn ich das richtig verfolgt habe - für das disable Problem im IE gibt es keine echte Lösung?

                        Struppi.

                        1. Einverstanden? :)

                          Warum nicht ;-)

                          Aber - wenn ich das richtig verfolgt habe - für das disable Problem im IE gibt es keine echte Lösung?

                          Struppi.

                          Nö, nicht wirklich.
                          Ich mache da halt ne Prüfung á la: if (IE) {if (SelectionHasAttributeDisabled) {.... usw.}}

      2. Warum nutzt du nicht einfach http://de.selfhtml.org/javascript/objekte/options.htm@title=options?
        weil: zitat: "Und bevor jemand fragt, warum ich das so kompliziert programmiere und nicht einfach die vorhandenen Knoten manipuliere, kann ich nur sagen: "Vielen Dank an Firma Microsoft!"."

        Das einzige mir bekannte Problem ist, dass du options nicht von einem Frame in das andere übertragen kannst und dass neu eingefügte Elemente (nicht options!) im IE eine Sonderbehandlung brauchen. Ansonsten weiß ich keinen der deinen Ansatz rechtfertigt, deshalb habe ichja gefragt.

        Wobei ich das schon für falsch halte, wieso erzeugst du hier ein Attribut? Jedes Option hat von alleine ein Attribut value, das musst du nicht erzeugen.

        OK, geb ich Dir recht! Ich erzeuge es in <option>Wert</option>, welches ich klone, nicht drin steht. Soviel zur Intention die dahinter steht.

        Ein leerers value ist auch ein value, mach mal ein typeof und du wirst es sehen, dass dieses Atrtribut schon existiert.

        und vor allem kann man das Attribut value Prima ändern, es ist les- und beschreibbar.
        ich will nicht das VALUE-Attribut ändern, sondern die Farbe! ;-)

        Also auch das ist bei mir im IE 7 ohne Probleme möglich.

        Du schießt hier mit Kanonen auf Spatzen.
        siehe Zitat oben!

        Das Zitat hab ich gelesen, aber trotzdem erkenne ich keinen Grund.

        Struppi.

        1. Das Zitat hab ich gelesen, aber trotzdem erkenne ich keinen Grund.

          siehe: https://forum.selfhtml.org/?t=182123&m=1205048

          Struppi.