我如何通过DOM容器访问Highcharts图表


85

当我向div容器渲染highcharts-chart图表时,如何通过div-Container访问图表对象?我不想使图表变量全局。

        var chart = new Highcharts.Chart({
            chart: {
                renderTo: "testDivId",
                                ...

我想像这样(伪代码)访问以上上下文之外的图表,以调用函数:

var chart = Highcharts.Chart("testDivId"); //access from id
chart.redraw();

Answers:


139

高图3.0.1

用户可以使用highcharts插件

var chart=$("#container").highcharts();

高图2.3.4

Highcharts.charts数组中读取(对于2.3.4版和更高版本),可以从图表上的数据中找到图表的索引。<div>

 var index=$("#container").data('highchartsChart');
 var chart=Highcharts.charts[index];

所有版本

通过容器ID在全局对象/地图中跟踪图表

var window.charts={}; 
function foo(){
  new Highcharts.Chart({...},function(chart){  
      window.charts[chart.options.chart.renderTo] = chart;
  });
}

function bar(){
  var chart=window.charts["containerId"];
}

读取模式@ Highcharts技巧-从容器ID访问图表对象

聚苯乙烯

自编写此答案以来,在较新版本的Highcharts中进行了一些添加,这些内容来自@ davertron,@ Moes和@Przy的答案,请对他们的评论/答案进行投票,因为他们值得为此给予好评。如果没有这些,将它们添加到此处是不完整的


10
从2.3.4版开始,Highcharts确实会跟踪页面上的所有图表:api.highcharts.com/highcharts#Highcharts
davertron 2013年

@davertron感谢您的更新...多数民众赞成在拥有一个不错的功能,不要认为需要太多代码/努力...
Jugal Thakkar 2013年

+1为$(“#container”)。data('highchartsChart')作为highcharts索引。这非常有用,谢谢!
Shahar

1
我可以使用类似的方法处理高库存吗?
tnkh

45

你可以这样做

var chart = $("#testDivId").highcharts();

检查提琴手的例子


它对我不起作用,我不得不使用@Frzy答案。我正在使用版本4.1.4
David Torres

不知道为什么它对您不起作用小提琴示例使用v4.2.3
Nerdroid

1
它返回的是容器元素而不是图表,这就是@Frzy答案起作用的原因。另外,我找到了另一个解决方案:$("#testDivId").highcharts({...}, function(chart) {...});
大卫·托雷斯

单击按钮后肯定会返回对象jsfiddle.net/abbasmhd/86hLvc5s检查控制台输出
Nerdroid

1
是的,我同意在jsfiddle中这样做。但是,并非每个人的工作都一样,正如@Frzy答案的11个投票所看到的那样
David Torres

22
var $chartCont = $('#container').highcharts({...}),
    chartObj = Highcharts.charts[$chartCont.data('highchartsChart')];

chartCont是jQuery对象。chartObj是Highchart图表对象。

这是使用Highcharts 3.01


9

我找到了另一种方法...主要是因为我使用的是嵌入在OutSystems平台中的Highcharts,而且我没有控制图表创建方式的方法。

我发现的方式如下:

  1. 使用className属性为图表提供识别类

    chart: {
        className: 'LifeCycleMasterChart'
    }
    
  2. 定义一个辅助函数以按类名称获取图表

    function getChartReferenceByClassName(className) {
    var cssClassName = className;
    var foundChart = null;
    
    $(Highcharts.charts).each(function(i,chart){    
        if(chart.container.classList.contains(cssClassName)){
            foundChart = chart;
            return;
        }
    });
    
    return foundChart;
    

    }

  3. 在需要的地方使用辅助功能

    var detailChart = getChartReferenceByClassName('LifeCycleDetailChart');
    

希望对您有帮助!


9

只需使用纯JS:

var obj = document.getElementById('#container')
    Highcharts.charts[obj.getAttribute('data-highcharts-chart')];

4
var chart1; // globally available
$(document).ready(function() {
      chart1 = new Highcharts.Chart({
         chart: {
            renderTo: 'container',
            type: 'bar'
         },
         title: {
            text: 'Fruit Consumption'
         },
         xAxis: {
            categories: ['Apples', 'Bananas', 'Oranges']
         },
         yAxis: {
            title: {
               text: 'Fruit eaten'
            }
         },
         series: [{
            name: 'Jane',
            data: [1, 0, 4]
         }, {
            name: 'John',
            data: [5, 7, 3]
         }]
      });
   });

var chart1是全局的,因此无论容器是什么,都可以用来访问de highchart对象

chart1.redraw();

4

没有jQuery(香草js):

let chartDom = document.getElementById("testDivId");
let chart = Highcharts.charts[Highcharts.attr(chartDom, 'data-highcharts-chart')]


1

@elo的答案是正确的,尽管我不得不整理一下以使其更清楚:

const myChartEl = document.getElementById('the-id-name');
const myChart = Highcharts.charts[myChartEl.getAttribute('data-highcharts-chart')];

myChart然后变成一个实时的Highcharts对象,该对象暴露出呈现在图表中的当前所有道具myChartEl。由于myChartHighcharts对象,因此可以在其后链接原型方法,对其进行扩展或引用。

myChart.getTable();
myChart.downloadXLS();
setTimeout(() => Highcharts.fireEvent(myChart, "redraw"), 10);

也可以myChart通过插件获得.highcharts()jQuery插件:

var myChart = $("#the-id-name").highcharts();

上面的jQuery插件方法需要jQuery在使用插件之前加载,当然也需要插件本身。正是由于缺少此插件,​​我才开始寻找其他方法来使用纯香草JavaScript完成相同的任务。

通过使用纯JS方法,我无需依赖即可完成我需要的工作(第二个代码段)jQuery

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.