document.getElementsByTagName("td")[n] liefert leeres Element
Yadgar
- javascript
0 Axel Richter0 Yadgar0 Axel Richter
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
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
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
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
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
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: € 1.200,- + MWSt. (Zur Zeit insgesamt 1392 €)<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
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
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
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
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
Hallo,
Bis bald im Khyberspace!
YadgarAch 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
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
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
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
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