2012-11-08 19 views
7

Invece di fareCrea elemento "in memoria", come jQuery fa, in d3.js

d3.select("body").append("svg") 

, che la maggior parte d3.js esempi non, mi piacerebbe creare un elemento, e NON collegarlo al corpo o qualcosa subito.

Un po 'come $('<div/>') in jQuery.

Come posso fare questo?

+0

possibile duplicato di [Come creare "svg" oggetto senza aggiungerlo ?] (http://stackoverflow.com/questions/18455282/how-to-create-svg-object-without-appending-it) –

risposta

13

Creare l'elemento utilizzando document.createElement() e passarlo a d3 come al solito.

In console:

> a = document.createElement("div") 
<div>​</div>​ 
> d3.select(a).append("svg") 
[Array[1]] 
> a 
<div>​ 
<svg>​</svg>​ 
</div>​ 
+4

Corretto e reso ufficiale su https://github.com/mbostock/d3/issues/825 – widged

+0

Grazie @widged dal follow-up! – minikomi

1

Si dovrebbe provare qualcosa di simile:

var $svg = $('<svg/>'); 
var d3svg = d3.select($svg[0]); 

// ... manipulate d3svg ... 

$('body').append($svg) 

Speranza che aiuta.

0

ho dovuto fare questo al fine di supportare larghezze percentuali sulla mia abitudine elemento SVG:

var svgDom = document.createElementNS("http://www.w3.org/2000/svg", "svg"); 
svgDom.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); 
svg = d3.select(svgDom) 
    .attr("class", "chart") 
    .attr("width", "100%") 
    .attr("height", "100%"); 
0

Per creare l'elemento SVG "in memoria" usare document.createElementNS.

L'utilizzo di document.createElementNS:

// Create the svg elem 
var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); 

// Create a g elem 
var g = document.createElementNS("http://www.w3.org/2000/svg", "g"); 

// Create a d3 Selection with the elem 
var d3Svg = d3.select(svg); 
var d3g = d3.select(g); 

Appendi una selezione d3 ad un'altra selezione d3:

d3Svg.append(function(){ return d3g.node(); });