1
0

cahrts.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. const loopShowTooltip = function (chart, chartOption, options) {
  2. var defaultOptions = {
  3. interval: 3000,
  4. loopSeries: true,
  5. seriesIndex: 0,
  6. updateData: null,
  7. };
  8. if (!chart) {
  9. return {};
  10. }
  11. if (!chartOption) {
  12. chartOption = chart.getOption();
  13. }
  14. var dataIndex = 0; // 数据索引,初始化为-1,是为了判断是否是第一次执行
  15. var seriesIndex = 0; // 系列索引
  16. var timeTicket = 0;
  17. var seriesLen = chartOption.series.length; // 系列个数
  18. var dataLen = 0; // 某个系列数据个数
  19. var chartType; // 系列类型
  20. var first = true;
  21. // 不循环series时seriesIndex指定显示tooltip的系列,不指定默认为0,指定多个则默认为第一个
  22. // 循环series时seriesIndex指定循环的series,不指定则从0开始循环所有series,指定单个则相当于不循环,指定多个
  23. // 要不要添加开始series索引和开始的data索引?
  24. if (options) {
  25. options.interval = options.interval || defaultOptions.interval;
  26. options.loopSeries = options.loopSeries || defaultOptions.loopSeries;
  27. options.seriesIndex = options.seriesIndex || defaultOptions.seriesIndex;
  28. options.updateData = options.updateData || defaultOptions.updateData;
  29. } else {
  30. options = defaultOptions;
  31. }
  32. // 如果设置的seriesIndex无效,则默认为0
  33. if (options.seriesIndex < 0 || options.seriesIndex >= seriesLen) {
  34. seriesIndex = 0;
  35. } else {
  36. seriesIndex = options.seriesIndex;
  37. }
  38. function autoShowTip() {
  39. function showTip() {
  40. // 判断是否更新数据
  41. if (
  42. dataIndex === 0 &&
  43. !first &&
  44. typeof options.updateData === 'function'
  45. ) {
  46. options.updateData();
  47. chart.setOption(chartOption);
  48. }
  49. var series = chartOption.series;
  50. chartType = series[seriesIndex].type; // 系列类型
  51. dataLen = series[seriesIndex].data.length; // 某个系列的数据个数
  52. var tipParams = { seriesIndex: seriesIndex };
  53. switch (chartType) {
  54. case 'map':
  55. case 'pie':
  56. case 'chord':
  57. tipParams.name = series[seriesIndex].data[dataIndex].name;
  58. break;
  59. case 'radar': // 雷达图
  60. tipParams.seriesIndex = seriesIndex;
  61. tipParams.dataIndex = dataIndex;
  62. break;
  63. default:
  64. tipParams.dataIndex = dataIndex;
  65. break;
  66. }
  67. if (chartType === 'pie' || chartType === 'radar') {
  68. // 取消之前高亮的图形
  69. chart.dispatchAction({
  70. type: 'downplay',
  71. seriesIndex: options.loopSeries
  72. ? seriesIndex === 0
  73. ? seriesLen - 1
  74. : seriesIndex - 1
  75. : seriesIndex,
  76. dataIndex: dataIndex === 0 ? dataLen - 1 : dataIndex - 1,
  77. });
  78. // 高亮当前图形
  79. chart.dispatchAction({
  80. type: 'highlight',
  81. seriesIndex: seriesIndex,
  82. dataIndex: dataIndex,
  83. });
  84. }
  85. // 显示 tooltip
  86. tipParams.type = 'showTip';
  87. chart.dispatchAction(tipParams);
  88. dataIndex = (dataIndex + 1) % dataLen;
  89. if (options.loopSeries && dataIndex === 0 && !first) {
  90. // 数据索引归0表示当前系列数据已经循环完
  91. seriesIndex = (seriesIndex + 1) % seriesLen;
  92. }
  93. first = false;
  94. }
  95. showTip();
  96. timeTicket = setInterval(showTip, options.interval);
  97. }
  98. // 关闭轮播
  99. function stopAutoShow() {
  100. if (timeTicket) {
  101. clearInterval(timeTicket);
  102. timeTicket = 0;
  103. if (chartType === 'pie' || chartType === 'radar') {
  104. // 取消高亮的图形
  105. chart.dispatchAction({
  106. type: 'downplay',
  107. seriesIndex: options.loopSeries
  108. ? seriesIndex === 0
  109. ? seriesLen - 1
  110. : seriesIndex - 1
  111. : seriesIndex,
  112. dataIndex: dataIndex === 0 ? dataLen - 1 : dataIndex - 1,
  113. });
  114. }
  115. }
  116. }
  117. var zRender = chart.getZr();
  118. function zRenderMouseMove(param) {
  119. if (param.event) {
  120. // 阻止canvas上的鼠标移动事件冒泡
  121. param.event.cancelBubble = true;
  122. }
  123. stopAutoShow();
  124. }
  125. // 离开echarts图时恢复自动轮播
  126. function zRenderGlobalOut() {
  127. if (!timeTicket) {
  128. autoShowTip();
  129. }
  130. }
  131. // 鼠标在echarts图上时停止轮播
  132. chart.on('mousemove', stopAutoShow);
  133. zRender.on('mousemove', zRenderMouseMove);
  134. zRender.on('globalout', zRenderGlobalOut);
  135. autoShowTip();
  136. return {
  137. clearLoop: function () {
  138. if (timeTicket) {
  139. clearInterval(timeTicket);
  140. timeTicket = 0;
  141. }
  142. chart.off('mousemove', stopAutoShow);
  143. zRender.off('mousemove', zRenderMouseMove);
  144. zRender.off('globalout', zRenderGlobalOut);
  145. },
  146. };
  147. };
  148. export default loopShowTooltip;