Elementknoten aus anderem Frame kopieren
stephan
- javascript
Gibt es eine Möglichkeit, einen Elementknoten aus einem anderen Frame zu kopieren (document.cloneNode(Knoten, true) schlägt fehl, da die Objekte offensichtlich als Zeiger verwaltet werden und fest einem document zugeordnet sind, ich kann also zuweisen, wie ich dumm und lustig bin, der Knoten will nicht aus dem Frame heraus).
Ich beabsichtige, eine Seite in einem Frame zu laden und deren Inhalt in einen Elementknoten eines anderen Frames einzufügen. Dazu müssten alle Knoten des Body von Frame1 kopiert und an entsprechender Stelle in Frame2 angehängt werden.
Natürlich könnte man alle Knoten auslesen, deren Attribute/Kinder ebenfalls und anhand dieser Informationen in Frame2 neue Knoten erzeugen (sprich - die cloneNode-Methode neu schreiben), das würde aber aufgrund der Langsamkeit von Javascript wohl länger dauern als angemessen.
Ich wäre für Hilfe sehr dankbar.
hi,
Gibt es eine Möglichkeit, einen Elementknoten aus einem anderen Frame zu kopieren (document.cloneNode(Knoten, true) schlägt fehl, da die Objekte offensichtlich als Zeiger verwaltet werden
hast du dich vor document auch auf das entsprechende frame bezogen?
gruss,
wahsaga
natürlich - und zwar auf allen möglichen Wegen. Da ich an die Kinder vom body heranwill, geht das mit Frame1.document.getElementsByTagName("body")[0].firstChild (bzw. analog) oder Frame1.document.body.firstChild (wie auch immer). Die cloneNode-Methode habe ich auch aus beiden document-Objekten aufgerufen, das Ergebnis ist in Frame2 aber nicht greifbar (NS/Mozilla uncaught exception ...) IE (komisches Argument oder so ähnlich). Das Ergebnis ist im IE von Typ: "#document-fragment" (noch nie gesehen) und im NS eine Null-Pointer-Exception (schon öfter gesehen ;)). Im Frame1 war's aber ein Textknoten :( Im Opera funktioniert's natürlich auch nicht, aber der schweigt sich ja aus...
natürlich - und zwar auf allen möglichen Wegen. Da ich an die Kinder vom body heranwill, geht das mit Frame1.document.getElementsByTagName("body")[0].firstChild
Mag sein, dass ich mich vertue. Aber wenn du das body-Objekt kopieren willst, warum beziehst du dich dann nur auf den 1. Kindknoten? Der enthält meinem Verständnis nach nömlich nicht alles, was body enthält.
Frame1.document.getElementsByTagName("body")[0].cloneNode(true) scheint mir sinniger.
Grüsse,
Christian
Hallo Stephan.
Gibt es eine Möglichkeit, einen Elementknoten aus einem anderen Frame zu kopieren (document.cloneNode(Knoten, true) schlägt fehl, da die Objekte offensichtlich als Zeiger verwaltet werden und fest einem document zugeordnet sind, ich kann also zuweisen, wie ich dumm und lustig bin, der Knoten will nicht aus dem Frame heraus).
1. laut SelfHTML wird die Funktion cloneNode mit zuKopierenderKnoten.cloneNode( Unterelemente_kopieren ) aufgerufen. Ich weiß nicht, ob die von dir gebrauchte Syntax auch gültig ist / von den Browsern akzeptiert wird, aber ich würde es erstmal so probieren. (http://selfhtml.teamone.dejavascript/objekte/node.htm#clone_node)
2. Müsstest du wie aus 1. folgt den zu kopierenden Knoten ansprechen. Also in Deinem Fall auf das _body_-Element des 1. Frames zugreifen, cloneNode auf es anwenden und die Rückgabe in die Elementstruktur des 2. Frames einhängen.
Dazu musst du auf die beiden Frames zugreiffen. Dazu kannst du entweder mit parent arbeiten oder mit top, je nachdem, welcher Weg bei dir kürzer ist (mag auch noch direktere Wege geben, fallen mir aber grad nicht ein). Zu beidem kannst du dich ebenfalls in Selfhtml schlau machen.
Grüsse,
Christian
Slash vergessen. http://selfhtml.teamone.de/javascript/objekte/node.htm#clone_node
Grüsse,
Christian
Hallo,
Gibt es eine Möglichkeit, einen Elementknoten aus einem anderen Frame zu kopieren (document.cloneNode(Knoten, true) schlägt fehl,
Im IE schlaegt das fehl, unter Mozilla dagegen nicht. Im IE hilft aber outerHTML. Hier mal ein Testcase (funktioniert mit Mozilla 1.x, Opera 7.x, IE 5.5, 6.0):
[frameset_a_b.htm]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>Test by TM 01/04</title>
</head>
<frameset cols="200,*">
<frame src="fra.htm" name="fra">
<frame src="frb.htm" name="frb">
<noframes>
<body>
<p>Mach was draus ...</p>
</body>
</noframes>
</frameset>
</html>
------------------------------------------------------------------------------------------------------------
[fra.htm]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Test by TM 01/04</title>
<script language="JavaScript" type="text/javascript">
<!--
function cloneYourLover()
{
var obj,clone;
obj=document.getElementsByTagName("p").item(0);
clone=obj.cloneNode(true);
if(parent.frames["frb"].document.body.outerHTML)
parent.frames["frb"].document.body.insertAdjacentHTML("beforeEnd",obj.outerHTML);
else parent.frames["frb"].document.body.appendChild(clone);
}
//-->
</script>
</head>
<body>
<form action="">
<input type="button" value="Clone your lover" onclick="cloneYourLover()">
</form>
<p>Lover</p>
</body>
</html>
------------------------------------------------------------------------------------------------------------
[frb.htm]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Test by TM 01/04</title>
</head>
<body>
<p>Your cloned ...</p>
</body>
</html>
MfG, Thomas
Verzeihung - alles zurück!
Ich habe mich selbst disqualifiziert!
Vielen Dank an Christian - genau da liegt der Hase im Pfeffer.
Voller Arroganz war ich der Meinung, noch im Kopf zu haben, dass die cloneNode-Methode am document-Objekt hing. Das tut sie natürlich nicht, jeder Elementknoten hat seine eigene, und die hat auch nur ein Argument (nämlich einen boolean, ob die Kinder mitgeklont werden sollen oder nicht). Ich glaube, ich lese in Zukunft dochh noch mal nach, auch wenn ich mir ganz sicher bin (peinlich).
Geklonte Knoten hängen dann quasi in der Luft und können bewegt werden, wohin auch immer (so soll es ja auch sein ;)).
An alle nochmal herzlichen Dank!
P.S.: das ...firstChild war nur ein Beispiel für eins der Kinder (eben mal das erste), den body an sich zu klonen macht für meinen Anwendungsfall keinen Sinn