Meine Schleife geht nicht, bitte um hilfe
Sven
- javascript
0 Antje Hofmann0 kerki0 Daniel
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
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
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
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
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
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
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" ;)?
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
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
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
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
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
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
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