版本:V5.3.3
背景
本文浅析ECharts的事件系统是如何工作的,点击一个series之后,ECharts是如何执行的回调方法,非series元素是否可以设置事件,事件回调又是如何做性能优化的。

源码
事件代理
zrender.ts —zrender.ts#L127-L128
在zrender的构造函数中 注册了事件代理
1  | constructor(id: number, dom?: HTMLElement, opts?: ZRenderInitOpt) {  | 
在事件代理中装载了本地事件的监听
1  | export default class HandlerDomProxy extends Eventful {  | 
将DOM的鼠标或触摸事件全部代理至图形元素上
1  | // 事件名称列表  | 
事件分发
具体的事件触发
1  | // 事件回调列表  | 
触发事件
1  | trigger<EvtNm extends keyof EvtDef>(  | 
通用事件
1  | util.each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name: HandlerName) {  | 
事件对象确认
1  | findHover(x: number, y: number, exclude?: Displayable): HoveredResult {  | 
事件分发
1  | /**  | 
回调执行
1  | private _initEvents(): void {  | 
小结
ECharts首先构建了一个handerProxy事件代理器将Dom的事件代理至ECharts内部的元素。当对应的事件触发是会通过findHover来获取触发事件的元素,如果元素为非静默模式(SILENT)将会在该元素上对事件进行向上冒泡,最终冒泡至ECharts对象。ECharts对象会根据触发事件的对象来获取ECharts Data,如果触发事件的对象确定包含ECharts Data则会在最外层的Dom上抛出所对应的事件。至此完成整个事件冒泡。