javascript - 无法理解 d3js 缩放功能

标签 javascript d3.js

以下简单:)代码给出以下错误。请帮助我在圈子上的 onClick 上进行 ZOOM 时犯了什么错误?

同样,如果有人可以提供一些想法,如果我想直接缩放到第三个圆而不点击它,我将非常感激;我应该怎么办 ?

ERROR: Uncaught TypeError: Cannot read property 'apply' of undefined
    at qr.call (d3.min.js:2)
    at SVGCircleElement.clicked (index.html:52)
    at SVGCircleElement.<anonymous> (d3.min.js:2)

这是代码。

    <!DOCTYPE html>
    <html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1,maximum-scale=1" />
        <title>Zoom & Pan</title>
        <link rel="stylesheet" type="text/css" href="styles.css" />
        <script type="text/javascript" src="d3.min.js"></script>

        <style type="text/css">

        </style>
    </head>

    <body>


        <script type="text/javascript">
            var width = 600, height = 350;
            var data = [
                { "r": 10, "cx": 100, "cy": 150 },
                { "r": 30, "cx": 200, "cy": 150 },
                { "r": 15, "cx": 300, "cy": 150 }

            ];
            var svg = d3.select("body").append("svg")
                .attr("width", width)
                .attr("height", height)
                .call( 
                        d3.zoom()
                        .scaleExtent([1, 7])
                        .on("zoom", zoom)
                );

            const g = svg.append("g");

            g.selectAll("circle")
                .data(data)
                .enter()
                .append("circle")
                //.attr("fill", function (d) { return d.color; })
                .attr("fill", (d, i) => d3.interpolateRainbow(i / 3))
                .on("click", clicked)
                .attr("r", function (d) { return d.r; })
                .attr("cx", function (d) { return d.cx; })
                .attr("cy", function (d) { return d.cy; });


            function clicked(d,i,nodes) {
                console.log(nodes);

                svg.transition().duration(750).call(
                    zoom.transform,
                    d3.zoomIdentity.translate(width / 2, height / 2).scale(40).translate(-d.cx, -d.cy),
                    d3.mouse(svg.node())
                );

            }

            function zoom() {
                g.attr("transform", d3.event.transform);
            }

        </script>

    </body>

    </html>

最佳答案

问题是 zoom.transform 不是一个东西。您已经创建了一个名为 zoom 的函数,如果这很重要,那么您需要创建另一个名为其他变量的变量,例如缩放器,可能在窗口范围内,例如 widthheight:

var zoomer = d3.zoom();

然后在您的点击处理程序中将 zoom.transform 更改为 zoomer.transform:

function clicked(d,i,nodes) {
  console.log(nodes);

  svg.transition().duration(750).call(
    zoomer.transform, //change here
    d3.zoomIdentity.translate(width / 2, height / 2).scale(40).translate(-d.cx, -d.cy),
    d3.mouse(svg.node())
  );
}

如果您不需要 zoom 函数,请删除该函数并创建 zoom 变量(如上面的 zoom 变量),然后不要使用不要更改点击处理程序。

关于javascript - 无法理解 d3js 缩放功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59668684/

相关文章:

javascript - Nightwatch.js 错误 : "Cannot read propery ' equal' of undefined

javascript - JQuery Attr 可见,不适用于 IE7 或更低版本

javascript - 链接ajax并按顺序执行。 Jquery 延迟

javascript - 如何防止向 javascript 数组添加重复键

javascript - 以html形式输入ID并在同一页面从MySQL数据库加载相关数据

javascript - 使用D3.js强制布局时如何在圆圈上放置文字?

javascript - 具有多个 child 的基准继承

javascript - d3中堆叠条形图所有堆叠的总和

javascript - 自下而上动画 d3 图

javascript - 不是 nvd3 或 d3 的默认 json 格式