DOM und InternetExplorer 5.0
Hans
- css
Hallo !
So, jetzt habe ich mich mal im Archiv umgeguckt und mir schön dynamische Tabellen gebaut. Funktioniert wunderbar im IE6.0. Beim IE5.0 hat er schon mal bei verschiedenen Array-Funktionen gemeckert und die habe ich dann durch selbstgeschriebene Funktionen ersetzt.
Nun gibt es aber folgendes Problem:
Wenn ich eine Tabelle löschen will, mittels:
while (document.getElementById("Tabelle1").childNodes.length > 0) {
document.getElementById("Tabelle1").removeChild(document.getElementById("Tabelle1").firstChild);
}
Dann gibt es, sobald die letzte Tabellenzeile, also das letzte Child, gelöscht ist, eine Exception und der IE5.0 stürzt ab. Folgendes sollte ich noch dazu sagen: Die letzte Tabellenzeile ist unsichtbar. Mache ich sie sichtbar und in der while-Schleife ein
alert("Hallo");
Dann überlebt der IE5.0 das Löschen und die Tabelle wird danach wieder richtig aufgebaut. Ohne alert hilft auch das sichtbar-machen der letzten Spalte nichts.
Hat der IE5.0 generell ein Problem mit dem DOM oder bin ich nur zu dom, äh, dumm? ;-)
Gruß
Hans
Wenn ich eine Tabelle löschen will, mittels:
while (document.getElementById("Tabelle1").childNodes.length > 0) {
document.getElementById("Tabelle1").removeChild(document.getElementById("Tabelle1").firstChild);
}
wieso nicht so:
var table = document.getElementById("Tabelle1");
table.parentNode.removeChild(table);
Struppi.
Hi Struppi,
var table = document.getElementById("Tabelle1");
table.parentNode.removeChild(table);
Hm, da kommt bei mir immer eine Fehlermeldung "Object required". Liegt vielleicht daran, das zum Zeitpunkt des Aufrufens die Tabelle so aussieht:
<TABLE CELLSPACING=3 width=auto>
<TBODY ID="Tabelle1">
</TBODY>
</TABLE>
Und der Inhalt wird erst später hinzugefügt. Das Child-für-Child-Löschen habe ich gemacht, weil ich dann nicht erst überprüfen muß, ob die Tabelle gefüllt ist, da ja die while-Schleife nur solange durchlaufen wird, wie Children in der Tabelle sind.
Hast Du noch eine Idee?
Gruß
Hans
Hi Struppi,
var table = document.getElementById("Tabelle1");
table.parentNode.removeChild(table);Hm, da kommt bei mir immer eine Fehlermeldung "Object required". Liegt vielleicht daran, das zum Zeitpunkt des Aufrufens die Tabelle so aussieht:
Baue einen Test ein:
var table = document.getElementById("Tabelle1");
if(!table) return alert('Tabelle1 existiert nicht');
Du rufst diese Funktion nach dem die Seite geladen wurde auf, oder?
<TABLE CELLSPACING=3 width=auto>
<TBODY ID="Tabelle1">
</TBODY>
</TABLE>
wieso gibst du nicht der Tabelle die ID?
Struppi.
Hi Struppi,
Baue einen Test ein:
var table = document.getElementById("Tabelle1");
if(!table) return alert('Tabelle1 existiert nicht');
OK, und dann passierte, was ich vermutet hatte: Die Tabelle wird gelöscht. Ich wollte es aber so haben, dass nur noch quasi
<TABLE>
<TBODY>
</TBODY>
</TABLE>
übrig bleibt und ich wieder Zeile für Zeile hinzufügen kann. Die Idee dahinter: Je nachdem, welchen Button der User drückt, erscheint in der Tabelle ein anderer Inhalt.
Du rufst diese Funktion nach dem die Seite geladen wurde auf, oder?
Ja. Da ich die while-Schleife habe, war es ja egal. Die macht nur was, wenn die Tabelle mind. eine Zeile hat.
<TABLE CELLSPACING=3 width=auto>
<TBODY ID="Tabelle1">
</TBODY>
</TABLE>wieso gibst du nicht der Tabelle die ID?
Als ich der Tabelle die ID gab, hat es nicht funktioniert. Laut Forum (oder irgendwo im Internet) habe ich gelesen, daß das dynamische hinzufügen im IE nur dann funktioniert, wenn ein TBODY-Tag vorhanden ist. Als ich dem die ID gab, hat es funktioniert.
Gruß
Hans
Hi Struppi,
Baue einen Test ein:
var table = document.getElementById("Tabelle1");
if(!table) return alert('Tabelle1 existiert nicht');OK, und dann passierte, was ich vermutet hatte: Die Tabelle wird gelöscht. Ich wollte es aber so haben, dass nur noch quasi
<TABLE>
<TBODY>
</TBODY>
</TABLE>
Dann sollte sowas funktionieren:
<table id="tabelle1">
var t = document.getElementById('tabelle1');
t.remove(t.firstChild);
Wie weit der IE 5 da mit spielt ist aber dann die Frage.
Als ich der Tabelle die ID gab, hat es nicht funktioniert. Laut Forum (oder irgendwo im Internet) habe ich gelesen, daß das dynamische hinzufügen im IE nur dann funktioniert, wenn ein TBODY-Tag vorhanden ist. Als ich dem die ID gab, hat es funktioniert.
Jein, du musst zu einer dynamisch erzeugten Tabelle den tbody explizit erzeugen, in einer, die mit HTML code eingebaut wurde, ist er automatisch da
Lass dir mal innerHTML anzeigen:
var t = document.getElementById('tabelle1');
alert( t.innerHTML );
Struppi.
Hi Struppi,
Ich habe alles umgebaut, funktioniert im IE6.0 prima. Kaum auf dem IE5.0 ausprobiert, gibt es wieder diese violation-Exception. Ich weiß nicht, warum dieses Mist-Teil immer abstürzt. Ich werde es mal im Laufe des Tages Schritt für Schritt debuggen.
my_tabelle=document.getElementById("Tabelle1");
my_tabelle.removeChild(my_tabelle.firstChild);
t_body=document.createElement("TBODY");
my_tabelle.appendChild(t_body);
tr_element=document.createElement("TR");
...
my_tabelle.firstChild.appendChild(tr_element); (TR-Element soll ja hinter TBODY kommen)
Tut wunderbar im IE6.0, im IE5.0 nicht :-((
Naja, wenigstens habe ich jetzt wieder etwas mehr über DOM gelernt :-)
Gruß
Hans
my_tabelle=document.getElementById("Tabelle1");
my_tabelle.removeChild(my_tabelle.firstChild);
t_body=document.createElement("TBODY");
Das sollte nicht mehr nötig sein
my_tabelle.appendChild(t_body);
tr_element=document.createElement("TR");
...
my_tabelle.firstChild.appendChild(tr_element); (TR-Element soll ja hinter TBODY kommen)
füge es einfach mal in die Tabelle ein.
wie gesagt, soweit ich weiß, musst du tbody nur einfügen, in einer komplett dynamischen Tabelle.
Struppi.
hi,
t_body=document.createElement("TBODY");
my_tabelle.firstChild.appendChild(tr_element); (TR-Element soll ja hinter TBODY kommen)
Hantiere nicht so viel mit firstChild und ähnlichen "relativen Zeigern" herum, das verkompliziert die Sache doch nur.
In t_body hast du die Referenz auf deinen TBODY, den du dir gerade erzeugt hast. Diese ist auch "noch da", nachdem du diesen TBODY in die Tabelle gehängt hast.
Wenn du diesem jetzt eine neu generierte Tabellenzeile anhängen willst, kannst du das ebensogut, oder vielleicht sogar besser (weil du nicht durcheinander kommst), über
t_body.appendChild(...)
machen.
Außerdem spricht eigentlich nichts dagegen, beim Arbeiten mit Tabellen(körpern) die Methoden deleteRow/insertRow zu nutzen - damit hast du createElement/appendChild gleich in einem.
gruß,
wahsaga
hi,
Du rufst diese Funktion nach dem die Seite geladen wurde auf, oder?
Ja. Da ich die while-Schleife habe, war es ja egal. Die macht nur was, wenn die Tabelle mind. eine Zeile hat.
Nein, nicht egal.
Sie versucht auf eine Eigenschaft eines per document.getElementById ermittelten Elements zuzugreifen.
Konnte aber gar kein Element ermittelt werden, ist auch nichts vorhanden, auf dessen Eigenschaft zugegriffen werden kann - und das gibt einen Fehler.
gruß,
wahsaga