2016-10-02 3 views
2

ich eine aktive Kopie eines HTML5 <template>importNode() mit der Funktion erhalten:appendChild() Streifen Inhalt aus importierten Vorlage

function getTemplate() { 
    var t = document.getElementById("example"); 
    return document.importNode(t.content,true); 
    } 

Danach fülle ich die dynamischen Daten,

var t = fillTemplate({ 
    id:"test", 
    text:"Enter test data" 
    }); 

und schließlich, ich fügen Sie den Knoten in den Zielbehälter:

var c = document.getElementById("container"); 
    var result = c.appendChild(t); 

Mein Problem: Der Knoten result hat seinen gesamten Inhalt: Ich kann nicht auf die Komponentenelemente der Vorlage im Ergebnisknoten zugreifen. Tatsächlich enthält der Knoten result keine untergeordneten Knoten, nachdem die Operation appendChild ausgeführt wurde.

Ich erwarte, dass der Rückgabewert von appendChild auf den Knoten zeigen sollte, der in den Container eingefügt wurde und jetzt Teil des aktiven Dokuments ist. Irgendeine Erklärung, warum das nicht der Fall ist? Hier

ist die jsfiddle (getestet in Chrome 53):

https://jsfiddle.net/rplantiko/mv2rbhym/

+0

Wenn jquery verfügbar, verwenden Sie 'Klon()' – Turtle

+2

@TurtIe ich mit dem berühmten "Vanilla JS" Framework (0 Bytes Download) :-) arbeiten kann ich bekommen, was ich brauche, um den Behälter nach der Inspektion ' appendChild' Operation. Ich möchte nur wissen, warum ich auch den Rückgabewert von appendChild nicht überprüfen kann. – rplantiko

Antwort

2

Es ist aufgrund der Tatsache, dass Sie nicht über ein Node manipulieren, sondern ein DocumentFragment.

Wenn Sie möchten, dass die Anzahl der Knoten eingefügt wird, sollten Sie den Aufruf für den übergeordneten Container ausführen (c in Ihrem Beispiel), dann erhalten Sie die richtige Antwort (5).

Aber wollen Sie nur die untergeordneten Elemente zählen, die Sie hinzugefügt, sollten Sie nicht childNodes verwenden, aber die Eigenschaft der ParentNode Schnittstelle children:

c.childNodes.length // = 5 
c.children.length // = 2 

Nach c an dem Behälter angehängt wird, die Document t hat keine Kinder mehr.

Von den MDN documentation:

Verschiedene andere Verfahren können ein Dokument Fragment als Argument nehmen (zB alle Knoten Interface-Methoden wie Node.appendChild und Node.insertBefore), wobei in diesem Fall die Kinder des Fragments sind angefügt oder eingefügt an der Stelle im DOM, wo Sie das Dokumentfragment einfügen, nicht das Fragment selbst. Das Fragment selbst existiert weiterhin (im Speicher), hat aber jetzt keine Kinder mehr.

Die DOM 3 W3C recommendation ist auch klar:

Darüber hinaus können verschiedene Operationen - wie Knoten als Kinder eines anderen Knoten Einfügen - kann Document Objekte als Argumente; Dies führt dazu, dass alle untergeordneten Knoten von DocumentFragment in die untergeordnete Liste dieses Knotens verschoben werden.

+1

Ja, 't' ist ein Dokumentfragment. Aber vor der Ausführung der Anweisung "c.appendChild (t)" hat es * Kinder - danach ist es leer, wie das "Ergebnis" der Operation. Warum ändert es sich? Es sollte eine Referenz auf ein und dasselbe Fragment sein, mit dem gleichen Inhalt wie zuvor - nicht ein leerer Dokumentfragmentknoten. – rplantiko

+0

Es ändert sich, dass ein DocumentFragment nicht als ein Knoten agiert, da es kein Knoten ist. Sie können also nicht erwarten, dass etwas von dem, was es nicht ist, das Verhalten hat. Ich habe ein Zitat aus dem Dokument und der Spezifikation hinzugefügt. – Supersharp

+0

Vielen Dank! Es ist also ein "funktioniert wie entworfener Fall". – rplantiko