2012-10-23 5 views
21

Ich habe ein Problem beim Einfügen neuer Geschwister in vorhandene Elemente.d3.js - So fügen Sie neue Geschwisterelemente ein

Ich habe diese Struktur

<svg> 
    <g> 
    <path class="data"></path> 
    <path class="data"></path> 
    </g> 
</svg> 

und wollen diese Struktur

<svg> 
    <g> 
    <path class="data"></path> 
    <text></text> 
    <path class="data"></path> 
    <text></text> 
    </g> 
</svg> 

aber wenn ich die d3.js verwenden einfügen Funktion

d3.select("g").insert("text", "path.data"); 

i folgendes erhalten (trotz der Auswahl nach Klassennamen)

<svg> 
    <g> 
    <text></text> 
    <path class="data"></path> 
    <path class="data"></path> 
    </g> 
</svg> 

irgendwelche ideen?

Antwort

27

Vor allem ist es erwähnenswert, dass das zweite Argument in der Einfügefunktion ein vor Selektor ist. Darüber hinaus wirken verkettete Operationen auf das Ergebnis der linken Hand.

So haben Sie

getan
// select all the g elements (only 1) 
d3.select("g") 
    // For each g, insert a text element before "path.data" 
    .insert("text", "path.data"); 

Sie wollen eine Operation für jedes Kind „.data“ durchzuführen, so dass Sie jede der „.data“ Elemente auswählen müssen und eine Aktion für jeden von ihnen durchführen . Ich bin nicht ganz sicher, wie d3 erwartet, dass Sie ein Element nach einem bestimmten Kind einfügen. Ich finde es viel einfacher, die DOM-API zu verwenden, um die Elemente zu erstellen und einzufügen, aber die d3.each-Funktion zu verwenden, um über eine Auswahl zu iterieren.

d3.selectAll("g > .data").each(function() { 
    var t = document.createElement('text'); 
    this.parentNode.insertBefore(t, this.nextSibling);  
});​ 
+0

Danke Matt. Das macht was ich will. Dies ist wahrscheinlich die beste Lösung, da die Funktion d3.js nur Konstanten als Selektoren unterstützt (im Moment). Sie können also "this.nextSibling" nicht als Selektor verwenden. I eine ideale Welt sollte die entsprechende d3.js Funktion in etwa so aussehen: d3.select (this.parentNode) .insert ("text", this); – Codetoffel

+0

Das Hinzufügen neuer Elemente mit '.each' und' document.createElement 'fügt den Knoten dem Dokument hinzu, wird jedoch aus irgendeinem Grund nicht mehr angezeigt. Angeblich ist es möglich, d3's insert() t zu verwenden, aber der "vorher" Selektor, der an 'insert()' übergeben wurde, wählt nur ein einzelnes Element aus. –

Verwandte Themen