我正在使用d3进行绘图,我正在尝试创建一个svg对象,以便稍后添加到DOM中。
我曾经有过
var svg = d3.select(el).append("svg");
var graph = svg.append("g")
...etc...
由于我不会进入的原因,我想在将svg
元素附加到DOM之前创建它。
所以我做了
var svg = d3.select(document.createElementNS(d3.ns.prefix.svg, 'svg'))
var graph = svg.append("g")
...etc...
,这是有效的,在调试时,我可以看到svg
是一个1元素的数组,孩子很好地附加。
问题出在append
步骤:
d3.select(el).append(svg);
在那里,我收到了一个错误Error: Failed to execute 'createElementNS' on 'Document': The qualified name provided ('[object SVGSVGElement]') contains the invalid name-start character '['.
我在这里看了一眼:How to create "svg" object without appending it?但似乎这就是他们的建议。
知道为什么会这样吗?我试过追加svg[0]
,但也没有运气。似乎append()
只将字符串作为参数。
编辑:https://github.com/mbostock/d3/wiki/Selections#append州的d3参考
selection.append(名称) ...... ...... “可以将名称指定为常量字符串,也可以将其指定为返回要追加的DOM元素的函数。”
因此我尝试了
d3.select(el).append(function(){return svg;});
但是Error: Failed to execute 'appendChild' on 'Node': The new child element is null.
答案 0 :(得分:10)
如果选择svg
,svg.node()
将返回DOM元素,例如:
d3.select(el).append(function(){return svg.node();});
(请注意,我不确定svg
在您的案例中是否是真正的选择,但您可以尝试一下。)
答案 1 :(得分:0)
最好使用常规element.appendChild
功能。
您可以使用d3.select(el).node()
获取对您的父元素的引用,然后,您可以在其上调用.appendChild
,传递svg.node()
作为要追加的元素。
所以,一起:
d3.select(el).node().appendChild(svg.node());