Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Problem mit Javascript: appendChild ()





Frage

Hallo DOM-Experten! ich bin da auf das Problem gestoßen, dass die Funktion appendChild () unter bestimmten Umständen nicht funktioniert (IE): im Beispielprogramm: http://www.abschweb.de/test/klon.htm funktioniert nur die erste Übergabe, die zweite nicht. Ist das irgendwie lösbar? (klar, ich kann den iFrame komplett analysieren, einen String mit HTML-Code generieren, diesen dann wieder aufarbeiten und dann mit createElement () in der Hauptdatei den Baum ganz neu aufbauen. Aber das fände ich nicht gerade elegant). Der Firefox hängt sich nicht auf, erreicht mit firstChild aber nur einen Textknoten statt des erwarteten <p>. Danke, Manfred

Antwort 1 von abschweb

Hallo Leute,

was mache ich falsch? Das ist jetzt mindestens das dritte Mal, dass ich auf eine Anfrage in diesem Forum keine Antwort kriege. Bin ich im falschen Forum?
Oder sind meine Probleme zu brutal? Oder zu abwegig?

Bitte wenigstens darauf eine Antwort!
Danke,
Manfred

Antwort 2 von rfb

setz doch mal hier den Code rein - ich möchte den nicht erst auf deiner Seite suchen.

Antwort 3 von abschweb

@rfb

hier ist der Code:
die Hauptdatei:


<HTML>
<HEAD><TITLE>Klon-Test</TITLE>


<script language="javascript" type="text/javascript">

function test ()
{
with (document)
    {
    var Klon1 = getElementById (´auch_draussen´).firstChild.cloneNode (true);
    alert (´Das 1. Kind von auch_draussen ist ein ´ + Klon1.nodeName);
    getElementById (´draussen´).appendChild (Klon1);
    alert (´Klon1: geglückt!´);

    var Klon2 = iFrame.document.getElementById (´drin´).firstChild.cloneNode (true);
    alert (´Das 1. Kind von drin ist ein ´ + Klon2.nodeName);
    getElementById (´draussen´).appendChild (Klon2);
    alert (´Klon2: geglückt!´);
    }
}

</script>


</HEAD>




<BODY onLoad="test ()">

<div id="draussen">
</div>


<iframe name="iFrame" width=100% src="iframe.htm">
</iframe>



<div id="auch_draussen">
<p>
Das soll nach <b>vorne</b> kommen!
</p>
</div>

</BODY>
</HTML>


für den iframe:


<HTML>
<HEAD>
</HEAD>

<BODY>
<div id="drin">
<p>
das soll nach <i>draussen</i> kommen!
</p>
</div>
</BODY>
</HTML>


Antwort 4 von abschweb

Meine Überlegungen dazu:
Das Problem liegt wahrscheinlich in cloneNode ().
Nach meinem Verständnis dieser Funktion müsste ein Objekt herauskommen, das frei verschiebbar ist und zwar dem Ursprungsobjekt gleicht, aber keine Verbindung mehr zu diesem hat (ich habe mich davon überzeugt, dass eine nachträgliche Änderung des geklonten Objekts keinen Einfluss auf den Klon hat).
cloneNode () müsste also ein Objekt erzeugen, das sich von einem mit createElement () und appendChild () zu Fuß mit den richtigen Werten erzeugten Bäumchen nicht unterscheidet. Offenbar verbergen sich jedoch im Klon Referenzen auf das Ursprungsobjekt - deren Sinn ich nicht verstehe - und die genau dann Schaden abrichten, wenn beide Objekte unterschiedlichen Dateien angehören.

Antwort 5 von abschweb

Meine neue Theorie: Der IE legt mit cloneNode () oder createElement () erzeugte Objekte genau in dem Speicherraum ab, in dem sich auch die schon sichtbaren Objekte befinden. Sie sind nur noch nicht in den Baum eingehängt. Das hat den Effekt, dass die Funktion appendChild () nur noch das Objekt mit dem Baum verbinden muss und keine Daten verschieben.
Und den unangenehmen Nebeneffekt, dass das nicht rahmenübergreifend funktioniert.

Antwort 6 von abschweb

@rfb:
hat es dir die Sprache verschlagen?

Antwort 7 von vasquez

dein script steht im head , die nodes auf die du in dem script zugreifst , stehen aber im body ,
also danach ... da du das script nicht erst ausführen lässt als die seite geladen ist (also die gesamte structur des documents erstellt ist ) sondern das script bereits zur ausführung kommt bevor das gesamte document geparst wurde , greifen die functionen getElementById(....) etc in die luft

eine möglichkeit dies zu umgehen ist das du die tags
per document.body.innerHTML+="sometags";
aufbaust.
vorsicht hier da besonders viele aufrufe hintereinander von der zuweisungs function an innerHTML den browser lahmlegen können.

eine andere möglichkeit wäre dein script erst ganz am ende der seite im body abzulegen.

Antwort 8 von abschweb

@vasquez:
du liegst mit Sicherheit falsch.
Mein Skript spricht Objekte des <body> nur innerhalb der Funktion test () an. Diese wird aber erst body.onload ausgeführt, also nach dem vollständigen Laden der HTML-Datei.
Wäre es anders, würde das Script ja überhaupt nicht funktionieren. Es funktioniert jedoch - bis zu der Stelle, wo ein im iFrame geklontes Objekt in den Elementbaum der Hauptdatei eingefügt werden soll.

zu innerHTML: das ist IE-spezial-uralt, das funktioniert nur im IE und so codiere ich definitiv nicht mehr.

Gruß
Manfred

Antwort 9 von Luk

Hallo,

wer kann mir sagen warum ich seit einiger Zeit bestimmte Internet Seiten nicht mehr besuchen kann. Ich gebe den Namen ein aber es kommt keine Seite zum Vorschein, nur irgendwann der Satz: Diese Seite kann nicht angezeigt werden. Und unten links im Browser finde ich: javascript; doNetDetect (). Hat es etwas damit zu tun warum ich nicht mehr auf die verschiedensten Seiten komme?

Hoffe das ich mal auf diese Frage eine Antwort bekomme:-(

Antwort 10 von abschweb

Hallo Luk,

du bist im falschen Thread
und ich kann dir auch nicht helfen

Manfred

Antwort 11 von Luk

schade das ist ein echtes Problem!!

Antwort 12 von abschweb

@Luk
Dann mach bitte eine eigene Anfrage auf, sonst werde ich wütend und wende mich an die Admins!
Das ist meine letzte Warnung.

Manfred

Antwort 13 von vaquez

nachdem ich die frame seite selber ausprobiert habe ,
gab es erstmal was komisches :
das "with(document)"
scheint alle variablen anzusprechen , und nicht nur die auf die es abziehlt
also habe ich es ersetzt ,
dann kam ein ähnliches wie von dir geschildertes problem , der parameter für cloneChild wurde nicht akzeptiert , es ist aber nicht null , sondern mit alert (typeof(....))
wirt [object] angezeigt , wendet man innerHTML auf das element an das geklont werden soll scheint alles
da zu sein.
daraus würde ich schliessen das der element knoten der geklont werden soll aus dem gleichen document
stammen müsste , damit es functioniert ?!
hast du das schonmal mit normalen frames ausprobiert?
und wie gesagt du könntest es auch mit innerHTML
ausprobieren , functionieren tut dieser setter auch bei mozilla und netscape.
eine andere möglichkeit ware es das frame komplett
über einen XMLHTTPRequest zu laden und dann wie xml zu behandeln und einfach einsetzen , probleme ergeben sich dann aber mit script denke ich, auch wenn man es mit //<![CDATA[ .... //]]> umschliest

Antwort 14 von abschweb

@vaquez
genau, es muss aus dem geichen Dokument kommen, zu dem Schluss bin ich ja auch gekommen.
Mit normalen Frames habe ich das nicht getestet, wil mir das für meine Zwecke nichts nützen würde.
Ich habe es aufgegeben.

Gruß
Manfred

Antwort 15 von Friedel

@abschweb: Du liegst mit deiner Vermutung richtig. Du benutzt Eigenschaften und Methoden des node-Objektes. Und das ist ein Unterobjekt des document-Objektes. Sowas kann man also nicht dokumentübergreifend verwenden,

Antwort 16 von h.markert

Hallo

Habe aktuell dasselbe Problem.
Kopieren eines Tags aus einem iframe in ein anderes Dokument funktioniert nicht mit IE.
Mit dem Firefox ist dies kein Problem. Hier verschwindet das Element aus dem einen Frame und wird in dem anderen angezeigt. (Solange nicht cloneNode verwendet wird)
Ist es somit eine reine Einschränkung von IE das nicht dokumentübergreifend gearbeitet werden kann?

MfG
Holger

Antwort 17 von vasquez

folgendes stand auf msdn:

http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dom/domoverview.asp

<HTML>
<SCRIPT>
function fnBegin(){
var fr = document.all.oFrame.cloneNode();
alert(document.body.innerHTML);
}
</SCRIPT>
<BODY onload="fnBegin()">
<IFRAME id="oFrame" src="about:blank"
style="border:1px solid black; position:absolute; top:20px; left:30px;
width:350px; height:300px;"></IFRAME>
</BODY>
</HTML>

_______________

das cloneNode nicht document übergreifend functioniert , denn so wie ich das verstanden habe , wird dadurch das element direct in
die document class eingefügt.
(ich meine jetzt die art wie es in c++ realisiert wurde)
dabei gibt es für jeden typ einen speziellen container.

Das gesamte iFrames nicht copiert werden können
(auf die normale art) ,sondern über document.all
angesprochen werden müssen , legt meine vermutung nahe.
ob dem wirklich so ist , oder "diese mangel" eigenschaft des IE , tatsächlich so gewollt ist , kann ich nicht entscheiden.

da selbst bei microsoft für derartige operationen
lieber innerHTML verwendet wird, lässt sich daraus folgern das diese eigenschaft des element.appenChild(...)
wirklich so gedacht ist.

einzige möglichkeit die regeln des IE etwas zu lockern
wäre über ..zum beispiel
documentA.getElementById(strIdX).innerHTML=
documentB.getElementById(strIdY).innerHTML;

natürlich muss man nicht getElementById(...)
verwenden um das innerHTML von einem element zu verändern.es geht auch mit den document object level
functionen.....

functionert hat diese methode bisher in
netscape, mozilla und IE
andere browser habe ich noch nicht ausprobiert.

desweiteren , wie sich auf der sarissa homepage
(http://sarissa.sourceforge.net/doc/)
unter >>window.document<< nachlesen läst haben sich auch andere mit der thematik befasst , und sind zum schluss gekommen das innerHTML die bessere möglichkeit fürn IE ist.

ich hoffe mal das sich mit der neuentwicklung des IE
fürs longhorn project dann auch hierdran etwas ändert , vorallem das xml parsen (womit man dieses problem ebenfalls lösen könnte)kein ActiveX mehr benötigt ,da DCOM ziehmlich unsicher ist.

Antwort 18 von vasquez

hier ist was rausgekürtzt worden .....
???????????????????????????