附加' onclick'事件到D3图表背景

时间:2014-04-08 15:41:55

标签: javascript jquery d3.js

我有一个D3直方图,我在其上附加了一个'onclick'事件:

...
var bar = svg.selectAll(".bar")
        .data(data)
        .enter().append("g")
        .attr("class", "bar")
        .attr("transform", function(d) { return "translate(" + x(d.x) + "," + y(d.y) + ")"; })
        .on('mouseover', tip.show)
        .on('mouseout', tip.hide)
        .on('click', function(d,i){ //do stuff  });
...

这完全符合预期。我还想在图表的背景上添加一个'onclick'事件(即图表中不是条形图的任何地方),但我遇到了麻烦。我尝试过以几种方式附加事件,但在每种情况下,这个新事件似乎都会覆盖我的条形图:

一些尝试:

$("svg:not('.bar')").on("click", function(){ //do stuff });

$("g:not('.bar')").on("click", function(){ //do stuff });

var svg = d3.select("#histogram_block").append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
        .on("click", function(d,i){
            if (d) { //do stuff}
            else { //do stuff }
        };

我假设有一种方法可以在初始化时将事件处理程序添加到SVG对象中,但我不知道正确的方法。

2 个答案:

答案 0 :(得分:57)

事件未被实际覆盖,但两者都被触发 - SVG和条形码的onclick处理程序。要防止出现这种情况,请使用.stopPropagation()方法(请参阅the documentation)。代码如下所示:

rect.on("click", function() {
  console.log("rect");
  d3.event.stopPropagation();
});

完整示例here。与停止传播事件here的行为进行比较。

答案 1 :(得分:1)

在这个例子中(第246行:http://tributary.io/inlet/8361294)我追加一个宽度为&的新矩形。高度等于总图表区域,然后附加我的鼠标(或单击)事件。

svg.append("rect")
        .attr({"class": "overlay" , "width": width , "height": height})
        .on({
          "mouseover": function() { /* do stuff */ },
          "mouseout":  function() { /* do stuff */ }, 
          "click":  function() { /* do stuff */ }, 
        });