ECharts 事件处理
ECharts 中我们可以通过监听用户的操作行为来回调对应的函数。
ECharts 通过 on 方法来监听用户的行为,例如监控用户的点击行为。
ECharts 中事件分为两种类型:
用户鼠标操作点击,如 &qpos;click&qpos;、&qpos;dblclick&qpos;、&qpos;mousedown&qpos;、&qpos;mousemove&qpos;、&qpos;mouseup&qpos;、&qpos;mouseover&qpos;、&qpos;mouseout&qpos;、&qpos;globalout&qpos;、&qpos;contextmenu&qpos; 事件。
还有一种是用户在使用可以交互的组件后触发的行为事件,例如在切换图例开关时触发的 &qpos;legendselectchanged&qpos; 事件),数据区域缩放时触发的 &qpos;datazoom&qpos; 事件等等。
myChart.on(&qpos;click&qpos;, function (params) { // 在用户点击后控制台打印数据的名称 console.log(params); }); myChart.on(&qpos;legendselectchanged&qpos;, function (params) { console.log(params); }); chart.on(&qpos;click&qpos;, &qpos;series.line&qpos;, function (params) { console.log(params); }); chart.on(&qpos;mouseover&qpos;, {seriesIndex: 1, name: &qpos;xx&qpos;}, function (params) { console.log(params); });
鼠标事件
ECharts 支持的鼠标事件类型,包括 &qpos;click&qpos;、&qpos;dblclick&qpos;、&qpos;mousedown&qpos;、&qpos;mousemove&qpos;、&qpos;mouseup&qpos;、&qpos;mouseover&qpos;、&qpos;mouseout&qpos;、&qpos;globalout&qpos;、&qpos;contextmenu&qpos; 事件。
以下实例在点击柱形图时会弹出对话框:
实例
var myChart = echarts.init(document.getElementById(&qpos;main&qpos;));
// 指定图表的配置项和数据
var option = {
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: &qpos;销量&qpos;,
type: &qpos;bar&qpos;,
data: [5, 20, 36, 10, 10, 20]
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
// 处理点击事件并且弹出数据名称
myChart.on(&qpos;click&qpos;, function (params) {
alert(params.name);
});
尝试一下 »
所有的鼠标事件包含参数 params,这是一个包含点击图形的数据信息的对象,格式如下:
{ // 当前点击的图形元素所属的组件名称, // 其值如 &qpos;series&qpos;、&qpos;markLine&qpos;、&qpos;markPoint&qpos;、&qpos;timeLine&qpos; 等。 componentType: string, // 系列类型。值可能为:&qpos;line&qpos;、&qpos;bar&qpos;、&qpos;pie&qpos; 等。当 componentType 为 &qpos;series&qpos; 时有意义。 seriesType: string, // 系列在传入的 option.series 中的 index。当 componentType 为 &qpos;series&qpos; 时有意义。 seriesIndex: number, // 系列名称。当 componentType 为 &qpos;series&qpos; 时有意义。 seriesName: string, // 数据名,类目名 name: string, // 数据在传入的 data 数组中的 index dataIndex: number, // 传入的原始数据项 data: Object, // sankey、graph 等图表同时含有 nodeData 和 edgeData 两种 data, // dataType 的值会是 &qpos;node&qpos; 或者 &qpos;edge&qpos;,表示当前点击在 node 还是 edge 上。 // 其他大部分图表中只有一种 data,dataType 无意义。 dataType: string, // 传入的数据值 value: number|Array // 数据图形的颜色。当 componentType 为 &qpos;series&qpos; 时有意义。 color: string }
如何区分鼠标点击到了哪里:
myChart.on(&qpos;click&qpos;, function (params) { if (params.componentType === &qpos;markPoint&qpos;) { // 点击到了 markPoint 上 if (params.seriesIndex === 5) { // 点击到了 index 为 5 的 series 的 markPoint 上。 } } else if (params.componentType === &qpos;series&qpos;) { if (params.seriesType === &qpos;graph&qpos;) { if (params.dataType === &qpos;edge&qpos;) { // 点击到了 graph 的 edge(边)上。 } else { // 点击到了 graph 的 node(节点)上。 } } } });
使用 query 只对指定的组件的图形元素的触发回调:
chart.on(eventName, query, handler);
query 可为 string 或者 Object。
如果为 string 表示组件类型。格式可以是 &qpos;mainType&qpos; 或者 &qpos;mainType.subType&qpos;。例如:
chart.on(&qpos;click&qpos;, &qpos;series&qpos;, function () {...}); chart.on(&qpos;click&qpos;, &qpos;series.line&qpos;, function () {...}); chart.on(&qpos;click&qpos;, &qpos;dataZoom&qpos;, function () {...}); chart.on(&qpos;click&qpos;, &qpos;xAxis.category&qpos;, function () {...});
如果为 Object,可以包含以下一个或多个属性,每个属性都是可选的:
{ <mainType>Index: number // 组件 index <mainType>Name: string // 组件 name <mainType>Id: string // 组件 id dataIndex: number // 数据项 index name: string // 数据项 name dataType: string // 数据项 type,如关系图中的 &qpos;node&qpos;, &qpos;edge&qpos; element: string // 自定义系列中的 el 的 name }
例如:
chart.setOption({ // ... series: [{ name: &qpos;uuu&qpos; // ... }] }); chart.on(&qpos;mouseover&qpos;, {seriesName: &qpos;uuu&qpos;}, function () { // series name 为 &qpos;uuu&qpos; 的系列中的图形元素被 &qpos;mouseover&qpos; 时,此方法被回调。 });
例如:
chart.setOption({ // ... series: [{ // ... }, { // ... data: [ {name: &qpos;xx&qpos;, value: 121}, {name: &qpos;yy&qpos;, value: 33} ] }] }); chart.on(&qpos;mouseover&qpos;, {seriesIndex: 1, name: &qpos;xx&qpos;}, function () { // series index 1 的系列中的 name 为 &qpos;xx&qpos; 的元素被 &qpos;mouseover&qpos; 时,此方法被回调。 });
例如:
chart.setOption({ // ... series: [{ type: &qpos;graph&qpos;, nodes: [{name: &qpos;a&qpos;, value: 10}, {name: &qpos;b&qpos;, value: 20}], edges: [{source: 0, target: 1}] }] }); chart.on(&qpos;click&qpos;, {dataType: &qpos;node&qpos;}, function () { // 关系图的节点被点击时此方法被回调。 }); chart.on(&qpos;click&qpos;, {dataType: &qpos;edge&qpos;}, function () { // 关系图的边被点击时此方法被回调。 });
例如:
chart.setOption({ // ... series: { // ... type: &qpos;custom&qpos;, renderItem: function (params, api) { return { type: &qpos;group&qpos;, children: [{ type: &qpos;circle&qpos;, name: &qpos;my_el&qpos;, // ... }, { // ... }] } }, data: [[12, 33]] } }) chart.on(&qpos;mouseup&qpos;, {element: &qpos;my_el&qpos;}, function () { // name 为 &qpos;my_el&qpos; 的元素被 &qpos;mouseup&qpos; 时,此方法被回调。 });
你可以在回调函数中获得这个对象中的数据名、系列名称后在自己的数据仓库中索引得到其它的信息候更新图表,显示浮层等等,如下示例代码:
实例
$.get(&qpos;detail?q=&qpos; + params.name, function (detail) {
myChart.setOption({
series: [{
name: &qpos;pie&qpos;,
// 通过饼图表现单个柱子中的数据分布
data: [detail.data]
}]
});
});
});
组件交互的行为事件
在 ECharts 中基本上所有的组件交互行为都会触发相应的事件,常用的事件和事件对应参数在 events 文档中有列出。
下面是监听一个图例开关的示例:
实例
myChart.on(&qpos;legendselectchanged&qpos;, function (params) {
// 获取点击图例的选中状态
var isSelected = params.selected[params.name];
// 在控制台中打印
console.log((isSelected ? &qpos;选中了&qpos; : &qpos;取消选中了&qpos;) + &qpos;图例&qpos; + params.name);
// 打印所有图例的状态
console.log(params.selected);
});
尝试一下 »
代码触发 ECharts 中组件的行为
上面我们只说明了用户的交互操作,但有时候我们也会需要在程序里调用方法并触发图表的行为,比如显示 tooltip。
ECharts 通过 dispatchAction({ type: &qpos;&qpos; }) 来触发图表行为,统一管理了所有动作,也可以根据需要去记录用户的行为路径。
以上实例用于轮播饼图中的 tooltip:
实例
var dataLen = option.series[0].data.length;
// 取消之前高亮的图形
myChart.dispatchAction({
type: &qpos;downplay&qpos;,
seriesIndex: 0,
dataIndex: app.currentIndex
});
app.currentIndex = (app.currentIndex + 1) % dataLen;
// 高亮当前图形
myChart.dispatchAction({
type: &qpos;highlight&qpos;,
seriesIndex: 0,
dataIndex: app.currentIndex
});
// 显示 tooltip
myChart.dispatchAction({
type: &qpos;showTip&qpos;,
seriesIndex: 0,
dataIndex: app.currentIndex
});
}, 1000);
尝试一下 »