javascript - D3 圆圈包中单独的鼠标单击圆圈和背景

标签 javascript jquery d3.js circle-pack

如何从下面的代码中获取两个单独的点击事件

1.点击圆圈时会显示“圆圈点击”。

2.紧接着显示“背景被点击”警报。

我需要的是让两个事件彼此独立,这样当我点击一个圆圈时“圆圈点击”就会发出警报 并且“点击背景”只会在我点击背景(即图表容器)时发出警报。

 <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")
                    .on("click", function (d) { alert("Back ground clicked"); });

                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("Circle Clicked"); });

                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>

最佳答案

从 vis 对象中删除 onclick 事件并将其添加到背景矩形:

var background  = vis.append("rect")
                  .attr("width", r)
                  .attr("height", r)
                  .on("click", function (d) { alert("Background clicked"); });

确保在圆圈之前添加背景矩形,以便它们出现在其前面。

工作中的jsfiddle:http://jsfiddle.net/HKE2j/

关于javascript - D3 圆圈包中单独的鼠标单击圆圈和背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16819112/

相关文章:

javascript - 仅当屏幕大于 767 时运行脚本

javascript - 多次 AJAX 请求后获取总和

javascript - Jquery如何根据计算对表进行排序

javascript - 在客户端 react 代码中找不到变量

javascript - 让事件监听器影响堆栈中的多个项目

jQuery on() 使用 ajax 加载内容

jquery - 如何使选定的标题及其内容处于事件状态,而其他的则处于非事件状态?

javascript - 去掉 c3.js 上的中间线

javascript - d3js-强制 : nodes and links from json file not loaded in my svg during redrawing

javascript - 如何在 d3 中悬停时增加饼图的大小