版本: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
上抛出所对应的事件。至此完成整个事件冒泡。