在同一HTML页面上使用不同版本的D3

13

我正在尝试使用d3.js在单个HTML页面中构建treelist和treemap。我的treelist和treemap在各自的页面上运作正常,但我想将它们合并到一个单独的HTML页面中。

我面临的问题是,对于treelist,我正在使用d3.js版本3,而对于treemap,我正在使用d3.js版本4。因此,当我尝试将它们嵌入到单个页面中时,会出现版本冲突(只显示treemap)。

请指导我如何解决版本冲突。

以下是我的d3.js代码,其中包括版本3(第一个col-md-4)和版本4(第二个col-md-8):

<script src="http://d3js.org/d3.v3.min.js"></script>
<div class="row">
    <div class="col-md-4">
        <div id="treelisttest" style="height:500px;">   </div>

        <script>

                    var id = 0;
                    d3.json("data.json", function (err, data) {

                        var tree = d3.layout.treelist()
                                 .childIndent(10)
                                 .nodeHeight(30);

                        var ul = d3.select("#treelisttest").append("ul").classed("treelist", "true");

                        function render(data, parent) {
                            var nodes = tree.nodes(data),
                                duration = 250;
                            function toggleChildren(d) {

                                if (d.children) {
                                    d._children = d.children;
                                    d.children = null;
                                } else if (d._children) {
                                    d.children = d._children;
                                    d._children = null;
                                }
                            }

                            var nodeEls = ul.selectAll("li.node").data(nodes, function (d) {
                                d.id = d.id || ++id;
                                return d.id;
                            });

                            var entered = nodeEls.enter().append("li").classed("node", true)
                                .style("top", parent.y + "px")
                                .style("opacity", 0)
                                .style("height", tree.nodeHeight() + "px")
                                .on("click", function (d) {
                                    toggleChildren(d);
                                    render(parent, d);
                                })
                                .on("mouseover", function (d) {
                                    d3.select(this).classed("selected", true);
                                })
                                .on("mouseout", function (d) {
                                    d3.selectAll(".selected").classed("selected", false);
                                });

                            entered.append("span").attr("class", function (d) {
                                var icon = d.children ? " glyphicon-chevron-down"
                                    : d._children ? "glyphicon-chevron-right" : "";
                                return "caret glyphicon " + icon;
                            });

                            entered.append("span").attr("class", function (d) {
                                var icon = d.children || d._children ? "glyphicon-folder-close"
                                    : "glyphicon-file";
                                return "glyphicon " + icon;
                            });

                            entered.append("span").attr("class", "filename")
                            .html(function (d) { return d.name.substring(0, 5) });

                            nodeEls.select("span.caret").attr("class", function (d) {
                                var icon = d.children ? " glyphicon-chevron-down"
                                    : d._children ? "glyphicon-chevron-right" : "";
                                return "caret glyphicon " + icon;
                            });

                            nodeEls.transition().duration(duration)
                                .style("top", function (d) { return (d.y - tree.nodeHeight()) + "px"; })
                                .style("left", function (d) { return d.x + "px"; })
                                .style("opacity", 1);
                            nodeEls.exit().remove();
                        }

                        render(data, data);

                    });
        </script>

    </div>
    <div class="col-md-8">
        <div id="maptest">

            <script src="http://d3js.org/d4.v3.min.js"></script>


            <svg width="500" height="1000"></svg>

            <script src="d3.v4.min.js"></script>
            <script>
                var svg = d3.select("#maptest")
                       .append("svg")
                       .attr("width", "100%")
                       .attr("height", "50%")
                       .call(d3.zoom().on("zoom", function () {
                           svg.attr("transform", d3.event.transform)
                       }))
                       .append("g")



            var treemap = d3.treemap()
                .tile(d3.treemapResquarify)
                .size([1000, 1000])
                .round(true)
                .paddingInner(1);

            d3.json("data.json", function (error, data) {
                if (error) throw error;

            var root = d3.hierarchy(data)
                .sum(sumBySize)

                treemap(root);

                var cell = svg.selectAll("g")
                    .data(root.leaves())
                    .enter().append("g")
                    .attr("transform", function (d) { return "translate(" + d.x0 + "," + d.y0 + ")"; });

                cell.append("rect")
                    .attr("id", function (d) { return d.data.id; })
                    .attr("width", function (d) { return d.x1 - d.x0; })
                    .attr("height", function (d) { return d.y1 - d.y0; })
                    .attr("fill", function (d) { return color(d.data.value); });

                cell.append("clipPath")
                    .attr("id", function (d) { return "clip-" + d.data.id; })
                    .append("use")
                    .attr("xlink:href", function (d) { return "#" + d.data.id; });

                cell.append("text")
                    .attr("dy", ".75em")
                    .text(function (d) { return d.data.name.substring(0, 1); })

                cell.append("title")
                    .text(function (d) { return d.data.id + " with name " + d.data.name });
            });


        function sumByCount(d) {
            return d.children ? 0 : 1;
        }

        function sumBySize(d) {
            return d.value;
        }

            </script>
        </div>
    </div>
</div>

你在Chrome控制台中有收到任何错误信息吗? - Kristian Vybiral
不,我没有遇到错误。 - Bhushan Khaladkar
@Arvind Cheekkallur... 有没有办法将两个版本合并到同一页中? - Bhushan Khaladkar
@Bob。你有试过在d3.v4中实现树图和树列表吗?似乎融合两个版本很难。 - Aravind Cheekkallur
哦.. 我试着使用版本4转换我的树形列表,但是没有得到任何积极的结果。 - Bhushan Khaladkar
显示剩余7条评论
3个回答

14
你可以将脚本的第三个版本下载到本地,并将最后一行更改为:
this.d3 = d3;

this.d3v3 = d3;

因此,您可以使用调用d3的d3版本4,以及调用d3v3的库的版本3


简单而有效 - bumbeishvili
升级之前只需要快速修复。非常感谢你!! - rAjA
你能告诉我最后一行是哪一行吗:this.d3 = d3;? - X. L
你能详细说明一下这个解决方案吗?我似乎找不到这行代码 this.d3 = d3。 - sangurocactus

8
我不知道你为什么要这样做,或者这是否真的必要。请记住,我只是回答你的问题,即如何在同一页中使用D3 v3和v4,而不分析你的目标或者这是否是一个XY问题
正如你现在所知道的,你不能只在HTML中引用两个版本:
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/d3.v3.min.js"></script>

因为很明显,当你使用d3调用方法时会导致冲突。
因此,解决方案是下载其中之一的版本并更改源代码。
在这个解决方案中,我将更改v4.x版本(压缩版)的源代码,并使用对v3的常规引用。你也可以按照Daniela在她的答案中所做的方式进行,但步骤不同。
在D3 v4.x(压缩版)中,你会在开头看到这个:
// https://d3js.org Version 4.9.1. Copyright 2017 Mike Bostock.
(function(t, n) {
    "object" == typeof exports && "undefined" != typeof module ?
        n(exports) : "function" == typeof define && define.amd ?
        define(["exports"], n) : n(t.d3 = t.d3 || {})
}) etc...

我要做的是将 t.d3 更改为 t.d3v4(或任何您想要的名称)。
之后,您可以使用 d3 调用您的 D3 v3 函数,使用 d3v4(而不是 d3)调用您的 D3 v4 函数。
就像这个例子中一样:
var scalev3 = d3.scale.linear()
    //note:    ^----- use `d3` for D3 v3 functions
    .range([0, 5000])

var scalev4 = d3v4.scaleLinear()
    //note:     ^----- use `d3v4` for D3 v4 functions
    .range([0, 200]);

console.log(scalev3(0.4))//logs 2000, as expected.
console.log(scalev4(0.4))//logs 80, as expected.

这是带有该代码的plunker:https://plnkr.co/edit/h174Gcc3YSCJGpNljCOh?p=preview

这是更好的解决方案,因为被接受的答案在使用Angular时无法正常工作。 - Furqan Ahmed

0

我使用RequireJS来解决这个问题

  • 树形列表 d3 版本 : 3

         require( ["js/common/d3.v3.min"], function(d3) {
            // 在此处编写树形列表代码
           });
    
  • 矩形树图 d3 版本 : 4

    require( ["js/common/d3.v4.min"], function(d3) {       
    // 在此处编写矩形树图代码
    

    }

注意:您需要导入require.js文件:从这里下载

http://requirejs.org/docs/1.0/docs/download.html

将导入语句放置在body标签的末尾,即:

< body>

// 代码 ....

< /body >


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接