Sven: Meine Schleife geht nicht, bitte um hilfe

Hi Leute!

Gott sei Dank gibt es das Forum wieder, sonst würde ich jetzt wieder haareraufend und stundenlang den Irrtum suchen. Vielleicht kann mir jemand einen schnellen Schups geben:

Folgende Schleife geht nicht:

for (k = 0; k < document.reservierung.kartenZahl.options.length; k++)
{

//alert(document.reservierung.kartenZahl.options[k].value);
  document.reservierung.kartenZahl.options[k] = null;

}

Es geht darum dass alle Einträge einer Auswahlliste gelöscht werden sollen. Ich setze daher alle Options auf null.

Geht, aber nur fast. Die geraden Elemente bleiben mir leider stehen, die Schleife durchläuft also nicht jedes Element, sondern nur jedes 2. Egal ob im IE oder NS, also muss bei mir etwas nicht passen, ich suche jetzt aber schon eine ganze Weile.

Ganz lieben Dank für Eure Hinweise.

gruß
sven

  1. Hallo Sven

    for (k = 0; k < document.reservierung.kartenZahl.options.length; k++)
    {

    //alert(document.reservierung.kartenZahl.options[k].value);
      document.reservierung.kartenZahl.options[k] = null;

    }

    Es geht darum dass alle Einträge einer Auswahlliste gelöscht werden sollen. Ich setze daher alle Options auf null.

    hier machst du einen grundsätzlichen Denkfehler. Du veränderst während der Laufzeit die Länge der Liste. Entfernst du das erste Element, dann rutsch das zweite an die Stelle 0. Dein k steht aber jetzt bei 1 und behandelt eben das Element, dass an zweiter Stelle steht.

    Deswegen wird auch nur die Hälfte gelöscht.

    Abhilfe:
    for (k=document.reservierung.kartenZahl.options.length-1;k>-1; k--)
    document.reservierung.kartenZahl.options[k] =null

    oder
    while (document.reservierung.kartenZahl.options.length>0)
    document.reservierung.kartenZahl.options[0] =null

    oder
    ganz einfach
    document.reservierung.kartenZahl.options.length=0;

    Viele Grüße

    Antje

    1. Hallo!

      oder
      ganz einfach
      document.reservierung.kartenZahl.options.length=0;

      Es sollte hierzu vielleicht noch ergänzt werden, dass diese 3. Variante eventuell mit Vorsicht zu geniessen ist, da sie lt. SELFHTML 8 (siehe:http://selfhtml.teamone.de/javascript/objekte/options.htm#elemente_loeschen) von Opera 5.12 nicht unterstützt wird.

      Gruß,

      kerki

      1. Hallo Kerki

        document.reservierung.kartenZahl.options.length=0;

        Es sollte hierzu vielleicht noch ergänzt werden, dass diese 3. Variante eventuell mit Vorsicht zu geniessen ist, da sie lt. SELFHTML 8 (siehe:http://selfhtml.teamone.de/javascript/objekte/options.htm#elemente_loeschen) von Opera 5.12 nicht unterstützt wird.

        Dieses Posting steht unter einen miesen Stern. *seufz* naja alle guten Dinge sind drei.

        Opera verhält sich im Bezug auf Auswahllisten nicht sehr korrekt. Ich habe den Verdacht, er updatet sich klammheimlich ;-), denn mir ist schon mehrfach passiert, dass er plötzlich was kann was er früher nicht konnte <g>. Also mal genauer untersucht, wo es hängt:

        Die Anzahl der Optionelement einer Liste kann man auf 2 Arten bestimmen.

        Liste.length und Liste.options.length

        Lt. NN-Dokumentation ist das ein- und dasselbe.

        This value of this property is the same as the value of Option.length
        This value of this property is the same as the value of Select.length

        In einem vernünftigen Browser ist es völlig egal, welchen der beiden Werte man ändert. Die werden jeweils an den anderen Wert durchgereicht.

        Da erzeugt Liste.length=2 den gleichen Effekt wie Liste.options.length=2

        Nicht so jedoch bei Opera. Dieser Browser reicht einen neuen Wert von Liste.length nicht an Liste.options.length weiter. Das bedeutet:
        hat eine Liste 3 Elemente und man ändert diese Länge mit Liste.length auf 2, dann gibt Liste.length zwar brav 2 aus, jedoch Liste.options.length immer noch 3.

        Umgekehrt klappt es dann. Ändert man Liste.options.length auf 2, dann ist in Liste.length und in Liste.options.length der gleiche Wert enthalten.

        Viele Grüße

        Antje

        1. Hallo Antje!

          document.reservierung.kartenZahl.options.length=0;
          Umgekehrt klappt es dann. Ändert man Liste.options.length auf 2, dann ist in Liste.length und in Liste.options.length der gleiche Wert enthalten.

          Somit wäre dieses Problem also gelöst! :-)

          Zumindest bis die Opera 6.0 final 'rauskommt.

          Vielleicht haben die Entwickler dort im hohen Norden dann auch einen anderen Bug beseitigt, der mich gestern an den Rand des Wahnsinns getrieben hat. Seit einiger Zeit surfe ich vornehmlich hier im Forum nur noch mit dem Opera, weil ich dessen interne Fensterverwaltung so mag und alles so hübsch flott geht.

          Etwas dumm dabei ist nur, dass es - ich weiß nicht, ob du es schon wußtest - mit Opera (WIN) definitiv _nicht_ möglich ist, einen Beispiel-Quelltext aus dem Browserfenster per copy&paste 1:1 in einen Texteditor zu übernehmen. Eigentlich Pipifax, aber er tut nicht. =:-o

          Du kannst es gerne einmal mit diesem hübschen Quelltext von Thomas J.S. versuchen: http://forum.de.selfhtml.org/?m=3789&t=622.

          Markieren, Kopieren, im Texteditor einfügen, speichern, im Browser öffnen => Müll : Copy & Waste :-(((

          Dasgleiche mit z.B. dem IE und eine ganz andere Seite tut sich auf, die noch das letzte an CSS aus dem alten NS 4.7 herausholt. Zumindest so ungefähr. *g*

          Das Beste daran ist, dass dieses Problem bei Opera-Software durchaus seit der ersten Browser-Version bekannt ist, die Entwickler sich aber nicht genötigt sehen, das Problem in Bälde zu beheben.

          Man munkelt, den Entwicklern sei bei der Umsetzung von Unix auf Windows beim Zeilenumbruch, der dann ja nicht nur ein CR sondern ein LF/CR ist, das LF durchgerutscht, das jetzt für den Schlamassel verantwortlich zeichnet. Ob das stimmt, weiß ich allerdings nicht.

          In der Opera-Newsgroup hat ein User sogar _ernsthaft_ vorgeschlagen, man möge doch in das nächste Browserupdate einen Button einbauen, mit dem man bequem die aktuelle Seite im IE laden könne, um dann dort den Text kopieren zu können. :-)

          Irgendwie machen diese kleinen Tolpatschigkeiten den Opera dann aber auch wieder liebenswert, findest du nicht? .-)

          Gruß,

          kerki

          1. Hi kerki!

            Irgendwie machen diese kleinen Tolpatschigkeiten den Opera dann aber auch wieder liebenswert, findest du nicht? .-)

            Eben, und jetzt sag noch mal einer was gegen Netscape... ;-)

            So long

          2. Hi Kerki

            Seit einiger Zeit surfe ich vornehmlich hier im Forum nur noch mit dem Opera, weil ich dessen interne Fensterverwaltung so mag und alles so hübsch flott geht.

            Ich vermute du spielst auf das automatische ReloadIntervall und das öffnen
            der Beiträge in nem extrafenster an. Das kann man sich aber ziemlich billig
            in JS basteln und als Bookmarklet ablegen, sodaß du's auch in langsameren *g+
            Browsern zur Verfügung hast!

            Wenn das deine einzigen Gruende für Opera sind ... :)

            Viele Grueße
            Ro*BML-Fetischist*lf

            PS: Nachdem ich weiß das das Calocybe im Wald sprießt, wat soll den "Kerki"
            darstellen, stammste etwa aus "Kerki, Turkmenistan" ;)?

            1. Hallo Rolf!

              Ich vermute du spielst auf das automatische ReloadIntervall

              was'n das?

              und das öffnen der Beiträge in nem extrafenster an.

              Ich meinte vielmehr, dass er nicht für jedes Fenster eine neue Browserinstanz öffnet.

              PS: Nachdem ich weiß das das Calocybe im Wald sprießt, wat soll den "Kerki" darstellen

              Nicht mehr und nicht weniger als ein simpler Spitzname.

              stammste etwa aus "Kerki, Turkmenistan" ;)?

              Bisher war ich noch nie so eitel nach meinen eigenen Namen zu "googlen". _Das_ Kerki kannte ich noch gar nicht. Jetzt muss ich mich mit Platz 40 begnügen. Und dann noch mit einem Beitrag bei der Konkurrenz. *peinlich* ;-(

              Gruß,

              kerki

              1. Hi Kerki

                Ich vermute du spielst auf das automatische ReloadIntervall

                was'n das?

                Na als ich das letzte mal in der Oper war konnte man einstellen dass ne
                Seite alle 5 o. 10 o. 15 o. 20 ... Minuten neu geladen wird!

                Turkmenische Gruesse ;)
                Rolf

    2. Hallo Sven

      for (k = 0; k < document.reservierung.kartenZahl.options.length; k++)
      {

      //alert(document.reservierung.kartenZahl.options[k].value);
        document.reservierung.kartenZahl.options[k] = null;

      }

      Es geht darum dass alle Einträge einer Auswahlliste gelöscht werden sollen. Ich setze daher alle Options auf null.

      hier machst du einen grundsätzlichen Denkfehler. Du veränderst während der Laufzeit die Länge der Liste. Entfernst du das erste Element, dann rutsch das zweite an die Stelle 0. Dein k steht aber jetzt bei 1 und behandelt eben das Element, dass an zweiter Stelle steht.

      Deswegen wird auch nur die Hälfte gelöscht.

      warum nicht einfach die Länge der Auswahliste als Variabel vorher auslesen und sie so, absolut in die Schleife setzten?

      DK = document.reservierung.kartenZahl.options.length;

      for (k = 0; k < DK ; k++)

      so, wenn jetzt noch ein Element fehlt oder ein Fehler kommt, dann mit

      DK-1 oder DK+1 experementieren.

      Das sollte eigentlich gehen.

      Grüße von Hannibal

      1. Hallo Hannibal

        warum nicht einfach die Länge der Auswahliste als Variabel vorher auslesen und sie so, absolut in die Schleife setzten?

        DK = document.reservierung.kartenZahl.options.length;

        for (k = 0; k < DK ; k++)

        so, wenn jetzt noch ein Element fehlt oder ein Fehler kommt, dann mit

        DK-1 oder DK+1 experementieren.

        Das sollte eigentlich gehen.

        Das ändert nichts am Problem, abgesehen davon, dass am Ende eine Reihe von ungültigen Aufrufe kommen.

        An die Stelle des gelöschten Elementes rutscht ein nicht gelöschtes Element.

        Beispiel: 6 Elemente a, b, c, d, e,f Stellen 0,1,2,3,4,5

        1. Durchlauf 6 Elemente k=0

        Element a wird gelöscht

        neue Reihenfolge: b,c,d,e,f Stellen 0,1,2,3,4

        2. Durchlauf 5 Elemente k=1

        Element c wird gelöscht

        neue Reihenfolge b,d,e,f Stellen 0,1,2,3

        3. Durchlauf 3 Elemente k=2

        Element e  wird gelöscht

        neue Reihenfolge b,d,f Stellen 0,1,2

        hier bricht in der Originalversion die Schleife ab, das die Länge automatisch angepaßt wird und 3 Elemente bleiben erhalten.

        In deiner Version erfolgen noch die Durchläufe

        k=3,k=4,k=5 die aber kein Element mehr finden ==> Fehler

        Am Problem ändert sich nichts, drei Elemente bleiben übrig, weil deine Schleife sie einfach nicht erfassen kann.

        Viele Grüße

        Antje

    3. Hi Antje und alle anderen lieben Helfer!

      <schäm>Ui meine Logik hat da total versagt.</schäm>

      Also das ist die Lösung meiner Wahl, kurz, prägnant und funkt.

      while (document.reservierung.kartenZahl.options.length>0)
      document.reservierung.kartenZahl.options[0] =null

      Danke nochmals, ihr seid großartig.

      gruß
      sven

  2. Hallo !

    Bin leider kein JavaScript-Experte, aber ich hab' da so einen Verdacht:

    for (k = 0; k < document.reservierung.kartenZahl.options.length; k++)
    {

    //alert(document.reservierung.kartenZahl.options[k].value);
      document.reservierung.kartenZahl.options[k] = null;

    }

    Es geht darum dass alle Einträge einer Auswahlliste gelöscht werden sollen. Ich setze daher alle Options auf null.

    Ist nicht, sobald du den 1. Eintrag der Liste löschst, derjenige, der vorher 2. war auf einmal schon der 1., der vormals 3. jetzt der 2. usw.?

    Vielleicht solltest du einfach nur x-mal den jeweils 1. Eintrag löschen?

    Gruß,

    kerki

  3. Hi,
    Bin zwar im Moment net so wach,

    aber ich glaub dein Problem hat damit zu tun, dass du
    "options" auf NULL setzt,
    "length" aber ein element von "options" ist.
    Daher ist dieses length beim nächstens Schleifendurchlauf schon nicht mehr bekannt.

    Versuch vor der Schleife einer Zählvariable den Wert von length zuzuweisen.

    Würde mich interessieren worans lag.
    Jetz hau ich mich aufs Ohr :-)

    mfg Daniel