2017-05-25 176 views
7

我嘗試使用d3.js在單個html頁面中構建treelist和treemap。 我的treelist和treemap在個別頁面上工作正常,但我想將它們合併到單個html頁面中。在同一個html頁面上使用不同的D3版本

我面臨的問題是,對於樹形列表我使用d3.js 版本3和樹形圖我使用d3.js 版本4。所以當我嘗試將它們嵌入到單個頁面中時,存在版本衝突(它僅顯示樹形圖)。

請指導我如何解決版本衝突。

以下是我與版本3(第一COL-MD-4)和版本4(COL-MD-8)d3.js代碼

<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> 
+0

您是否獲得在Chrome控制檯任何錯誤? –

+0

不,我沒有收到錯誤 – Bob

+0

這可能是因爲你的樹形圖在與treelist相同的容器中渲染。你有代碼或代碼的東西? –

回答

6

您也可以下載本地腳本的版本3從

this.d3 = d3; 

最後一行改爲

this.d3v3 = d3; 

所以,你可以使用這個庫的版本D3 4調用D3和第3版打電話d3v3

+0

:)簡單而有效 – bumbeishvili

2

(我不知道你爲什麼要這樣做,或者如果這是真的有必要。請記住,我只是回答您的問題,即如何在同一頁面中使用D3 v3和v4,而無需分析您的目標,或者如果這是一個XY problem

您一定已經知道,你不能只是引用兩個版本的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在her answer中所做的那樣),但是步驟並不相同。

在D3 4.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.d3t.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

0

我使用RequireJS來解決這個問題

  • 樹形列表D3 版本:3

     require(["js/common/d3.v3.min"], function(d3) { 
         // tree list code here 
         }); 
    
  • 樹形圖D3 版本:4

    require(["js/common/d3.v4.min"], function(d3) {  
    // treemap code here 
    

    }

注意:您需要導入require.js文件:從這裏

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

下載

將導入語句放在主體的末尾標籤即

<體>

//代碼 ....

</BODY>

相關問題