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