Як я можу отримати доступ до діаграми Highcharts через DOM-контейнер


85

Коли я відображаю діаграму високих діаграм до контейнера div, як я можу отримати доступ до об'єкта діаграми через div-Container? я не хочу робити змінну діаграми глобальною.

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

Я хочу отримати доступ до діаграми поза контекстом вище, як це (псевдокод), щоб викликати функції:

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

Відповіді:


139

Highcharts 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];

Всі версії

Відстежуйте діаграми в глобальному об’єкті / карті за ідентифікатором контейнера

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 Поради - Доступ до об'єкта діаграми з ідентифікатора контейнера

PS

Деякі доповнення були внесені в новіші версії Highcharts з моменту написання цієї відповіді, і вони були взяті з відповідей @davertron, @Moes та @Przy, будь ласка, проголосуйте за їхні коментарі / відповіді, оскільки вони заслуговують на те, щоб заслужити їх. Додавання їх сюди, оскільки ця прийнята відповідь була б неповною без них


10
Схоже, станом на версію 2.3.4 Highcharts відстежує всі діаграми на сторінці: api.highcharts.com/highcharts#Highcharts
davertron

@davertron дякую за оновлення ... це приємна особливість, не думайте, що для цього потрібно було робити багато коду / зусиль ...
Jugal Thakkar

+1 за $ ("# контейнер"). Data ('highchartsChart') як індекс highcharts. це дуже корисно, дякую!
Шахар

1
Будь-який подібний метод, який я міг би використати для високої худоби?
tnkh

45

Ви можете це зробити

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

перевірте приклад на скрипці


У мене це не спрацювало, мені довелося скористатися відповіддю @Frzy. Я використовую версію 4.1.4
Девід Торрес,

не впевнений, чому у вас це не вийшло, на прикладі скрипки використовується v4.2.3
Nerdroid

1
Він повертає елемент контейнера замість діаграми, і тому відповідь @Frzy спрацювала. Крім того, я знайшов ще одне рішення:$("#testDivId").highcharts({...}, function(chart) {...});
Девід Торрес

це точно повертає об’єкт jsfiddle.net/abbasmhd/86hLvc5s перевіряє вихід консолі після натискання кнопки
Nerdroid

1
Так, у jsfiddle це робить, я згоден. Але не для всіх працює однаково, як ви можете бачити за 11-ма голосами відповіді @Frzy
Девід Торрес

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

chartCont - це jQuery Object. chartObj - це об'єкт діаграми Highchart.

Це використовує Highcharts 3.01


9

Я знайшов інший спосіб зробити це ... головним чином тому, що я використовую Highcharts, які вбудовані в OutSystems Platform, і я не маю можливості контролювати спосіб створення діаграм.

Я знайшов такий спосіб:

  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')]

2

... і за допомогою колеги ... кращий спосіб це зробити ...

getChartReferenceByClassName(className) {
    var foundChart = $('.' + className + '').eq(0).parent().highcharts();

    return foundChart;
}

1

Відповідь @elo є правильною і прихильною, хоча мені довелося трохи привести її в порядок, щоб вона стала зрозумілішою:

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

myChartпотім стає активним об'єктом Highcharts, який виставляє всі поточні реквізити, наявні на діаграмі, яка відображається в myChartEl. Оскільки myChartце об'єкт Highcharts , можна зв'язати прототипи методів відразу після нього, розширити його або звернутися до нього.

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

Можна також отримати myChartчерез .highcharts(), який є jQueryплагін:

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

Наведений вище підхід до jQueryплагінів вимагає jQueryзавантаження перед використанням плагіна і, звичайно, самого плагіна. Саме відсутність цього плагіна змусило мене шукати альтернативні способи зробити те саме за допомогою чистого ванільного JavaScript.

За допомогою чистого підходу JS я зміг зробити те, що мені потрібно (другий фрагмент коду), не покладаючись наjQuery :

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.