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

实现Bootstrap下拉菜单具备Highcharts导航按钮的导出打印功能

解决方案:将Bootstrap下拉菜单与Highcharts导出功能绑定

没问题,这事儿其实很容易实现,咱们只需要把Bootstrap下拉菜单的点击事件和Highcharts内置的导出/打印方法关联起来,同时隐藏掉Highcharts默认的导出按钮就行。具体步骤如下:

步骤1:隐藏Highcharts默认导出按钮

在Highcharts的配置里,添加exporting配置项,把默认的上下文按钮禁用掉,避免界面上出现重复的功能按钮:

exporting: {
  buttons: {
    contextButton: {
      enabled: false // 隐藏自带的导出按钮
    }
  }
}

步骤2:给下拉菜单项添加动作标识

给每个下拉菜单的<a>标签添加data-action属性,对应Highcharts的导出动作名称,这样我们可以通过这个属性快速匹配对应的执行方法:

<li><a href="#" data-action="printChart">Print chart</a></li>
<li role="separator" class="divider"></li>
<li><a href="#" data-action="downloadPNG">Download PNG image</a></li>
<li><a href="#" data-action="downloadJPEG">Download JPEG image</a></li>
<li><a href="#" data-action="downloadPDF">Download PDF document</a></li>
<li><a href="#" data-action="downloadSVG">Download SVG vector image</a></li>
<li role="separator" class="divider"></li>
<li><a href="#" data-action="downloadCSV">Download CSV</a></li>
<li><a href="#" data-action="downloadXLS">Download XLS</a></li>
<li><a href="#" data-action="viewData">View data table</a></li>
<li><a href="#" data-action="openInCloud">Open in Highcharts Cloud</a></li>

步骤3:绑定点击事件并关联Highcharts方法

先获取Highcharts的图表实例,然后给下拉菜单项添加点击事件,根据data-action的值调用对应的Highcharts内置方法:

// 获取图表实例
const chart = Highcharts.chart('container', {
  // 你的图表配置...
});

// 绑定下拉菜单点击事件
$('.dropdown-menu a').on('click', function(e) {
  e.preventDefault(); // 阻止默认跳转行为
  const action = $(this).data('action');
  
  // 根据动作类型调用对应方法
  if (action && typeof chart[action] === 'function') {
    // 处理需要参数的导出动作
    if (action.startsWith('download')) {
      const typeMap = {
        downloadPNG: 'image/png',
        downloadJPEG: 'image/jpeg',
        downloadPDF: 'application/pdf',
        downloadSVG: 'image/svg+xml'
      };
      chart.exportChart({ type: typeMap[action] });
    } else if (action === 'openInCloud') {
      chart.exportChart({ type: 'highcharts-cloud' });
    } else {
      // 直接调用无参数的方法
      chart[action]();
    }
  }
});

完整可运行代码示例

修改后的HTML

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script src="https://code.highcharts.com/modules/export-data.js"></script>
<!------ Include the above in your HEAD tag ---------->
<div class="container">
  <div class="row">
    <div class="col-lg-8 col-md-8 col-xs-8">
      <div class="panel panel-default">
        <div class="panel-heading">
          <h3>Panel title
            <div class="btn-group pull-right">
              <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <span class="glyphicon glyphicon-th-large"></span></button>
              <ul class="dropdown-menu">
                <li><a href="#" data-action="printChart">Print chart</a></li>
                <li role="separator" class="divider"></li>
                <li><a href="#" data-action="downloadPNG">Download PNG image</a></li>
                <li><a href="#" data-action="downloadJPEG">Download JPEG image</a></li>
                <li><a href="#" data-action="downloadPDF">Download PDF document</a></li>
                <li><a href="#" data-action="downloadSVG">Download SVG vector image</a></li>
                <li role="separator" class="divider"></li>
                <li><a href="#" data-action="downloadCSV">Download CSV</a></li>
                <li><a href="#" data-action="downloadXLS">Download XLS</a></li>
                <li><a href="#" data-action="viewData">View data table</a></li>
                <li><a href="#" data-action="openInCloud">Open in Highcharts Cloud</a></li>
              </ul>
            </div>
          </h3>
        </div>
        <div class="panel-body">
          <div id="container"></div>
        </div>
      </div>
    </div>
  </div>
</div>

修改后的JavaScript

// 初始化图表并获取实例
const chart = Highcharts.chart('container', {
  title: {
    text: 'Solar Employment Growth by Sector, 2010-2016'
  },
  subtitle: {
    text: 'Source: thesolarfoundation.com'
  },
  yAxis: {
    title: {
      text: 'Number of Employees'
    }
  },
  legend: {
    layout: 'vertical',
    align: 'right',
    verticalAlign: 'middle'
  },
  plotOptions: {
    series: {
      label: {
        connectorAllowed: false
      },
      pointStart: 2010
    }
  },
  series: [{
    name: 'Installation',
    data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175]
  }, {
    name: 'Manufacturing',
    data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434]
  }, {
    name: 'Sales & Distribution',
    data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387]
  }, {
    name: 'Project Development',
    data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227]
  }, {
    name: 'Other',
    data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111]
  }],
  responsive: {
    rules: [{
      condition: {
        maxWidth: 500
      },
      chartOptions: {
        legend: {
          layout: 'horizontal',
          align: 'center',
          verticalAlign: 'bottom'
        }
      }
    }]
  },
  // 隐藏默认导出按钮
  exporting: {
    buttons: {
      contextButton: {
        enabled: false
      }
    }
  }
});

// 绑定下拉菜单点击事件
$('.dropdown-menu a').on('click', function(e) {
  e.preventDefault();
  const action = $(this).data('action');
  
  if (action && typeof chart[action] === 'function') {
    // 处理需要参数的导出动作
    if (action.startsWith('download')) {
      const typeMap = {
        downloadPNG: 'image/png',
        downloadJPEG: 'image/jpeg',
        downloadPDF: 'application/pdf',
        downloadSVG: 'image/svg+xml'
      };
      chart.exportChart({ type: typeMap[action] });
    } else if (action === 'openInCloud') {
      chart.exportChart({ type: 'highcharts-cloud' });
    } else {
      // 直接调用无参数方法
      chart[action]();
    }
  }
});

这样修改之后,点击Bootstrap下拉菜单里的选项,就会触发和Highcharts默认导航按钮完全一致的功能啦!

内容的提问来源于stack exchange,提问作者Kees de Jager

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:09:52