破解的代码升级到d3.js v4.0

时间:2016-07-01 12:55:30

标签: d3.js

我的js文件中有以下代码:

d3.selectAll("svg").remove();
svgContainer = d3.select("#MainDiv")
    .append("svg")
    .attr({
        width: 1920,
        height: 932,
        version: 1.1,
        xmlns: "http://www.w3.org/2000/svg",
        viewBox: "-40, -40, 2810, 1940",
        "class": "borgModuleDesigner"
    })
    .on("contextmenu",
        function() {
            d3.event.preventDefault();
        });

使用d3.js v3.5.17时,此代码工作正常。我刚刚升级到v4.0.0,现在我收到以下错误:

Unable to get property 'on' of undefined or null reference

我找不到导致这种情况的原因。我需要更改什么才能在v4中使用它?

编辑:

感谢Gerardo,我现在已经有了我的代码。如果只定义了一个属性,则使用attr,如果多于一个属性则使用。以下代码片段现在可以与d3.js v4.0一起使用,只要我添加对d3-selection-multi.v0.4.min.js的引用:

var BorgAnalogue = function (container, object) {
var d = [{ x: object.X, y: object.Y, moveX: object.X, moveY: object.Y }];
var analogue = container.data(d).append("g").attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; }).call(onDragDrop(dragmove, dropHandler))
    .attr("id", "A" + object.ModuleNumber).attr("title", "Analogue " + object.ModuleNumber + " - brIQ Size: 14
Label = " + object.label + "
Source = " + s).attr("class", "masterTooltip")
    .on("mouseenter", mouseenter).on("mouseleave", mouseleave).on("mousemove", mousemove).on("mousedown", mousedown).on("mouseup", mouseup);
analogue.attr("desc", "Analogue-Analogue Module Parameters-738-470");
analogue.append("rect").attrs({ x: 20, y: 0, width: 220, height: 25, fill: "#FFFFFF", stroke: "black", "stroke-width": 1 });
analogue.append("text").attrs({ x: 43, y: 20, "font-family": "arial", "font-stretch": "condensed", "font-size": "20px", fill: "black" }).text(object.label);
analogue.append("rect").attrs({ x: 20, y: 25, width: 220, height: 55, fill: "#F5F5FF", stroke: "black", "stroke-width": 1, id: "highlight" });
analogue.append("path").attrs({ "d": "M 20,35 a10,15 0 0,0 0,30", fill: "#FFFFFF", stroke: "black", "stroke-width": 1, "class": "analogDrop", "id": "s-50" }).on("mouseover", overNode)
    .on("mouseout", outNode);

}

注意attr和attrs的混合。

1 个答案:

答案 0 :(得分:3)

变化很小,只有一个字母:attrs而不是attr。这是因为您使用的是多值语法(您的对象)。检查API:

https://github.com/d3/d3-selection-multi

所以,代码应该是:



svgContainer = d3.select("#MainDiv")
    .append("svg")
    .attrs({
        "width": 1920,
        "height": 932,
        "version": 1.1,
        "xmlns": "http://www.w3.org/2000/svg",
        "viewBox": "-40, -40, 2810, 1940",
        "class": "borgModuleDesigner"
    })
    .on("contextmenu",
        function() {
            d3.event.preventDefault();
        });

<div id="#MainDiv"></div>

<script src="https://d3js.org/d3.v4.js"></script>
<script src="https://d3js.org/d3-selection-multi.v0.4.min.js"></script>
&#13;
&#13;
&#13;

点击&#34;运行代码段&#34;,您将不再看到错误。

但是回答你的问题会产生另一个问题:我只能将selection-multi引用为单独的链接:

<script src="https://d3js.org/d3-selection-multi.v0.4.min.js"></script>

有趣的是,它并没有使用&#34;整体&#34; D3 4.0库。它应该使用完整的D3 4.0库:

<script src="https://d3js.org/d3.v4.js"></script>
但是,显然,它并没有。

编辑:看起来,d3.selection-multi不是默认包的一部分。所以,你必须像我在片段中那样做。根据API:

  

为了简约,多值映射方法已被提取到d3-selection-multi并且不再是默认包的一部分。