You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Highcharts导出图片时显示加载Spinner的实现及相关事件咨询

Highcharts导出时显示加载Spinner及相关事件实现

没问题!要在Highcharts导出图片时显示加载Spinner,或者监听导出开始/完成的事件,其实有几种靠谱的实现方式,我给你详细拆解:

一、利用Highcharts内置事件实现Spinner(推荐,适合v7.0.0+版本)

Highcharts从v7.0.0开始提供了专门的导出相关事件,我们可以直接利用这些事件来控制Spinner的显示和隐藏:

1. 先添加Spinner的DOM和样式

首先在页面里加入一个隐藏的加载提示元素(可以换成你自己的Spinner图标样式):

<div id="export-spinner" style="display:none; position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); padding:12px 24px; background:rgba(0,0,0,0.7); color:white; border-radius:4px; z-index:9999;">
  正在导出图表,请稍候...
</div>

2. 修改图表配置,监听导出事件

在你的Highcharts配置里,添加chart.events来监听exportStart和exportEnd事件,同时保留你原有的导出按钮配置:

Highcharts.chart('your-chart-container', {
  chart: {
    events: {
      // 导出开始时显示Spinner
      exportStart: function() {
        document.getElementById('export-spinner').style.display = 'block';
      },
      // 导出完成(无论成功/失败)时隐藏Spinner
      exportEnd: function() {
        document.getElementById('export-spinner').style.display = 'none';
      }
    }
  },
  exporting: {
    allowHTML: true,
    buttons: {
      contextButton: {
        menuItems: null,
        onclick: function () {
          this.exportChart({ 
            sourceWidth: 1500, 
            sourceHeight: this.chartHeight 
          }, null);
        },
        symbol: 'url(assets/images/icon_download.png)'
      }
    }
  },
  // 其他图表配置...
});

二、手动控制导出流程(兼容旧版本,更灵活)

如果你的Highcharts版本低于v7.0.0,没有内置的导出事件,可以手动接管导出流程,通过Promise来控制Spinner的显示:

修改导出按钮的onclick函数,自己处理SVG生成、导出请求和下载逻辑:

exporting: {
  allowHTML: true,
  buttons: {
    contextButton: {
      menuItems: null,
      onclick: async function () {
        const spinner = document.getElementById('export-spinner');
        spinner.style.display = 'block';
        
        try {
          // 1. 获取图表的SVG字符串
          const svg = this.getSVG({
            sourceWidth: 1500,
            sourceHeight: this.chartHeight
          });
          
          // 2. 调用Highcharts官方导出服务(也可以换成自己的导出服务器)
          const response = await fetch('https://export.highcharts.com/', {
            method: 'POST',
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded'
            },
            // 这里的参数可以调整:type支持png/jpeg/pdf/svg等,filename是下载的文件名
            body: `svg=${encodeURIComponent(svg)}&type=png&width=1500&filename=my-chart`
          });
          
          // 3. 处理下载
          const blob = await response.blob();
          const downloadUrl = URL.createObjectURL(blob);
          const link = document.createElement('a');
          link.href = downloadUrl;
          link.download = 'my-chart.png';
          link.click();
          URL.revokeObjectURL(downloadUrl);
        } catch (error) {
          console.error('导出失败:', error);
          alert('图表导出失败,请稍后重试');
        } finally {
          // 无论成功失败,都隐藏Spinner
          spinner.style.display = 'none';
        }
      },
      symbol: 'url(assets/images/icon_download.png)'
    }
  }
}

三、可订阅的导出相关事件

除了上面用到的exportStart和exportEnd,Highcharts还提供了这些导出相关的事件:

  • beforeExport: 在导出流程开始前触发,可以用来修改图表配置(比如临时隐藏某些元素)
  • exportData: 当导出数据表格时触发(如果你开启了数据导出功能)

这些事件都可以在chart.events里进行监听,用法和exportStart一致。

内容的提问来源于stack exchange,提问作者GroThar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:02:52