werbeklaus: IE ignoriert appendChild

Hallo,
Ich möchte mit Hilfe von JavaScript auf Knopfdruck eine Tabellenzeile kopieren und anfügen. Da die Zeilen recht viel mit names und ids zu tun haben, müssen die erst ausgetauscht werden.
Mit dem Firefox geht es einwandfrei:
Die Zeile wird geklont, bearbeitet und dann mit appendChild eingefügt.
Der IE jedoch bringt keine Fehlermeldung und fügt die Zeile auch ein, da man danach auf die Zeile zugreifen kann. Jedoch ändert sich nichts an der Ansicht!

Kann ich irgendwie befehlen, die Ansicht zu aktualisieren? Oder hat der IE so ein Problem mit appendChild?

Danke für die Hilfe,
werbeklaus

  1. moin werbeklaus :)

    Kann ich irgendwie befehlen, die Ansicht zu aktualisieren? Oder hat der IE so ein Problem mit appendChild?

    mit appendChild nicht.. aber du erwähntest weiter oben, dass du einiges mit names tust? Was der IE für <td>s nicht kann ist nämlich "getElementByNames()".
    (Eigentlich verhält sich der IE sogar korrekt, da das name-Attribut für <td>s nicht vorgesehen ist)

    liebe Grüße aus Berlin
    lina-

    --
    Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
    1. mit appendChild nicht.. aber du erwähntest weiter oben, dass du einiges mit names tust? Was der IE für <td>s nicht kann ist nämlich "getElementByNames()".
      (Eigentlich verhält sich der IE sogar korrekt, da das name-Attribut für <td>s nicht vorgesehen ist)

      Ich verwende das getElementByNAme nicht....
      Aber trotzdem sollte er doch ein Objekt anzeigen, dass man mit appendChild eingefügt hat. Vorallem wenn es der FF doch macht!

      1. werbeklaus,

        Ich verwende das getElementByNAme nicht....

        Aber niemand weiß, was du verwendest. </faq/#Q-07c>

        Live long and prosper,
        Gunnar

        --
        „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
        1. Aber niemand weiß, was du verwendest. </faq/#Q-07c>

          okay...

          Hier der Quellcode:

            
          function armies_add_new_target ()  
          {  
           // IDs Lokal festlegen  
           var last_id = armies_next_target_id - 1;  
           var next_id = armies_next_target_id++;  
            
           // letzten Zeilen auslesen  
           var new_target_row = document.getElementById("target_" + last_id + "_").cloneNode(true);  
           var new_action_row = document.getElementById("action_" + last_id + "_").cloneNode(true);  
            
           // IDs und Names ändern  
           var new_target_row = armies_change_ids(next_id, new_target_row);  
           var new_action_row = armies_change_overlay(new_action_row);  
           var new_action_row = armies_change_ids(next_id, new_action_row);  
            
           // Knoten an die Tabelle hängen  
           document.getElementById("target_table").appendChild(new_target_row);  
           document.getElementById("target_table").appendChild(new_action_row);  
            
           document.getElementById("row_id_" + next_id + "_").firstChild.nodeValue = next_id;  
            
           overlay_init();  
           overlay_toggleALL(false);  
          }  
          
          

          Hier noch die anderen Funktionen:

            
          function armies_change_ids (next_id, current_node)  
          {  
            
           // Funktion für jedes eigene Kind aufrufen (rekursiv)  
           for (var i = 0; i < current_node.childNodes.length; i++) {  
            current_node.replaceChild(armies_change_ids(next_id, current_node.childNodes[i]), current_node.childNodes[i]);  
           }  
            
           if (typeof(current_node.data) == "string")  
           {  
            return current_node;  
           }  
            
           // ID und Name ändern  
           if (current_node.getAttribute("id")) {  
            current_id = current_node.getAttribute("id");  
            if (current_id.search(/overlay_.+/) == -1) {  
             current_node.id = current_id.replace(/_\d*_/, "_" + next_id + "_");  
            }  
           }  
           if (current_node.getAttribute("name")) {  
            current_name = current_node.getAttribute("name");  
            if (current_name.search(/overlay_.+/) == -1) {  
             current_node.name = current_name.replace(/\[\d*\]/, "[" + next_id + "]");  
            }  
           }  
            
           return current_node;  
          }  
            
          // Brauche ich wegen der rekursion ;)  
          armies_change_overlay_id = -1;  
            
          function armies_change_overlay (current_node)  
          {  
           if (armies_change_overlay_id == -1) {  
            for (var i = 0; test = document.getElementById("overlay_" + i + "_area"); i++) {}  
            armies_change_overlay_id = i;  
            
           }  
            
           if (typeof(current_node.data) == "string")  
           {  
            return current_node;  
           }  
            
           var flag = false;  
            
           if (current_node.getAttribute("id")) {  
            if (current_node.id.search("overlay_js_stop") != -1) {  
             var flag = true;  
            }  
           }  
            
           if (!flag) {  
            // Funktion für jedes eigene Kind aufrufen (rekursiv)  
            for (var i = 0; i < current_node.childNodes.length; i++) {  
             current_node.replaceChild(armies_change_overlay(current_node.childNodes[i]),current_node.childNodes[i]);  
            }  
           }  
            
           // ID, Name und href ändern  
           if (current_node.getAttribute("id")) {  
            
            current_node.id = current_node.getAttribute("id").replace(/_\d*_/, "_" + armies_change_overlay_id + "_");  
            
            if (current_id.search(/overlay_\d*_area/) != -1) {  
             armies_change_overlay_id++;  
            }  
           }  
           if (current_node.getAttribute("name")) {  
            
            current_node.name = current_node.getAttribute("name").replace(/_\d*_/, "_" + armies_change_overlay_id + "_");  
            
           }  
           if (current_node.getAttribute("href")) {  
            if (current_node.getAttribute("href").search("localhost") == -1)  
            {  
             current_node.href = current_node.getAttribute("href").replace(/\(\d*\)/, "(" + armies_change_overlay_id + ")");  
            
            }  
           }  
            
           return current_node;  
          }  
          
          

          So ich hoffe ihr könnt mir nun helfen :-/

          1. moin werbeklaus :)

            So ich hoffe ihr könnt mir nun helfen :-/

            hmmm... ich kann es nicht mit 100%iger Sicherheit sagen - aber ich glaube du hast vergessen, dass der IE ein <thead> bzw. <tbody> mit einbaut - bzw. erwartet.
            In normalem HTML stört das nicht - aber wenn mit dem DOM gearbeitet wird, ist das zwinged notwendig (meine Erfahrung)
            Den FF stört das btw nicht ;)

            liebe Grüße aus Berlin
            lina-

            --
            Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
            1. hmmm... ich kann es nicht mit 100%iger Sicherheit sagen - aber ich glaube du hast vergessen, dass der IE ein <thead> bzw. <tbody> mit einbaut - bzw. erwartet.

              Ja das war der Fehler...
              ---> Aber nun streikt Opera :-(

              JavaScript Console spukt das aus:
              [code=t]
              Error:
              name: TypeError
              message: Statement on line 873: Could not convert undefined or null to object
              Backtrace:
                Line 873 of linked script http://localhost/ogame/logged_in/data/javascripts.js
                  var new_target_row = document.getElementById("target_" + last_id + "_").cloneNode(true);
                Line 1 of  script
                  armies_add_new_target();
                At unknown location
                  [statement source code not available]
              [/code]

              1. moin werbeklaus :)

                Was sollte sich denn hinter document.getElementById("target_" + last_id + "_") verbergen und was ist tatsächlich da? Die Fehlermeldung läßt ja vermuten, dass da ein undefinierter Wert entstanden ist (vielleicht kann Opera nicht alles DOM-spezifische was  es können sollte?) Aber da bin ich auch eher überfragt.
                Lass dir doch mal vorher ausgeben, was da für ein Element dahintersteckt ;) Dann weisst du schonmal mehr.

                liebe Grüße aus Berlin
                lina-

                --
                Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
                1. Lass dir doch mal vorher ausgeben, was da für ein Element dahintersteckt ;) Dann weisst du schonmal mehr.

                  Das ist das Resultat von alert(document.getElementById("target_" + last_id + "_")):
                  [object HTMLTableRowElement]

                  1. Lass dir doch mal vorher ausgeben, was da für ein Element dahintersteckt ;) Dann weisst du schonmal mehr.

                    Das ist das Resultat von alert(document.getElementById("target_" + last_id + "_")):
                    [object HTMLTableRowElement]

                    Ich habe das Problem mittlerweile etwas lokalisiert
                    Der Opera hat ein Problem mit dieser Zeile

                    Ich habe diese Funktion etwas umgeschrieben:

                      
                    function armies_change_ids (next_id, current_node)  
                    {  
                     // Funktion für jedes eigene Kind aufrufen (rekursiv)  
                     for (var i = 0; i < current_node.childNodes.length; i++) {  
                      new_node = armies_change_ids(next_id, current_node.childNodes[i]);  
                      alert(i + " Rekursionsschleife\nNach Rekursion\nChildNode : " + current_node.childNodes[i]);  
                      if (change)  
                      {  
                       alert("Im [IF] (Rekursionsschleife)\nChange = " + change);  
                       current_node.replaceChild(new_node, current_node.childNodes[i]);  
                       change = false;  
                      }  
                      alert(i + " Rekursionsschleife\nEnde\nChildNode : " + current_node.childNodes[i]);  
                     }  
                    
                    

                    Aber das Problem liegt am "replaceChild()"

                    Der Opera gibt dann noch die intelligenteste Meldung überhaupt aus:
                    SpellForce - Online Game
                    http://localhost/ogame/logged_in/include.php5?page=armies
                    Event thread: click
                    Unhandled exception: [Object DOMException]

                    1. Hallo,

                      current_node.replaceChild(new_node, current_node.childNodes[i]);

                      
                      > Aber das Problem liegt am "replaceChild()"  
                      >   
                      > Der Opera gibt dann noch die intelligenteste Meldung überhaupt aus:  
                      > Unhandled exception: [Object DOMException]  
                        
                      Das ist tatsächlich die intelligenteste Meldung, die ein Browser dir geben kann - sie folgt nämlich den DOM-Exception-Konzept. Du kannst die Exception abfangen und dann den Fehlercode in Erfahrung bringen  
                      ~~~javascript
                      try {  
                          ... Zeile mit replaceChild() ...  
                      } catch (e) {  
                          window.alert('Fehlercode ' + e.code);  
                      }
                      

                      Die Bedeutung der Codes ist hier beschrieben: http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-17189187
                      Hier ist beschrieben, welche Exceptions replaceChild() überhaupt auslösen kann: http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-785887307

                      Der Fehler kann wohl nur mit den beteiligten Knoten current_node, new_node und current_node.childNodes[i] zusammenhängen, also prüfe am besten diese.

                      Mathias

  2. Hallo werbeklaus.

    Die Zeile wird geklont, bearbeitet und dann mit appendChild eingefügt.
    Der IE jedoch bringt keine Fehlermeldung und fügt die Zeile auch ein, da man danach auf die Zeile zugreifen kann. Jedoch ändert sich nichts an der Ansicht!

    Hast du den implizierten Dokumentenbaum innerhalb einer Tabelle beachtet? (siehe </archiv/2005/7/t111103/#m698499>)

    Einen schönen Freitag noch.

    Gruß, Ashura

    --
    Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
    30 Days to becoming an Opera8 Lover -- Firefox tools for Opera built-ins
    Meine Browser: Opera 8.02 | Firefox 1.0.6 | Lynx 2.8.5 | Netscape 4.7 | IE 6.0
    MathML fetzt
    1. Hast du den implizierten Dokumentenbaum innerhalb einer Tabelle beachtet? (siehe </archiv/2005/7/t111103/#m698499>)

      Uiuiuiuiiiii

      Stimmt...
      ---> ich habe einfach nur ein <tbody> Tag eingefügt, und nun pakts der IE !

      Jetzt is nur noch Opera am streiken :-(