实现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
相关产品推荐
相关产品推荐

