Carsten Pieper: getElementsByName funzt nicht im iE

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

  1. 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)

    --
    http://www.cssweb.at.tt wird teil einer privaten (meiner!) webseite.
    ------------------
    Murphys Law: "Alles Schöne im Leben ist entweder illegal, ungesetzlich oder es macht dick."
    1. 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

      1. 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

      2. 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

        1. 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

          1. 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 mit

            document.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

            --
            "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
            1. 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

  2. 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

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
  3. 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