123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- (function (global) {
- global.tools = global.tools || {};
- /**
- * echarts tooltip 自动轮播
- * @author liuyishi
- * @param chart
- * @param chartOption
- * @param options
- * {
- * interval 轮播时间间隔,单位毫秒,默认为2000
- * loopSeries boolean类型,默认为false。
- * true表示循环所有series的tooltip,false则显示指定seriesIndex的tooltip
- * seriesIndex 默认为0,指定某个系列(option中的series索引)循环显示tooltip,
- * 当loopSeries为true时,从seriesIndex系列开始执行.
- * }
- * @returns {{clearLoop: clearLoop}}
- */
- tools.loopShowTooltip = function (chart, chartOption, options) {
- var defaultOptions = {
- interval: 2000,
- loopSeries: false,
- seriesIndex: 0,
- updateData: null
- };
- if (!chart || !chartOption) {
- return {};
- }
- var dataIndex = 0; // 数据索引,初始化为-1,是为了判断是否是第一次执行
- var seriesIndex = 0; // 系列索引
- var timeTicket = 0;
- var seriesLen = chartOption.series.length; // 系列个数
- var dataLen = 0; // 某个系列数据个数
- var chartType; // 系列类型
- var first = true;
- // 不循环series时seriesIndex指定显示tooltip的系列,不指定默认为0,指定多个则默认为第一个
- // 循环series时seriesIndex指定循环的series,不指定则从0开始循环所有series,指定单个则相当于不循环,指定多个
- // 要不要添加开始series索引和开始的data索引?
- if (options) {
- options.interval = options.interval || defaultOptions.interval;
- options.loopSeries = options.loopSeries || defaultOptions.loopSeries;
- options.seriesIndex = options.seriesIndex || defaultOptions.seriesIndex;
- options.updateData = options.updateData || defaultOptions.updateData;
- } else {
- options = defaultOptions;
- }
- // 如果设置的seriesIndex无效,则默认为0
- if (options.seriesIndex < 0 || options.seriesIndex >= seriesLen) {
- seriesIndex = 0;
- } else {
- seriesIndex = options.seriesIndex;
- }
- function autoShowTip() {
- function showTip() {
- // 判断是否更新数据
- if (dataIndex === 0 && !first && typeof options.updateData === "function") {
- options.updateData();
- chart.setOption(chartOption);
- }
- var series = chartOption.series;
- chartType = series[seriesIndex].type; // 系列类型
- dataLen = series[seriesIndex].data.length; // 某个系列的数据个数
- var tipParams = {seriesIndex: seriesIndex};
- switch (chartType) {
- case 'map':
- case 'pie':
- case 'chord':
- tipParams.name = series[seriesIndex].data[dataIndex].name;
- break;
- case 'radar': // 雷达图
- tipParams.seriesIndex = seriesIndex;
- tipParams.dataIndex = dataIndex;
- break;
- default:
- tipParams.dataIndex = dataIndex;
- break;
- }
- if (chartType === 'pie' || chartType === 'radar') {
- // 取消之前高亮的图形
- chart.dispatchAction({
- type: 'downplay',
- seriesIndex: options.loopSeries ? (seriesIndex === 0 ? seriesLen - 1 : seriesIndex - 1) : seriesIndex,
- dataIndex: dataIndex === 0 ? dataLen - 1 : dataIndex - 1
- });
- // 高亮当前图形
- chart.dispatchAction({
- type: 'highlight',
- seriesIndex: seriesIndex,
- dataIndex: dataIndex
- });
- }
- // 显示 tooltip
- tipParams.type = 'showTip';
- chart.dispatchAction(tipParams);
- dataIndex = (dataIndex + 1) % dataLen;
- if (options.loopSeries && dataIndex === 0 && !first) { // 数据索引归0表示当前系列数据已经循环完
- seriesIndex = (seriesIndex + 1) % seriesLen;
- }
- first = false;
- }
- showTip();
- timeTicket = setInterval(showTip, options.interval);
- }
- // 关闭轮播
- function stopAutoShow() {
- if (timeTicket) {
- clearInterval(timeTicket);
- timeTicket = 0;
- if (chartType === 'pie' || chartType === 'radar') {
- // 取消高亮的图形
- chart.dispatchAction({
- type: 'downplay',
- seriesIndex: options.loopSeries ? (seriesIndex === 0 ? seriesLen - 1 : seriesIndex - 1) : seriesIndex,
- dataIndex: dataIndex === 0 ? dataLen - 1 : dataIndex - 1
- });
- }
- }
- }
- var zRender = chart.getZr();
- function zRenderMouseMove(param) {
- if (param.event) {
- // 阻止canvas上的鼠标移动事件冒泡
- param.event.cancelBubble = true;
- }
- stopAutoShow();
- }
- // 离开echarts图时恢复自动轮播
- function zRenderGlobalOut() {
- if (!timeTicket) {
- autoShowTip();
- }
- }
- // 鼠标在echarts图上时停止轮播
- chart.on('mousemove', stopAutoShow);
- zRender.on('mousemove', zRenderMouseMove);
- zRender.on('globalout', zRenderGlobalOut);
- autoShowTip();
- return {
- clearLoop: function () {
- if (timeTicket) {
- clearInterval(timeTicket);
- timeTicket = 0;
- }
- chart.off('mousemove', stopAutoShow);
- zRender.off('mousemove', zRenderMouseMove);
- zRender.off('globalout', zRenderGlobalOut);
- }
- };
- };
- })(window);
|