tr Kopieren
bernd
- javascript
Hallo zusammen,
aus einer Tabelle möchte ich ein komplettes "tr" kopieren mit Inhalt.
Der IE 7.0 macht das anstandslos, die neuen trs werden unten angehögt.
Der FF 2.0, leider nicht, bei dem werden die trs rechts von dem Eltern(oder Ausgang) tr angeordnet.
Wie kann ich den FF dazu bringen, die neuen trs unterhalb anzuzeigen?
Meine Html Seite mit JavaScript Funktion sieht folgender Maßen aus:
<html>
<head>
<script type="text/javascript">
function tr_klonen(id)
{
var objekt, kopie;
objekt = document.getElementById( id );
if(objekt)
{
kopie=objekt.cloneNode( objekt.firstChild );
document.getElementById( id ).appendChild( kopie );
}
}
</script>
</head>
<body>
<table border="1">
<tr id="tr1" onclick="tr_klonen( 'tr1' );">
<td id="td1">nur ein test text 1</td>
<td id="td1">nur ein test text 1</td>
</tr>
<tr id="tr2" onclick="tr_klonen('tr2');">
<td id="td2">nur ein test text 2</td>
<td id="td1">nur ein test text 1</td>
</tr>
<tr id="tr3" onclick="tr_klonen( 'tr3' );">
<td id="td3">nur ein test text 3</td>
<td id="td1">nur ein test text 1</td>
</tr>
</table>
</body>
</html>
Über das "Add_ons" "View Sorurce Chart" bei FF kann ich sehen, dass die neuen trs in dem "Eltern" tr erzeugt worden sind.
Die Funktion habe ich im Netz gefunden.
Grüße
bernd
Hi,
Der IE 7.0 macht das anstandslos, die neuen trs werden unten angehögt.
Der macht halt nicht das, was Du sagst, sondern irgendwas.
<tr id="tr1" onclick="tr_klonen( 'tr1' );">
function tr_klonen(id)
{
objekt = document.getElementById( id );
objekt ist also die tr.
if(objekt)
{
kopie=objekt.cloneNode( objekt.firstChild );
Ohoh. firstChild ist gefährlich. Je nach Browser kann das auch mal ein Textknoten sein (der den whitespace zwischen den tags enthält).
document.getElementById( id ).appendChild( kopie );
document.getElementById( id ) ist ebenfalls die tr. Und in diese tr hängst Du am Ende ein Kind ein.
Wieso wunderst Du Dich dann, wenn Dein neues Element in der tr landet?
}
}
<td id="td1">nur ein test text 1</td>
<td id="td1">nur ein test text 1</td>
id-Werte müssen eindeutig sein.
cu,
Andreas
Hallo,
Der IE 7.0 macht das anstandslos, die neuen trs werden unten angehögt.
Der macht halt nicht das, was Du sagst, sondern irgendwas.
ok, wie kann ich den eigentliche "tr" "ausfiltern" und weiter verarbeiten.
<td id="td1">nur ein test text 1</td>
<td id="td1">nur ein test text 1</td>id-Werte müssen eindeutig sein.
Die Angaben in den tds sind gleich göltig, wichtig ist, dass sie nicht die gleiche ID habe wie das tr, dh. für mich im gesamten Dokument eindeutig.
<tr id="tr1" onclick="tr_klonen( 'tr1' );">
Bin bereit auf Vorschläge
grüße bernd
Hi,
ok, wie kann ich den eigentliche "tr" "ausfiltern" und weiter verarbeiten.
indem Du das richtige nimmst, daraus das richtige erzeugst und es auf richtige Weise an die richtige Stelle packst. Die Werkzeuge dafür kennst Du.
id-Werte müssen eindeutig sein.
Die Angaben in den tds sind gleich göltig,
Dann funktioniert entweder alles[1], oder Du weißt _sehr_ genau, was Du tust. In beiden Fällen würdest Du nicht fragen.
<tr id="tr1" onclick="tr_klonen( 'tr1' );">
Warum übergibst Du eigentlich nicht gleich die Tabellenzeile, sondern nur ihre ID, so dass die Zeile erst wieder umständlich gesucht werden muss?
Cheatah
[1] Wobei Deine Schlussfolgerung dann auch nur scheinbar ist.
Hallo zusammen,
danke an mbr, Dein Tipp hat funktioniert die JS Funktion sieht es folgender Maßen aus:
<script type="text/javascript">
function tr_klonen(id)
{
var objekt, kopie;
objekt = document.getElementById( id );
if(objekt)
{
kopie=objekt.cloneNode( objekt.firstChild );
objekt.parentNode.appendChild(kopie );
}
}
</script>
Funktioniert in beiden Browsern.
Das eigentliche Verfahren habe ich leider nicht auf Anhieb verstanden :-(((, wo Cheatah und mbr Recht haben.
Danke an alle Beteiligen.
Ein schönes Wochenende
grüße bernd
Hi,
Funktioniert in beiden Browsern.
Sorry, aber das ist Murks!
Das eigentliche Verfahren habe ich leider nicht auf Anhieb verstanden :-(((,
Mir scheint, jetzt immer noch nicht.
Und damit später kein Archivsuchender über das "funktioniert" stolpert, hier der (hoffentlich - untested ;)) korrekte Weg:
<!-- aktuelle TR (this) kopieren und dafür neue ID verwenden -->
<tr id="tr1" onclick="tr_klonen(this,'trNeu')">
function tr_klonen(obj,newID) {
var kopie;
// Kann der Browser das überhaupt?
if(obj.cloneNode) {
// TR mit Kindern kopieren
kopie=obj.cloneNode(true);
// Der Kopie ggf. eine neue ID geben
if(newID) {
// Entweder die uebergebene ID setzen, oder ...
kopie.id=newID;
} else if(kopie.id) {
// ... falls keine neue ID übergeben wurde nur vorhandene ID loeschen
kopie.id="";
}
// Kopie in das Elternelement einhängen
obj.parentNode.appendChild(kopie );
}
}
Gruß, Cybaer
Hallo Bernd,
abgesehen von dem, was MudGuard schon sagte, scheint es mir, dass du cloneNode falsch benutzt laut SELFHTML bekommt cloneNode als Parameter lediglich ein true - falls Unterknoten mitkopiert werden sollen, oder ein false, falls nicht. In deinem Fall muss man wohl true übergeben.
Was das Einfügen unterhalb des letzten trs angeht: Hast du mal folgendes probiert:
object.parentNode.AppendChild(kopie);
liebe Grüße mbr
P.S.: wenn hier immer mal wieder darauf hingewiesen wird, eine ID müsse eindeutig sein, dann passiert das nicht aus Korinthenka..., sondern weil es tatsächlich so vorgeschrieben ist. Eine ID muss für _den Browser_ dokumentweit eindeutig sein. Ob sie für _dich_ eindeutig ist, interessiert erstmal weniger. Wenn dann irgendwas nicht geht, suchst du evtl. stundenlang nach dem Fehler und das Gejammer ist groß, dabei wäre alles (vielleicht) so einfach gewesen: eindeutige id vergeben, und gut ist.
Hallo mbr.
Was das Einfügen unterhalb des letzten trs angeht: Hast du mal folgendes probiert:
object.parentNode.AppendChild(kopie);
>
> liebe Grüße mbr
>
> P.S.: wenn hier immer mal wieder darauf hingewiesen wird, eine ID müsse eindeutig sein, dann passiert das nicht aus Korinthenka..., […]
Wo wir gerade dabei sind: es heißt „appendChild“.
Einen schönen Freitag noch.
Gruß, Mathias
--
sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
debian/rules