Bir DOM-Container aracılığıyla bir Highcharts grafiğine nasıl erişebilirim?


84

Bir yüksek çizelge grafiğini bir div kapsayıcısına işlediğimde, çizelge nesnesine div-Container aracılığıyla nasıl erişebilirim?

Grafik değişkenini global yapmak istemiyorum.

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

İşlevleri çağırmak için grafiğe yukarıdaki bağlamın dışında (sözde kod) erişmek istiyorum:

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

Yanıtlar:


140

Highcharts 3.0.1

Kullanıcılar highcharts eklentisini kullanabilir

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

Önemli grafikler 2.3.4

2.3.4 ve sonraki sürümler için Highcharts.charts dizisinden okuyun , grafiğin dizini aşağıdaki verilerden bulunabilir:<div>

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

Tüm versiyonlar

Global bir nesnede / haritadaki grafikleri konteyner kimliğine göre izleyin

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

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

Okuma Modu @ Highcharts İpuçları - Bir Kapsayıcı Kimliğinden Grafik Nesnesine Erişme

PS

Bu cevabı yazdıktan sonra Highcharts'ın yeni sürümlerinde bazı eklemeler yapıldı ve @davertron, @Moes ve @Przy'den alınan cevaplardan alındı, lütfen bunların övgüsünü hak ettikleri için yorumlarını / cevaplarını yükseltin . Bunları buraya eklemek, bu kabul edilen cevap bunlar olmadan eksik olacaktır


10
Görünüşe göre 2.3.4 sürümünden itibaren Highcharts, sayfadaki tüm çizelgeleri takip ediyor: api.highcharts.com/highcharts#Highcharts
davertron

@davertron güncelleme için teşekkürler ... bu güzel bir özellik, buna sahip olmak için çok fazla kod / çaba gerektiğini düşünmeyin ...
Jugal Thakkar

$ ("# Container"). Data ('highchartsChart') için yüksek grafikler dizini olarak +1. çok kullanışlı, teşekkürler!
Shahar

1
Highstock için kullanabileceğim benzer bir yöntem var mı?
tnkh

45

Bunu yapabilirsiniz

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

kemancıdaki örneği kontrol et


Benim için işe yaramadı, @ Frzy cevabını kullanmak zorunda kaldım. 4.1.4 sürümünü kullanıyorum
David Torres

sizin için neden işe yaramadığından emin değilim, keman örneği v4.2.3'ü kullanıyor
Nerdroid

1
Grafik yerine konteyner elemanını döndürüyor ve bu yüzden @ Frzy cevabı işe yaradı. Ayrıca başka bir çözüm buldum:$("#testDivId").highcharts({...}, function(chart) {...});
David Torres

kesinlikle nesneyi döndürüyor jsfiddle.net/abbasmhd/86hLvc5s düğmeyi tıkladıktan sonra konsol çıktısını kontrol edin
Nerdroid

1
Evet, jsfiddle'da bunu yapıyor, katılıyorum. Ancak, @ Frzy cevabının 11 olumlu oyunda görebileceğiniz gibi, herkes için aynı şekilde çalışmıyor
David Torres

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

chartCont jQuery Nesnesidir. chartObj, Highchart Grafik Nesnesidir.

Bu Highcharts 3.01 kullanıyor


10

Basitçe saf JS ile:

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

9

Bunu yapmanın başka bir yolunu buldum ... esas olarak OutSystems Platformuna gömülü Highcharts kullanıyorum ve grafiklerin yaratılma şeklini kontrol etmenin bir yolu yok.

Bulduğum yol şuydu:

  1. classNameÖzniteliği kullanarak grafiğe tanımlayıcı bir sınıf verin

    chart: {
        className: 'LifeCycleMasterChart'
    }
    
  2. Grafiği sınıf adına göre almak için yardımcı bir işlev tanımlayın

    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. Yardımcı işlevi ihtiyaç duyduğunuz her yerde kullanın

    var detailChart = getChartReferenceByClassName('LifeCycleDetailChart');
    

Umarım size yardımcı olur!


5

JQuery (vanilya js) olmadan:

let chartDom = document.getElementById("testDivId");
let chart = Highcharts.charts[Highcharts.attr(chartDom, '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 globaldir, böylece highchart nesnesine erişmek için kullanabilirsiniz, konteynerin ne olduğu önemli değildir

chart1.redraw();

2

... ve bir meslektaşın yardımıyla ... bunu yapmanın daha iyi bir yolu ...

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

    return foundChart;
}

1

@elo'nun yanıtı doğru ve olumlu oy verildi, ancak daha net hale getirmek için biraz düzeltmem gerekti:

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

myChartDaha sonra canlı hale Highcharts tüm güncel sahne işlenen oluyor grafikte sunmak olduğunu ortaya çıkarır nesne myChartEl. Yana myCharta, Highcharts amacı, tek bir teneke kutu zincir prototip yöntemleri sağ sonra uzatmak ya da bakınız.

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

Bir de alabilirsiniz myChartaracılığıyla .highcharts()bir olan jQueryeklenti:

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

Yukarıdaki jQueryeklenti yaklaşımı jQuery, eklenti kullanılmadan önce ve tabii ki eklentinin kendisinin yüklenmesini gerektirir . Aynı şeyi saf vanilya JavaScript ile başarmanın alternatif yollarını aramama neden olan şey bu eklentinin yokluğuydu.

Saf JS yaklaşımını kullanarak, ihtiyacım olanı (ikinci kod parçacığı) şunlara güvenmek zorunda kalmadan yapabildimjQuery :

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.