Max V: Klassenname jeder Zelle einer Tabelle speichern

Hallo!

Mit dem folgenden Code möchte ich den Klassennamen jeder Zelle einer Tabelle auslesen und in einem Array speichern. Das Array ist nach der id der Zeile benannt und wird nur erstellt, wenn die Zeile eine id besitzt.

Im Internet Explorer taucht folgender Fehler auf:
Zeile: 102; Zeichen: 4; Fehler: Das Objekt unterstützt diese Eigenschaft oder Methode nicht.; Code: 0

Im Firefox sowie im Opera funktioniert alles ohne Probleme.

Hier der Code:

function saveRows ()
{
 var trnumber = document.getElementsByTagName('table')[1].rows.length-1; // anzahl der zeilen
 for(var i = 0; i <= trnumber; i++) { // jede zeile durchgehen
  var lineId = document.getElementsByTagName('table')[1].rows[i].getAttribute('id'); // id-attribut auslesen
  if(lineId != null && lineId != '') { // checken, ob id vorhanden ist; wenn das der fall ist:
   var numbertrcn = document.getElementsByTagName('table')[1].rows[i].childNodes.length-1; // anzahl der spalten zählen
   eval(lineId + ' = new Array()'); // neues array mit der id der zeile erstellen
   for(var j = 0; j <= numbertrcn; j++) { // for schleife für speicherung der klasse jeder zelle
    eval(lineId + '.push("' + document.getElementsByTagName('table')[1].rows[i].childNodes[j].className + '");');
   }
  }
 }

}

Wo ist der Fehler?
Mit alert() habe ich ihn auf eval() lokalisieren können. Steht der Alert vor eval(...), wird er angezeigt. Steht er danach, wird er nicht angezeigt.

Bin über jeden Vorschlag dankbar. :)

  1. Hallo Max,

    var lineId = document.getElementsByTagName('table')[1].rows[i].getAttribute('id'); // id-attribut auslesen

    Versuch es doch mal, indem du die ID ohne den Umweg über getAttribute() ausliest, also einfach wie folgt:

      
    var lineId = document.getElementsByTagName('table')[1].rows[i].id;
    

    Gruß Gernot

    1. Versuch es doch mal, indem du die ID ohne den Umweg über getAttribute() ausliest, also einfach wie folgt:

      var lineId = document.getElementsByTagName('table')[1].rows[i].id;

        
      Hallo,  
        
      hat leider nichts bewirkt - der Fehler besteht immer noch.  
        
      Trotzdem Danke für deine Idee.
      
      1. Hallo Max,

        Versuch es doch mal, indem du die ID ohne den Umweg über getAttribute() ausliest, also einfach wie folgt:

        var lineId = document.getElementsByTagName('table')[1].rows[i].id;

          
        Auch wenn es da noch mehr Fehler gibt, ich würde in jedem Fall direkt auf die ID zugreifen, wenn das möglich ist. Das ist häufig ein Problem für den IE, das habe ich auch schon bemerkt. Ich hätte allerdings wegen deines Zugriffs über childNodes und möglichen white-spaces dazwischen eher Probleme bei Geckos und Opera vermutet und finde es geradezu paradox, dass es umgekehrt ist. Oder schreibst du deine TD-Elemente alle ohne Umbruch im Quellcode nebeneinander?  
          
        vgl.: <http://forum.de.selfhtml.org/archiv/2005/8/t113904/#m724637>  
          
        Du solltest vielleicht eher statt auf sämtliche childNodes der Tabellenzeilen inklusive (leerer Text und Kommentarknoten) abermals auf Elemente eines bestimmten TagNamens zugreifen.  
          
        also etwa `getElementByID('lineID').getElementsByTagName('TD')[j]`{:.language-javascript}  
          
        Gruß Gernot
        
  2. hi,

    eval(lineId + ' = new Array()'); // neues array mit der id der zeile erstellen

    eval ist doch hier völliger quark.

    entweder speicherst du die einzelnen arrays ebenfalls wiederum in einem array - hätte den vorteil, dass du dann auch alle gleichartigen daten in einer struktur beeinander hast. dann brauchst du nur lineId als index zu verwenden,
    gesamtArray[lineId] = new Array();

    oder, wenn du wirklich für jedes eine eigenständige variable haben willst, nutze aus, dass alle variablen im globalen scope nicht nur über varname ansprechbar sind, sondern auch über window["varname"].
    würde dann also bedeuten, neue arrays anlegen über
    window[lineId] = new Array(),

    mit dieser methode (und auch deinem eval) überschreibst du dir aber ggf. bereits vorhandene objekte, wenn eine gleichnamige lineId auftaucht.
    deshalb würde ich die erste methode, ein array mit zwei dimensionen zum ablegen der daten, vorziehen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. eval ist doch hier völliger quark.

      Als völligen Quark würde ich es nicht bezeichnen, es ist halt EINE Lösung. ;-)

      entweder speicherst du die einzelnen arrays ebenfalls wiederum in einem array - hätte den vorteil, dass du dann auch alle gleichartigen daten in einer struktur beeinander hast. dann brauchst du nur lineId als index zu verwenden,
      gesamtArray[lineId] = new Array();

      Das hatte ich als Lösung favorisiert, falls mein bisheriger Ansatz im IE definitiv nicht funktioniert.

      oder, wenn du wirklich für jedes eine eigenständige variable haben willst, nutze aus, dass alle variablen im globalen scope nicht nur über varname ansprechbar sind, sondern auch über window["varname"].
      würde dann also bedeuten, neue arrays anlegen über
      window[lineId] = new Array(),

      Das wusste ich noch nicht, werde ich gleich versuchen. (Ein Nachteil wenn man JS nur so "learning by doing" lernt ... :-))

      mit dieser methode (und auch deinem eval) überschreibst du dir aber ggf. bereits vorhandene objekte, wenn eine gleichnamige lineId auftaucht.

      Stimmt, ich kann aber ausschließen, dass es da zu Überschneidungen kommt...

      deshalb würde ich die erste methode, ein array mit zwei dimensionen zum ablegen der daten, vorziehen.

      Da muss ich dir im Nachhinein wirklich Recht geben... Werde mein Script - sofern es mit windows['var'] jetzt läuft - dann längerfristig umschreiben. Sonst mache ich das gleich so.

      Vielen Dank für deine Hilfe!

      1. hi,

        eval ist doch hier völliger quark.

        Als völligen Quark würde ich es nicht bezeichnen, es ist halt EINE Lösung. ;-)

        nein, eval ist nie eine lösung, sondern immer nur ein notnagel.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }