【问题标题】:NVD3.js bind hover/click events to the xAxis tick <line>NVD3.js 将悬停/单击事件绑定到 xAxis 刻度 <line>
【发布时间】:2014-03-31 08:08:28
【问题描述】:

我正在将 nvd3.js 与 line and line-with-focus charts 一起用于一个项目。需要将数据和事件绑定到 xAxis 刻度元素。我一直在徒劳地尝试通过控制台手动将事件绑定到一行。

// try to bind to the first xAxis <line> in my line-with-focus chart
d3.select( 'div#problem-chart .nv-focus .nv-x .tick line' )
     .on( 'mouseover', function( e ){ 
                        console.log( e ); 
      } )

我什至设置了chart.interactive( false ) 以确保没有捕获事件并杀死它们的交互层。有没有人设法将事件绑定到 xAxis 或猜测为什么上述方法不起作用?

【问题讨论】:

  • 你检查过你是否真的选择了一些东西吗?看起来您的选择器应该类似于 div#problem-chart &gt; .nv-focus &gt; .nv-x &gt; .tick &gt; line
  • @LarsKotthoff:是的,我查过了。它实际上是在选择一些东西
  • @LarsKotthoff:似乎g.nv-linesWrap 的子元素正在捕获事件,而这些事件并未渗透到g.nv-focus 子元素。呃
  • 嗯,我想你可以选择这些元素并在它们上设置pointer-events: none

标签: javascript d3.js nvd3.js


【解决方案1】:

您必须在行上显式设置 pointer-events 属性,以便它们响应鼠标事件:

  d3.selectAll('g.nv-axis line')
    .style("pointer-events", "visiblePainted")
    .on("mouseover", function(){
      d3.select(this).style("stroke", "red");
    });

有一个 CSS 样式规则关闭轴组件上的所有指针事件:

.nvd3 .nv-axis {
    pointer-events: none;
}

不过,我花了很多时间来追踪它——Chrome DOM 检查器不会将它显示为单个刻度上的“继承”样式,即使它会影响它们。

【讨论】:

  • P.S.这甚至适用于折线图上的.useInteractiveGuideline(true),但某些其他类型的交互可能仍会捕获鼠标事件。例如,它不适用于“取景器”图,该图有一个画笔选择器层,可以抓取所有鼠标事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多