Yadgar: document.getElementsByTagName("td")[n] liefert leeres Element

High!

Ich bin gerade dabei, ein Skript zur Generierung hierarchischer numerischer Gliederungen (also 1., 1.1, 1.2 usw.) in einer Tabelle zu programmieren.

Obwohl das HTML-Dokument ordnungsgemäße <td>-Tags enthält, liefert knoten = document.getElementsByTagName("td")[n] (beginnend mit n=0) immer nur die Fehlermeldung "knoten has no properties"!

Was mache ich falsch?

Bis bald im Khyberspace!

Yadgar

  1. Hallo,

    Obwohl das HTML-Dokument ordnungsgemäße <td>-Tags enthält, liefert knoten = document.getElementsByTagName("td")[n] (beginnend mit n=0) immer nur die Fehlermeldung "knoten has no properties"!

    Die Funktion heißt get _Elements_ by TagName. Das bedeutet, die TD-Elemente müssen vorhanden sein. Die <td>-Tags alleine nutzen hier nichts. Die Elemente sind frühestens sicher vorhanden, nachdem der Eventhandler onload aktiv geworden ist.

    Wann rufst Du also

    knoten = document.getElementsByTagName("td")[n]

    auf?

    viele Grüße

    Axel

    1. Wann rufst Du also

      knoten = document.getElementsByTagName("td")[n]

      auf?

      Das ganze JS-Skript wird erst am Ende des HTML-Skriptes aufgerufen!

      Bis bald im Khyberspace!

      Yadgar

      1. Hallo,

        Das ganze JS-Skript wird erst am Ende des HTML-Skriptes aufgerufen!

        Die Elemente sind frühestens sicher vorhanden, nachdem der Eventhandler onload aktiv geworden ist. Gerade eine Tabelle braucht eventuell, je nach Komplexität, längere Zeit, bis sie gerendert ist. Packe also das JavaScript in eine Funktion und rufe diese per:

        <body onload="DeineFunktion();">

        auf.

        viele Grüße

        Axel

        1. Hi,

          Die Elemente sind frühestens sicher vorhanden, nachdem der Eventhandler onload aktiv geworden ist.

          Das ist zwar korrekt, aber IMHO nur für den IE 4 von Relevanz.

          In der Praxis ist der Knoten bereits ansprechbar, wenn das <script ...> direkt hinter dem <td> steht. Und da man ohnehin abfragt, ob das, was man machen möchte, auch wirklich geht, hindert einen in der Praxis nichts dran. ;-)

          Mit jedem weiteren TD wird nur die Collection größer.

          Aber solange hier kein Code gepostet wird, ist alles Geschwätz eh sinnlos - schade um die Zeit ...

          Und tschüß, Cybaer

          --
          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
          1. High!

            Aber solange hier kein Code gepostet wird, ist alles Geschwätz eh sinnlos - schade um die Zeit ...

            So, hier ist der Code (Javascript):

            // Nummerierte Gliederung in Tabelle

            function gliederung()
            {
              var i=1;
              var n=0;
              do
              {
                var knoten = document.getElementsByTagName("td")[n];
                sub = knoten.firstChild;
                if (sub.nodeName == "P")
                {
                  alert("Sub gefunden!");
                  alert(sub.firstChild);
                  var num = document.createTextNode(i.toString() + ". ");
                  sub.insertBefore(num, sub.firstChild);
                  i++;
                  sub = sub.nextSibling; // <div>-Tag in <td>
                  if (sub)
                  {
                    var j = 1;
                    subsub = sub.getElementsByTagName("p")[0];
                    while (subsub != null)
                    {
                      var subnum = document.createTextNode((i-1).toString() + "." + j.toString() + " ");
                      if (subsub.nodeName == "P")
                      {
                        subsub.insertBefore(subnum, subsub.firstChild);
                        j++;
                      }
                      subsub = subsub.nextSibling;
                    }
                  }
                }
                n++;
              }
              while (knoten);
            }

            ...und hier das zugehörige HTML-Skript:

            <html>
            <head>
              <link rel="stylesheet" href="format.css" type="text/css"></link>
              <script src="nummerierung2.js" type="text/javascript"></script>
              <body bgcolor="#e7c3a4" onLoad="gliederung();">
            </head>
            <body>
            <h3>Kurs LF5</h3>
            <h3>Weiterbildung zur Bürokraft für Personalcomputer- und Multimedia-Bedienung</h3>
            <p>Vollzeitschulung, montags bis freitags 9.00 Uhr bis 16.00 Uhr. Ausgenommen Feiertage und Schulferien.</p>
            <p>
            Beginn: Jeden 1. Arbeitstag eines Monats, oder nach Vereinbarung<br>
            Kursdauer: 6 Wochen<br>
            Kursgebühr: &euro; 1.200,- + MWSt. (Zur Zeit insgesamt 1392 &euro;)<br>
            Vorkenntnisse: Abitur, mittlere Reife, Handelsschule, Büro-Berufsausbildung oder 3 Jahre Berufserfahrung
            </p>
            <table>
              <tr>
                <th>Kursinhalte:</th>
                <th>Dauer:</th>
              </tr>
              <tr>
                <td>
                  <p>Der Personalcomputer im Büroalltag</p>
                  <div>
                    <p>Bestandteile des modernen Personalcomputersystems</p>
                    <p>Das Betriebssystem (XP, 2000)</p>
                    <p>MS WINDOWS-Benutzung</p>
                    <p>Computertechnik: PC Schnittstellen, Zubehör</p>
                    <p>Bestandteile von MS Office</p>
                  </div>
                </td>
                <td>
                  2 Tage
                </td>
              </tr>
              <tr>
                <td>
                  <p>2. Sekretariatsprogramm MS Outlook benutzen</p>
                </td>
                <td>
                  <p>2 Tage</p>
                </td>
              </tr>
              <tr>
                <td>
                  <p>MS-Office Word</p>
                  <div>
                    <p>Textverarbeitung mit WORD für WINDOWS. Einzel- und umfangreiche Dokumente,
                       Serienbriefe.Neue Deutsche Rechtschreibung benutzen</p>
                    <p>Tabellen bearbeiten mit WORD</p>
                    <p>Einführung in Desktop Publishing mit WORD. WEB-Sites erstellen. Anzeige des HTML-            Quellcodes</p>
                  </div>
                </td>
                <td>
                  5 Tage
                </td>
              </tr>
              <tr>
                <td>
                  <p>PC-Telekommunikation</p>
                  <div>
                    <p>Einführung in die Telekommunikation: Begriffe, theoretische Grundlagen</p>
                    <p>Anwendungen: Anrufbeantworter, Fax, E-Mail, Dateienübertragung etc.</p>
                  </div>
                </td>
                <td>
                  2 Tage
                </td>
              </tr>
              <tr>
                <td>
                  <p>Multimedia Einführung: Hardware, Software, Installation, Benutzung</p>                </td>
                <td>
                  2 Tage
                </td>
              </tr>
              <tr>
                <td>
                  <p>Internet, WWW, Suchmaschinen</p>
                </td>
                <td>
                  1 Tag
                </td>
              </tr>
              <tr>
                <td>
                  <p>Kurze Einführung in Netzwerk-Betriebssysteme: Aufbau. Arbeitsweise: Server,                Clients</p>
                </td>
                <td>
                  2 Tage
                </td>
              </tr>
              <tr>
                <td>
                  <p>Einführung in die Tabellenkalkulation mit EXCEL</p>
                </td>
                <td>
                  4 Tage
                </td>
              </tr>
              <tr>
                <td>
                  <p>Präsentationssoftware: PowerPoint</p>
                </td>
                <td>
                  3 Tage
                </td>
              </tr>
              <tr>
                <td>
                  <p>Kaufmännisches PC Büropaket KHK: Auftragsbearbeitung, Bestellwesen, Kasse,                 Einnahmen-Überschussrechnung</p>
                </td>
                <td>
                  7 Tage
                </td>
              </tr>
            </table>

            <div style="height:80px"></div>
            <p class="n">
            <b>Allgemeine Informationen:</b>
            </p>
            <p class="n">
            <b>Lernmethode:</b> Interaktives Lernen und Training mit dem PC unter individueller Fachbetreuung. "Learning by Doing"
            </p>
            <p class="n">
            <b>Lernmittel:</b> Computer, Lernsoftware und Fachliteratur können benutzt werden. Die Lernmittel können auf Wunsch käuflich erworben werden.
            </p>
            <p class="n">
            <b>Kursgebühr:</b> Die Kursgebühr deckt die Schulung am Personalcomputer sowie die Hardware- und Softwarebenutzung.<br>
            Zahlbar mit der schriftlichen Anmeldung (in der Regel 30 Tage vor Kursbeginn) per Überweisung auf das Konto:
            </p>
            <div style="text-indent:100px; font-family:'Arial'"><b>Stadtsparkasse Köln, Konto Dr. Kasper Nr. 3572 3725, BLZ 37050198</b></div>
            <p class="n">
            Bei Fremdzahlung (z. B. Firma, Arbeitsamt) schriftliche Bestätigung erforderlich. Ratenzahlung kann vereinbart werden.<br>
            Im längeren Krankheitsfall mit ärztlicher Bescheinigung kann ein neuer Termin vereinbart werden.<br>
            Beim Nichterscheinen bzw. Fehlen kann keine Kursgebühr erstattet werden.
            </p>
            <p class="n">
            <b>Prüfungen:</b> Laufend während der Ausbildung
            </p>
            <p class="n">
            <b>Abschluss:</b> Zertifikat mit genauen Lerninhalten
            </p>
            </body>
            </html>

            Bis bald im Khyberspace!

            Yadgar

            1. Hi,

              So, hier ist der Code (Javascript):

              Relevanter Auszug?!

              <head>
                <link rel="stylesheet" href="format.css" type="text/css"></link>
                <script src="nummerierung2.js" type="text/javascript"></script>

              Hier wird auf jeden Fall JS eingebunden, bevor überhaupt was an Tabelle vorhanden ist. Ist das die Einbindung deines JS (was dann im Widerspruch zu deiner Aussage stünde)?

              Gruß, Cybaer

              --
              Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
              1. High!

                Hier wird auf jeden Fall JS eingebunden, bevor überhaupt was an Tabelle vorhanden ist. Ist das die Einbindung deines JS (was dann im Widerspruch zu deiner Aussage stünde)?

                Wenn du etwas weiter gelesen hättest, dann hättest du gesehen, dass das JS als Funktion von einem onLoad-Handler in <body> aufgerufen wird - wie es mir Axel geraten hatte!

                Bis bald im Khyberspace!

                Yadgar

                1. Hi,

                  Wenn du etwas weiter gelesen hättest, dann hättest du gesehen, dass das JS als Funktion von einem onLoad-Handler in <body> aufgerufen wird - wie es mir Axel geraten hatte!

                  Wenn Du nicht den kompletten Code ins Forum gerotzt hättest, wäre mir das auch sicher aufgefallen.

                  Gruß, Cybaer

                  --
                  Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                2. Hi,

                  Bis bald im Khyberspace!
                  Yadgar

                  Ach Moment, jett weiß ich wieder, woher mir der Name bekannt vorkam. Unser "Turbokapitalist". =:-)

                  Damit sind weitere Analysen & Antworten allerdings per se hinfällig ...

                  ... und wohl auch von anderen Usern kaum zu erwarten. Aber wenn Axel so nett ist ...

                  EOT, Cybaer

                  --
                  Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                  1. Hallo,

                    Bis bald im Khyberspace!
                    Yadgar

                    Ach Moment, jett weiß ich wieder, woher mir der Name bekannt vorkam. Unser "Turbokapitalist". =:-)

                    Huch! Habe ich das was verpasst?
                    ...
                    mal suchen
                    ...
                    Naja, da gab/gibt es hier aber schon _weitaus_ schlimmere Absahner und merkbefreitere Fragesteller. Er ist halt offensichtlich jemand, der sich die Programmierung autodidaktisch learning by doing aneignet. Das Ganze in einem Praktikum, wo scheinbar auch noch was sinnvolles als Ergebnis von ihm erwartet wird.

                    viele Grüße

                    Axel

            2. Hallo,

              function gliederung()
              {
                var i=1;
                var n=0;
                do
                {
                  var knoten = document.getElementsByTagName("td")[n];

              ...

              n++;
                }
                while (knoten);
              }

              Sagtest Du nicht, der Fehler käme bereits bei n==0 zustande?

              Das läuft _natürlich_ gegen den Baum, sobald n == document.getElementsByTagName("td").length ist.

              Warum durchläufst Du nicht die TD-Elemente mit for?

              var alleTDs = document.getElementsByTagName("td");
              var knoten = null;
              for (var n=0; n<alleTDs.length; n++) {
                knoten = document.getElementsByTagName("td")[n];
              ...
              }

              viele Grüße

              Axel

              1. Hallo,

                Warum durchläufst Du nicht die TD-Elemente mit for?

                var alleTDs = document.getElementsByTagName("td");
                var knoten = null;
                for (var n=0; n<alleTDs.length; n++) {
                  //knoten = document.getElementsByTagName("td")[n];

                //         ^Das ist natürlich Unsinn, weil in alleTDs bereits vorhanden.
                     knoten = alleTDs[n];

                ...
                }

                viele Grüße

                Axel

        2. Komplexität, längere Zeit, bis sie gerendert ist. Packe also das JavaScript in eine Funktion und rufe diese per:

          <body onload="DeineFunktion();">

          Funktioniert auch nicht... die Fehlermeldung bezieht sich übrigens (das hatte ich vorhin nicht ganz richtig dargestellt), nicht auf knoten = document.getElementsByTagName("td")[n], sondern auf die folgende Zeile  sub = knoten.firstChild() - "knoten has no properties"!

          Bis bald im Khyberspace!

          Yadgar

          1. Hallo,

            <body onload="DeineFunktion();">

            Funktioniert auch nicht...

            Dann zeigen! Am Besten mit einem Link zu einem online-Beispiel. Am Zweitbesten mit etwas relevantem Quelltext, also der Schleife für knoten = document.getElementsByTagName("td")[n] und dem HTML-Tabellenkonstrukt.

            viele Grüße

            Axel