echarts tooltip轮播

新建loopShowTooltip.js并引入引入

import { loopShowTooltip } from "../../../utils/loopShowTooltip.js"

loopShowTooltip.js文件

/**
 * echarts tooltip轮播
 * @param chart ECharts实例
 * @param chartOption echarts的配置信息
 * @param options object 选项
 * {
 *  interval    轮播时间间隔,单位毫秒,默认为2000
 *  loopSeries  boolean类型,默认为false。
 *              true表示循环所有series的tooltip,false则显示指定seriesIndex的tooltip
 *  seriesIndex 默认为0,指定某个系列(option中的series索引)循环显示tooltip,
 *              当loopSeries为true时,从seriesIndex系列开始执行。
 *  updateData  自定义更新数据的函数,默认为null;
 *              用于类似于分页的效果,比如总数据有20条,chart一次只显示5条,全部数据可以分4次显示。
 * }
 * @returns {{clearLoop: clearLoop}|undefined}
 */
export function loopShowTooltip(chart, chartOption, options) {
    let defaultOptions = {
        interval: 2000,
        loopSeries: false,
        seriesIndex: 0,
        updateData: null,
        shunXu: "zhengXu", //播放顺序 默认正序  zhengXu daoXu
    };

    if (!chart || !chartOption) {
        return;
    }
    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;
        options.zhengXu = options.zhengXu || defaultOptions.zhengXu;
    } else {
        options = defaultOptions;
    }




    let dataIndex = -1; // 数据索引,初始化为-1,是为了判断是否是第一次执行
    let seriesIndex = 0; // 系列索引
    let timeTicket = 0;
    let seriesLen = chartOption.series.length; // 系列个数
    let dataLen = 0; // 某个系列数据个数
    let chartType; // 系列类型
    let first = true;
    let lastShowSeriesIndex = 0;
    let lastShowDataIndex = 0;

    if (seriesLen === 0) {
        return;
    }

    // 待处理列表
    // 不循环series时seriesIndex指定显示tooltip的系列,不指定默认为0,指定多个则默认为第一个
    // 循环series时seriesIndex指定循环的series,不指定则从0开始循环所有series,指定单个则相当于不循环,指定多个
    // 要不要添加开始series索引和开始的data索引?


    // 如果设置的seriesIndex无效,则默认为0
    if (options.seriesIndex < 0 || options.seriesIndex >= seriesLen) {
        seriesIndex = 0;
    } else {
        seriesIndex = options.seriesIndex;
    }

    /**
     * 清除定时器
     */
    function clearLoop() {
        if (timeTicket) {
            clearInterval(timeTicket);
            timeTicket = 0;
        }

        chart.off('mousemove', stopAutoShow);
        zRender.off('mousemove', zRenderMouseMove);
        zRender.off('globalout', zRenderGlobalOut);
    }

    /**
     * 取消高亮
     */
    function cancelHighlight() {
        /**
         * 如果dataIndex为0表示上次系列完成显示,如果是循环系列,且系列索引为0则上次是seriesLen-1,否则为seriesIndex-1;
         * 如果不是循环系列,则就是当前系列;
         * 如果dataIndex>0则就是当前系列。
         */
        let tempSeriesIndex = dataIndex === 0 ? options.loopSeries ? seriesIndex === 0 ? seriesLen - 1 : seriesIndex -
            1 : seriesIndex : seriesIndex;
        let tempType = chartOption.series[tempSeriesIndex].type;

        if (tempType === 'pie' || tempType === 'radar' || tempType === 'map') {
            chart.dispatchAction({
                type: 'downplay',
                seriesIndex: lastShowSeriesIndex,
                dataIndex: lastShowDataIndex,
            }); // wait 系列序号为0且循环系列,则要判断上次的系列类型是否是pie、radar
        }
    }

    /**
     * 自动轮播tooltip
     */
    function autoShowTip() {
        let invalidSeries = 0;
        let invalidData = 0;

        function showTip() {
            // chart不在页面中时,销毁定时器
            let dom = chart.getDom();
            if (document !== dom && !document.documentElement.contains(dom)) {
                clearLoop();
                return;
            }

            // 判断是否更新数据
            if (
                dataIndex === 0 &&
                !first &&
                typeof options.updateData === 'function'
            ) {
                options.updateData();
                chart.setOption(chartOption);
            }

            let series = chartOption.series;
            let currSeries = series[seriesIndex];
            if (!series || series.length === 0 || !currSeries || !currSeries.type || !currSeries.data || !currSeries
                .data.length) {
                return;
            }

            chartType = currSeries.type; // 系列类型
            dataLen = currSeries.data.length; // 某个系列的数据个数

            let tipParams = {
                seriesIndex: seriesIndex
            };
            switch (chartType) {
                case 'pie':
                    // 处理饼图中数据为0或系列名为空的不显示tooltip
                    if (!currSeries.data[dataIndex].name || currSeries.data[dataIndex].name === '空' || !currSeries.data[
                            dataIndex].value) {
                        invalidData += 1;
                        dataIndex = (dataIndex + 1) % dataLen;
                        if (options.loopSeries && dataIndex === 0) {
                            // 数据索引归0表示当前系列数据已经循环完
                            // 无效数据个数个总数据个数相等,则该系列无效
                            if (invalidData === dataLen) {
                                invalidSeries += 1;
                            }

                            // 新系列,重置无效数据个数
                            invalidData = 0;

                            // 系列循环递增1
                            seriesIndex = (seriesIndex + 1) % seriesLen;
                            // 系列数循环至起始值时重置无效系列数
                            if (seriesIndex === options.seriesIndex) {
                                if (seriesLen !== invalidSeries) {
                                    // 下一次系列轮回,重置无效系列数
                                    invalidSeries = 0;
                                    showTip();
                                } else {
                                    // 下一次系列轮回,重置无效系列数
                                    invalidSeries = 0;
                                    clearLoop();
                                }
                            } else {
                                showTip();
                            }
                        } else if (!options.loopSeries && dataIndex === 0) {
                            if (dataLen !== invalidData) {
                                invalidData = 0;
                                showTip();
                            } else {
                                invalidData = 0;
                                clearLoop();
                            }
                        } else {
                            showTip();
                        }

                        return;
                    }
                    // eslint-disable-next-line no-fallthrough
                    case 'map':
                    case 'chord':
                        tipParams.name = currSeries.data[dataIndex].name;
                        break;
                    case 'radar': // 雷达图
                        tipParams.seriesIndex = seriesIndex;
                        // tipParams.dataIndex = dataIndex;
                        break;
                    case 'lines': // 线图地图上的lines忽略
                        dataIndex = 0;
                        seriesIndex = (seriesIndex + 1) % seriesLen;
                        invalidSeries++; // 记录无效系列数,如果无效系列数和系列总数相等则取消循环显示
                        if (seriesLen !== invalidSeries) {
                            showTip();
                        } else {
                            clearLoop();
                        }
                        return;
                    default:
                        tipParams.dataIndex = dataIndex;
                        break;
            }

            if (chartType === 'pie' || chartType === 'radar' || chartType === 'map') {
                if (!first) {
                    cancelHighlight();
                }

                // 高亮当前图形
                chart.dispatchAction({
                    type: 'highlight',
                    seriesIndex: seriesIndex,
                    dataIndex: dataIndex,
                });
            }

            // 显示 tooltip
            tipParams.type = 'showTip';
            chart.dispatchAction(tipParams);

            lastShowSeriesIndex = seriesIndex;
            lastShowDataIndex = dataIndex;

            //如果是倒序
            if (options.shunXu == "daoXu") {
                if (first) {
                    dataIndex = dataLen - 1;
                } else {
                    dataIndex--;
                    if (dataIndex < 0) {
                        dataIndex = dataLen - 1;
                    }
                }
            } else {
                dataIndex = (dataIndex + 1) % dataLen;
                if (options.loopSeries && dataIndex === 0) {
                    // 数据索引归0表示当前系列数据已经循环完
                    invalidData = 0;
                    seriesIndex = (seriesIndex + 1) % seriesLen;
                    if (seriesIndex === options.seriesIndex) {
                        invalidSeries = 0;
                    }
                }
            }
            if (options.loopSeries && dataIndex === 0) {
                // 数据索引归0表示当前系列数据已经循环完
                invalidData = 0;
                seriesIndex = (seriesIndex + 1) % seriesLen;
                if (seriesIndex === options.seriesIndex) {
                    invalidSeries = 0;
                }
            }

            first = false;
        }

        showTip();
        timeTicket = setInterval(showTip, options.interval);
    }



    // 关闭轮播
    function stopAutoShow() {
        if (timeTicket) {
            clearInterval(timeTicket);
            timeTicket = 0;

            if (chartType === 'pie' || chartType === 'radar' || chartType === 'map') {
                cancelHighlight();
            }
        }
    }
    //从头开始
    function Retart() {
        first = true;
        stopAutoShow()
        autoShowTip();
    }

    let zRender = chart.getZr();

    function zRenderMouseMove(param) {
        if (param.event) {
            // 阻止canvas上的鼠标移动事件冒泡
            // param.event.cancelBubble = true;
        }
        stopAutoShow();
    }

    // 离开echarts图时恢复自动轮播
    function zRenderGlobalOut() {
        // console.log("移出了")
        // console.log(timeTicket)
        if (!timeTicket) {
            autoShowTip();
        }
    }

    // 鼠标在echarts图上时停止轮播
    chart.on('mousemove', stopAutoShow);
    zRender.on('mousemove', zRenderMouseMove);
    zRender.on('globalout', zRenderGlobalOut);

    autoShowTip();

    return {
        Retart: Retart,
        clearLoop: clearLoop
    };
}

使用方法

showLoop() {
      this.tootipTimer && this.tootipTimer.clearLoop();
      this.tootipTimer = 0;
      // 调用轮播的方法
      // myChart为Echarts容器实例
      this.tootipTimer = loopShowTooltip(this.chartMap, this.option, {
        interval: 2000, // 轮播间隔时间
        loopSeries: true, // 是否开启轮播循环
        // shunXu: "daoXu", // 显示顺序
        // loopSeries: boolean类型,默认为false。true表示循环所有series的tooltip;false则显示指定seriesIndex的tooltip。
        // seriesIndex: 默认为0,指定某个系列(option中的series索引)循环显示tooltip,当loopSeries为true时,从seriesIndex系列开始执行。
      })
},
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容