【问题标题】:D3 circle pack: html in text attributeD3 圆圈包:文本属性中的 html
【发布时间】:2013-05-22 20:25:20
【问题描述】:

下面的代码可以正常工作,因为我可以将文本字符串输出到气泡中。

但是如何将 HTML 标记输出到气泡文本标签中?您可以在第一个“名称”属性中看到我的 HTML 标记。

这个 div 在这个例子中非常简单,但它最终会包含更多的标记和一个 css 的类 id

<script>
    $(document).ready(function () {
        var json = {
            "name": "flare",
            "children": [
                { "name": "<div>test1<br>test again</div>", "size": 20, "color": "#ff0000" , "id": 1},
                { "name": "test2", "size": 40, "color": "#ffff00", "id": 2},
                { "name": "test3", "size": 60, "color": "#ff0000", "id": 3},
                { "name": "test4", "size": 80, "color": "#ff00ff", "id": 4 },
                { "name": "test5", "size": 100, "color": "#0000ff", "id": 5}
            ]
        };

        var r = 400,
            format = d3.format(",d"),
            fill = d3.scale.category20c();

        var bubble = d3.layout.pack()
            .sort(null)
            .size([r, r])
            .padding(1.5);

        var vis = d3.select("#chart").append("svg")
            .attr("width", r)
            .attr("height", r)
            .attr("class", "bubble");

        var node = vis.selectAll("g.node")
            .data(bubble.nodes(classes(json))
            .filter(function (d) { return !d.children; }))
            .enter().append("g")
            .attr("class", "node")
            .attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; });

        node.append("circle")
            .attr("r", function (d) { return d.r; })
            .style("fill", function (d) { return d.color; })
            .on("click", function (d) { alert("id: " + d.id); });

        node.append("text")
            .attr("text-anchor", "middle")
            .attr("dy", "0.3em")
            .text(function (d) { return d.dispText.substring(0, d.r / 3); });

        function classes(root) {
            var classes = [];

        function recurse(name, node) {
            if (node.children)
                node.children.forEach(function (child) {
                    recurse(node.name, child);
                });
            else
                classes.push({
                    packageName: name, dispText: node.name, value: node.size, color: node.color, id: node.id});
            }

            recurse(null, root);
            return { children: classes };
        }

    });

    </script>

【问题讨论】:

    标签: javascript jquery html d3.js circle-pack


    【解决方案1】:

    您需要 foreignObject 标记,它允许您嵌入 HTML(或其他 XML 命名空间) - Mike Bostock 在这里有一个很好的使用示例:http://bl.ocks.org/mbostock/1424037

    在您的情况下,这可能看起来像(未经测试):

    node.append("foreignObject")
        // I believe w/h are required, though the size is arbitrary
        .attr("width", 200)
        .attr("height", 50)
      .append("xhtml:body")
        .html(function (d) { return d.dispText.substring(0, d.r / 3); });
    

    【讨论】:

    • 谢谢,这似乎可以解决问题,我有很多定位/样式要做,但这让我继续前进。我使用 D3 和 SVG 的第一天
    • 不幸的是,IE 9 & 10 不支持foreignObject
    • 如果您需要 IE 支持,另一种选择是在 SVG 之外添加 HTML 元素,并根据 SVG 中的属性定位它们 - 这绝对是可能的,但可能会有点麻烦。有关基于 SVG 元素放置 HTML 元素的示例,请参阅 this method in jQuery.powertip
    猜你喜欢
    • 2012-08-01
    • 2014-07-08
    • 2013-12-19
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多