getElementsByName funzt nicht im iE
Carsten Pieper
- javascript
0 azok0 Carsten Pieper0 Carsten Pieper0 seth
0 wahsaga0 Carsten Pieper
Hallo Gemeinde!
Ich schreibe gerade ein Terminverwaltungssystem, was zur Zeit bei allen Browsern funktioniert, nur nicht im Internet Explorer.
Die Problematik zu erklären ist sehr schwer, wird aber deutlich, wenn man die Seite ausprobiert und sich den Quellcode anschaut.
Wenn Jemand auf "Der Termin sit mehrtägig" klickt, wird der komplette Datums-Eingabebereich geklont.
Ändert nun jemand den Monat des Enddatums, sollte eigentlich das Anfangsdatum unangetastet bleiben, und die Auswahlbox der Tage des Enddatums aktualisiert werden.
Der Code wird von den anderen Browsern ausgeführt wie er soll. Nur der IE aktualisiert die Tages-Auswahlbox des Anfangstermins.
Der relevante Codeausschnitt:
if(document.getElementsByName("tag").length==2){
//ist hingegen der Endtermin eingeblendet, greift dieser Code
for(var i=0;i<=1;i++){
selTag = document.tvs.tag[i].value;
selMonat = document.tvs.monat[i].value;
selJahr = document.tvs.jahr[i].value;
//Umweg für alle Nicht-IE-Browser
if (aktJahr < 999){
aktJahr+=1900;
}
//Anpassung des Jahres bei Auswahl eines Monats, der nicht mehr im aktuellen Jahr liegen kann
if (selMonat < aktMonat && aktJahr == selJahr){
document.tvs.jahr[i].selectedIndex++;
selJahr++;
}
//Generierung der Auswahlliste für Tage
switch(selMonat){
case "1": if (selJahr % 4 == 0) {monatstage=29;} else {monatstage=28;};break;
case "3": monatstage=30;break;
case "5": monatstage=30;break;
case "8": monatstage=30;break;
case "10": monatstage=30;break;
default: monatstage=31;break;
}
//Löschen der alten Auswahlliste um Overflow zu verhindern
while(document.getElementsByName("tag")[i].length>0){
document.getElementsByName("tag")[i].remove(0);
}
for(var j=1;j<=monatstage;j++){
var monatstag = document.createElement("option");
var beschriftung = document.createTextNode(j);
monatstag.appendChild(beschriftung);
monatstag.text = j;
monatstag.value = j;
document.getElementsByName("tag")[i].appendChild(monatstag);
}
document.getElementsByName("tag")[i].selectedIndex = selTag-1;
}
}
Unter der angegebenen Adresse findet Ihr die ganze Seite zum Ausprobieren.
Wenn jemand eine Idee hat, wie ich dem IE auch noch die korrekte Aktualisierung beibringen kann, wäre ich sehr dankbar.
Schönes Wochenende Euch allen,
Carsten
hi!
hmmm... du könntest das a) über eine browserabfrage zu lösen versuchen,
oder b) document.getElementById("...") versuchen.
hoffe ich konnte helfen
lg
azok(=freak)
Hallo nochmal,
hmmm... du könntest das a) über eine browserabfrage zu lösen versuchen,
Tja, nur welchen Code versteht der IE? Ich kann ihn auf keinen Fall ausschließen.
oder b) document.getElementById("...") versuchen.
In dem Moment, wo die Zelle mit dem Anfangsdatum-Krempel mit der ID Anfangskrempel geklont wird, ist die ID ja nicht mehr eindeutig, dann habe ich erst recht ein Problem, würde ich so vermuten. Probiere das gleich aber mal aus.
Ich werde hier wieder berichten, besten Dank schon jetzt,
Carsten
Hallo nochmal,
oder b) document.getElementById("...") versuchen.
In dem Moment, wo die Zelle mit dem Anfangsdatum-Krempel mit der ID Anfangskrempel geklont wird, ist die ID ja nicht mehr eindeutig, dann habe ich erst recht ein Problem, würde ich so vermuten. Probiere das gleich aber mal aus.
Ich werde hier wieder berichten
Wie vermutet, getElementById hat keinerlei Effekt.
Hat jemand noch eine andere Idee?
Auch dafür schon jetzt ein herzliches Dankeschön,
Carsten
hi!
hmmm... du könntest das a) über eine browserabfrage zu lösen versuchen,
Tja, nur welchen Code versteht der IE?
ie versteht document.all
damit (genauer mit innerHTML und outerHTML) kannst du, wenn gar nix anderes mehr helfen sollte, direkt und dynamisch den html-code an die entsprechenden stellen schreiben.
http://de.selfhtml.org/javascript/objekte/all.htm
prost
seth
ie versteht document.all
damit (genauer mit innerHTML und outerHTML) kannst du, wenn gar nix anderes mehr helfen sollte, direkt und dynamisch den html-code an die entsprechenden stellen schreiben.
Tja, an die entsprechenden Stellen ist leicht gesagt. Genau da liegt ja mein Problem. Das ich die entsprechende Stelle mit
document.getElementsByName("tag")[1] anspreche, IE dies aber nicht beachtet und
document.getElementsByName("tag")[0] auch beim zweiten Durchlauf
für die for-Schleife mit
document.getElementsByName("tag")[i];i++;i<2 nimmt.
Ich probiere weiter, vielen Dank dennoch,
Carsten
hi,
Tja, an die entsprechenden Stellen ist leicht gesagt. Genau da liegt ja mein Problem. Das ich die entsprechende Stelle mit
document.getElementsByName("tag")[1] anspreche, IE dies aber nicht beachtet und
document.getElementsByName("tag")[0] auch beim zweiten Durchlauf
für die for-Schleife mitdocument.getElementsByName("tag")[i];i++;i<2 nimmt.
hast du dir den wert von i an dieser stelle mal zur kontrolle mit alert ausgeben lassen, um zu kontrollieren, ob _wirklich_ auf [1] zugegriffen wird, wie du es dir denkst?
gruß,
wahsaga
Hallo,
hast du dir den wert von i an dieser stelle mal zur kontrolle mit alert ausgeben lassen, um zu kontrollieren, ob _wirklich_ auf [1] zugegriffen wird, wie du es dir denkst?
Ja, habe ich, und der Wert ist tatsaächlich erst 0 und dann 1, nur dass der IE beim zweiten Durchlauf immer noch auf das erste Element zugreift. Kann Bill nicht zählen?
Grüße, Carsten
hi,
//Umweg für alle Nicht-IE-Browser
if (aktJahr < 999){
aktJahr+=1900;
ist vermutlich eingebaut worden, um die unterschiedlichen rückgabewerte der methode getYear() des Date-objektes abzufangen.
evtl. wäre da http://de.selfhtml.org/javascript/objekte/date.htm#get_full_year eine alternative.
switch(selMonat){
case "1": if (selJahr % 4 == 0) {monatstage=29;} else {monatstage=28;};break;
nur der vollständigkeit halber: von den jahrhunderten sind nur die durch 400 teilbaren schaltjahre.
aber gut, wenn das datum nicht in die vergangenheit reicht, hast du das problem ja erst in 96 jahren :-)
case "3": monatstage=30;break;
case "5": monatstage=30;break;
case "8": monatstage=30;break;
case "10": monatstage=30;break;
hier kannst du ein wenig abkürzen:
case "3":
case "5":
case "8":
case "10":
monatstage=30;
break;
gruß,
wahsaga
So ein letztes Hallo in diesem Thread, denn das Problem habe ich selber lösen können. Nun möchte ich natürlich nicht die Lösung vorenthalten:
die kreierten option-Elemente müssen laut DOM nicht, wie ich es getan habe, mit appendChild, sondern mit add angehängt werden.
Das allerdings verstehen wieder Opera, Mozilla, Mozilla Firefox und Netscape nicht.
Also bleibt es doch dabei: Der IE hält sich an die Standards.
Eine ältere Opera-version [7.03] schmierte beim Klonen der Auswahlboxen ja sogar mit einem Speicherzugriffsfehler ab:-)
Wie dem auch sei, mit einer Weiche werden jetzt alle bedient.
Herzlichen Dank, ohne eure Tipps wäre ich wahrscheinlich gar nicht mal drauf gekommen.
Die Datei, auf die sich der ganze Thread bezieht, ist jetzt fertiggestellt und an eine Datenbank angebunden und deshalb passwortgeschützt, steht also nicht mehr zur Verfügung, sorry.
Herzlichen Dank noch mal,
Carsten