3

我正在创建一个rectangleusing d3.js,在该矩形内我正在创建 10 个较小的矩形`。

我想在鼠标点击时将整个东西复制到另一个 svg 元素中。

jsfiddle代码链接:http: //jsfiddle.net/nikunj2512/XK585/

这是代码:

var svgContainer = d3.select("body").append("svg")
.attr("width", 200)
.attr("height", 200);

//Draw the Rectangle
var rectangle = svgContainer.append("rect")
.attr("x", 10)
.attr("y", 10)
.attr("fill", "red")
.attr("width", 200)
.attr("height", 200);

var bigRectContainer = d3.select('#bigRectContainer').append('svg')
    .attr('width', 200)
    .attr('height', 200);
var dim = 20;
var x = 0;
var y = 0;
for (i = 1; i < 11; i++) {

    x = 10 + (i-1)*dim;
    //alert(x);
y = 10;

    svgContainer.append("rect")
        .attr("x", x)
        .attr("y", y)
        .attr("width", 20)
        .attr("height", 20)
        .style("fill", "black");
 }

 var bigRectContainer = svgContainer.append("g");
 svgContainer.selectAll("rect").on("click", function () {
 var littleRect = d3.select(this);
console.log(littleRect)

var bigRect = bigRectContainer.selectAll("rect")
                       .data(littleRect)
                       .enter()
                       .append("rect");

 });

请告诉我我在哪里做错了...

4

2 回答 2

11

我不完全确定你想用你发布的代码做什么,但我认为复制整个 SVG 节点很有趣。事实证明这很容易做到——这在 SVG 节点上不起作用selection#html,但它在它的容器上起作用,所以很容易克隆整个节点:

function addAnother() {
    var content = d3.select(this.parentNode).html();
    var div = d3.select('body').append('div')
        .html(content);
    div.selectAll('svg').on('click', addAnother);
}

svg.on('click', addAnother);

请参阅此处的工作小提琴。请注意,这仅在 SVG 节点是其父节点的唯一子节点时才有效 - 否则,您可能需要以某种方式包装它。

于 2013-10-26T00:17:27.310 回答
2

D3 不提供克隆功能,可能是因为DOM 元素(包括 SVG 节点)上已经存在本机cloneNode方法。

此方法包括一个布尔参数以进行深度复制(即复制所有后代),而不是仅克隆调用它的节点。您可能想要执行类似bigRectContainer.node().cloneNode(true)复制整个 DOM 矩形分支的操作​​。

于 2016-11-28T18:31:01.087 回答