Javascript AmCharts,停止a';单击石墨元素';事件传播到';单击图形';

Javascript AmCharts,停止a';单击石墨元素';事件传播到';单击图形';,javascript,amcharts,Javascript,Amcharts,我正在使用AmCharts,想知道如何停止clickGraphItem事件传播到clickGraph事件 我想阻止它的原因是: 当我单击XY图表中的气泡时,我使用Mustach在图形下呈现一个小表单,其中包含所单击项目的dataContext中包含的信息 由于绘图上有许多气泡,我希望能够在单击气泡图后突出显示气泡图上的选定项目,以便让用户知道编辑信息的目的点 但是,如果用户在图形的空白处单击(它自己的clickGraph事件),我想触发event.chart.validateData()以便单击

我正在使用AmCharts,想知道如何停止
clickGraphItem
事件传播到
clickGraph
事件

我想阻止它的原因是:

当我单击XY图表中的气泡时,我使用Mustach在图形下呈现一个小表单,其中包含所单击项目的
dataContext
中包含的信息

由于绘图上有许多气泡,我希望能够在单击气泡图后突出显示气泡图上的选定项目,以便让用户知道编辑信息的目的点

但是,如果用户在图形的空白处单击(它自己的clickGraph事件),我想触发
event.chart.validateData()以便单击的气泡返回到原始颜色

我遇到的问题是,当我单击项目时,我首先得到
clickGraphItem
事件触发,但这也会触发
clickGraph
事件

我尝试将
event.event.stopPropagation()
放在“渲染胡须并更改气泡填充”方法的末尾,但这没有任何效果

我用来处理这两个事件的函数如下:

  function showPointForm(event) {
    var ev = event

    if (ev.item && ev.item.dataContext.data != undefined) {
        var bullet = ev.item.bulletGraphics.node;
        bullet.setAttribute("stroke",colors.info);
        bullet.setAttribute("fill",colors.warning);
        $(document).find('#form-area').html(
          Mustache.render($(document).find('#form-template').html(),{
              data : ev.item.dataContext.data
            })
        )
    }else{
      $(document).find('#form-area').html('')
      event.chart.validateData();
    }
  ev.event.stopPropagation()
  }

var chart = AmCharts.makeChart('div',configObject)
chart.addListener("clickGraphItem",showPointForm);
chart.addListener("clickGraph",showPointForm);
这里的想法是,如果事件来自某个项,它将更改项目符号和笔划的填充,然后使用该项中的某些数据道具呈现表单。如果事件没有项目和数据,则渲染表单将被鞭打,图表将重新绘制为原始样式

停止事件传播在此处不会停止触发的
clickGraph
事件

你知道我做错了什么吗

谢谢

解决方案: 事实证明,标准的AmCharts API不支持我试图实现的目标。
clickGraph
事件不会在气泡图/XY图的空白处触发。相反,我在
.amcharts绘图区的
单击事件中附加了一个事件

    function showPointForm(event) {
    var ev = event

    if (ev.item && ev.item.dataContext.data != undefined) {
        $(document).find('.highlight').each(function(){
          $(this).attr('class', 'amcharts-graph-bullet');
        })
        var bullet = ev.item.bulletGraphics.node;
        bullet.setAttribute("class",'highlight amcharts-graph-bullet');
        $(document).find('#form-area').html(
          Mustache.render($(document).find('#form-template').html(),{
              data : ev.item.dataContext.data
            })
        )
    }else{
      $(document).find('#form-area').html('')
      event.chart.validateData();
    }
  }

  function reset(){
     $(document).find('#form-area').html('')
     timelineChart.validateData();
  }

var chart = AmCharts.makeChart('div',configObject)
chart.addListener("clickGraphItem",showPointForm);
$(document).on("click",'.amcharts-plot-area',reset);
所以现在当我点击一个气泡时,所有以前用
highlight
类设计的气泡都会被移除。然后点击气泡添加它

但是,当
amcharts绘图区域中出现单击事件时,会调用
reset()
函数,再次删除所有突出显示的类


这解决了我的问题,但如下所述,无法停止事件传播。

没有办法阻止图表事件传播。图表事件名称在
type
属性中传递,因此您可以使用该名称确定所需的流。这并不漂亮,但你只能这么做:

function showPointForm(event) {
  if (event.type == "clickGraphItem") {
   // logic for clickGraphItem only
  }
  else {
    // logic for clickGraph
  }
}
您还可以在触发clickGraphItem时在图表中设置一个自定义标志,以指示它刚刚被触发,这样您就知道如果它冒泡,就不会执行任何其他逻辑,例如:

function clickGraphHandler(event) {
  if (event.type == "clickGraphItem") {
    event.chart.clickGraphItemFired = true;
    console.log('clickGraphItem')
  } else {
    if (event.chart.clickGraphItemFired) {
      event.chart.clickGraphItemFired = false;
      console.log('clickGraph - bubbled from clickGraphItem');
    } else {
      console.log('clickGraph - not bubbled from clickGraphItem')
    }
  }
}

ev.事件停止播放??一个简单的
ev.stopPropagation()将work@AkshayKhandelwal-不会的。AmCharts事件在单独的属性中包含本机事件。