代码之家  ›  专栏  ›  技术社区  ›  Scott Skiles

放大图表数据时,如何使用带有nvd3条的D3.js“onClick”事件?

  •  1
  • Scott Skiles  · 技术社区  · 7 年前

    onClick

    我可以用这个 question 要了解如何使用nvd3为条形图添加“onClick”事件 linePlusBarChart

    这个 jsfiddle here is working . 请随时点击一个酒吧,看看我要什么(使用 alert 作为测试)。相关代码位于JavaScript的底部,如下所示:

    d3.select('#chart1 svg')
        .datum(testdata)
        .transition().duration(500).call(chart);
        nv.utils.windowResize(chart.update);
        chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); });
        return chart;       
       }, function(){
          d3.selectAll(".nv-bar").on('click', 
              function(e){
                console.log(e);
                alert("You clicked on bar!");
              }
          );   
      });
    

    我真的很高兴这是一个解决办法。使用 function(e)

    是什么导致了 单击 事件与某个特定的酒吧解除关联?

    是否有其他位置需要我添加 单击 逻辑?

    任何帮助都将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  1
  •   rioV8    7 年前

    刷子叫刷子 historicalBar 以焦点栏作为选择的图表。

    呈现图表后,将分派 renderEnd 事件。

    我们将onclick回调放在一个单独的函数中,因为我们需要它多次

    function addOnClick() {
      d3.selectAll(".nv-bar")
        .on('click', function(e) { console.log(e); alert("You clicked on bar!"); } );
    }
    

    我们需要为此事件添加回调

    chart.bars.dispatch.on('renderEnd', addOnClick);
    

    图表的完整代码如下

    var chart;
    nv.addGraph(function() {
        chart = nv.models.linePlusBarChart()
          .margin({top: 50, right: 80, bottom: 30, left: 80})
          .legendRightAxisHint(' [Using Right Axis]')
          .color(d3.scale.category10().range());
        chart.xAxis.tickFormat(function(d) {
          return d3.time.format('%x')(new Date(d))
        }).showMaxMin(false);
        chart.y2Axis.tickFormat(function(d) { return '$' + d3.format(',f')(d) });
        chart.bars.forceY([-3899468]).padData(false);
        chart.lines.forceY([-600]).padData(false);
    
        chart.x2Axis.tickFormat(function(d) {
          return d3.time.format('%x')(new Date(d))
        }).showMaxMin(false);
        d3.select('#chart1 svg')
          .datum(testdata)
          .transition().duration(500).call(chart);
        nv.utils.windowResize(chart.update);
        chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); });
        chart.bars.dispatch.on('renderEnd', addOnClick);
        return chart;
      }, addOnClick
    );
    function addOnClick() {
      d3.selectAll(".nv-bar")
        .on('click', function(e) { console.log(e); alert("You clicked on bar!"); } );
    }