Sebastian Becker: Text von td-Elementen auslesen

Hallo,

folgendes akademische Problem:

Ich möchte - angeregt durch den thread "Werden <td>-Tags von JS durchnummeriert???" [Linkhttp://forum.de.selfhtml.org/index.shtml?m=118684&t=21259]), dessen Codevorschlag ich testen wollte - die Inhalte aller Tabellenzellen einer Seite auslesen.

Merkwürdigerweise werden mit nachfolgendem Skript zwar alle td-Elemente durchlaufen, teilweise werden die Inhalte aber doppelt ausgelesen, d.h. mehreren td-Elementen zugeordnet. Wo liegt der Fehler?

Danke, Grüße,

Sebastian

Erst am Seitenende oder mit onLoad einbinden ...
-----------------------------------------------------------------
<script>
alerttext = "";

for(i=0;i<document.getElementsByTagName("table").length;i++)
{
for(j=0;j<document.getElementsByTagName("table")[i].getElementsByTagName("tr").length;j++)
{
for(k=0;k<document.getElementsByTagName("table")[i].getElementsByTagName("tr")[j].getElementsByTagName("td").length;k++)
{
alerttext += i + ":" + j + ":" +  k + ": ";
alerttext += document.getElementsByTagName("table")[i].getElementsByTagName("tr")[j].getElementsByTagName("td")[k].innerText + "--";
}
}
}
alert(alerttext);
</script>

  1. Hi,

    Merkwürdigerweise werden mit nachfolgendem Skript zwar alle td-Elemente durchlaufen, teilweise werden die Inhalte aber doppelt ausgelesen, d.h. mehreren td-Elementen zugeordnet. Wo liegt der Fehler?

    Ich kann das Problem leider nicht nachvollziehen - unter IE 5.5 wird bei mir mit folgendem Komplett-Code jede der vier Zellen exakt einmal ausgelesen:

    <html>
    <head>
    <title>Test</title>
    </head>
    <body>
    <table>
    <tr><td>Zeile 1, Zelle 1</td><td>Zeile 1, Zelle 2</td></tr>
    <tr><td>Zeile 2, Zelle 1</td><td>Zeile 2, Zelle 2</td></tr>
    </table>
    <script>
    alerttext = "";

    for(i=0;i<document.getElementsByTagName("table").length;i++)
    {
    for(j=0;j<document.getElementsByTagName("table")[i].getElementsByTagName("tr").length;j++)
    {
    for(k=0;k<document.getElementsByTagName("table")[i].getElementsByTagName("tr")[j].getElementsByTagName("td").length;k++)
    {
    alerttext += i + ":" + j + ":" +  k + ": ";
    alerttext += document.getElementsByTagName("table")[i].getElementsByTagName("tr")[j].getElementsByTagName("td")[k].innerText + "--";
    }
    }
    }
    alert(alerttext);
    </script>
    </body>
    </html>

    Grüße,

    Utz

    1. Hi,

      Ich kann das Problem leider nicht nachvollziehen - unter IE 5.5 wird bei mir mit folgendem Komplett-Code jede der vier Zellen exakt einmal ausgelesen

      das kann schon sein und so soll es ja auch sein. Aber versuch es mal mit einem sehr komplexen Quellcode ...

      Grüße,

      Sebastian

      1. Hi,

        das kann schon sein und so soll es ja auch sein. Aber versuch es mal mit einem sehr komplexen Quellcode ...

        Du meinst verm. mit verschachtelten Tabellen, oder? Da kann ich mir unerwünschte Ergebnisse vorstellen. Ein Tipp: es ist nicht notwendig, zuerst alle <table> zu suchen und durchzuiterieren, dann alle darin befindlichen <tr> durchzuiterieren, und schließlich alle darin befindlichen <td> durchiterieren...es reicht völlig aus, direkt getElementsByTagName("td") zu nehmen und durchzuitererieren, damit sind Doppelanzeigen durch Verschachtelungen praktisch ausgeschlossen.

        Grüße,

        Utz

        1. Hi,

          Du meinst verm. mit verschachtelten Tabellen, oder?

          Genau

          Da kann ich mir unerwünschte Ergebnisse vorstellen.

          Was aber ja eigentlich nicht sein dürfte.

          Ein Tipp: es ist nicht notwendig, zuerst alle <table> zu suchen und durchzuiterieren, dann alle darin befindlichen <tr> durchzuiterieren, und schließlich alle darin befindlichen <td> durchiterieren...es reicht völlig aus, direkt getElementsByTagName("td") zu nehmen und durchzuitererieren, damit sind Doppelanzeigen durch Verschachtelungen praktisch ausgeschlossen.

          Für das bislang erwünschte Ziel, nämlich alle td's auszugeben, ist es sicherlich nicht notwendig. Ich werd' Deinen Vorschlag mal ausprobieren. Danke!

          In dem erwähnten thread wurde übrigens folgender Code gepostet:

          alert(document.getElementsByTagName("table")[0].document.getElementsByTagName("td")[3].firstChild.nodeValue);

          Abgesehen davon, daß m.E. ein "document." zu viel ist, kann es ja auch mit "firstChild.nodeValue" eigentlich nicht funktionieren - oder irre ich mich?

          Grüße,

          Sebastian

          1. Hi,

            (...) kann es ja auch mit "firstChild.nodeValue" eigentlich nicht funktionieren - oder irre ich mich?

            Doch - Text selber gilt als Knoten, ohne das firstChild würdest Du den Attributwert des Elementes ansprechen, vgl. http://selfhtml.teamone.de/javascript/objekte/node.htm#node_value.

            Grüße,

            Utz