2016-09-13 11 views
3

d3プログラムでは、ノード(d3.selection付き)を取得してから、同じsvgに挿入する必要があります。d3選択のコピーと挿入

私はappendやinsertのようないくつかの関数があることを知っていますが、これらの関数は新しい要素用です。 {_groups、_parents}

var anotherNode = d3.select("anotherNode").insert(node); //It work but it would be great a similar function or a workaround 

注:

var node = d3.select("rect#someId"); //node with some attributes and listeners 

今私のVARノードには、次の属性を得ました。私はあなたの選択のクローンを作成するために、この機能を使用したノード

+0

[* "イベントリスナーでDOMノードをコピーする方法" *](/ q/15408394)をご覧ください。 – altocumulus

答えて

4

のリスナーを維持する必要があります。

function clone(selector) { 
    var node = d3.select(selector).node(); 
    return d3.select(node.parentNode.insertBefore(node.cloneNode(true), node.nextSibling)); 
} 

その後、あなたは(クラスによる)clone("#foo")(IDによって)またはclone(".foo")でそれを呼び出すことができます。ここ

はID「グループ」のグループ(一方RECTと一つの円)がクローン化された例、(翻訳だけ良好クローンを表示することがある)である。

function clone(selector) { 
 
    var node = d3.select(selector).node(); 
 
    return d3.select(node.parentNode.insertBefore(node.cloneNode(true), 
 
node.nextSibling)); 
 
} 
 

 
var copy = clone("#group").attr("transform", "translate(120,100)");
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<svg width="200" height="200"> 
 
\t <g id="group"> 
 
\t \t <rect x="10" y="10" width="50" height="20" fill="teal"></rect> 
 
\t \t <circle cx="35" cy="40" r="20" fill="red"></circle> 
 
\t </g> 
 
</svg>

PS:これはリスナーをクローンしません。また、この機能は私のものではなく、Bostockによって書かれたものです。

+0

ありがとうございます。 – evileumas

+0

Mike Bostockのデモが参考になりましたが、SVGの代わりにHTMLを扱っています:https://bl.ocks.org/mbostock/9360565。そして、この文脈で役に立つselect.clone()サウンド:https://github.com/d3/d3-selection/blob/master/README.md#selection_clone – MSC