ฉันจะเข้าถึงแผนภูมิ Highcharts ผ่าน DOM-Container ได้อย่างไร


84

เมื่อฉันแสดงผลแผนภูมิสูงไปยังคอนเทนเนอร์ div ฉันจะเข้าถึงวัตถุแผนภูมิผ่าน div-Container ได้อย่างไร

ฉันไม่ต้องการให้ตัวแปรแผนภูมิเป็นแบบสากล

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

ฉันต้องการเข้าถึงแผนภูมินอกบริบทข้างต้นเช่นนี้ (pseudocode) เพื่อเรียกใช้ฟังก์ชัน:

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

คำตอบ:


140

ไฮชาร์ต 3.0.1

ผู้ใช้สามารถใช้ปลั๊กอินไฮชาร์ต

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"];
}

Read Mode @ Highcharts Tips - การเข้าถึงออบเจ็กต์แผนภูมิจาก ID คอนเทนเนอร์

ปล

มีการเพิ่มเติมบางส่วนใน Highcharts เวอร์ชันใหม่กว่าตั้งแต่เขียนคำตอบนี้และนำมาจากคำตอบจาก @davertron, @Moes และ @Przy โปรดเพิ่มคะแนนความคิดเห็น / คำตอบของพวกเขาเนื่องจากพวกเขาสมควรได้รับเครดิตสำหรับสิ่งเหล่านี้ การเพิ่มที่นี่เนื่องจากคำตอบที่ยอมรับนี้จะไม่สมบูรณ์หากไม่มีคำตอบเหล่านี้


10
ดูเหมือนว่าในเวอร์ชัน 2.3.4 Highcharts จะติดตามชาร์ตทั้งหมดบนหน้า: api.highcharts.com/highcharts#Highcharts
davertron

@davertron ขอบคุณสำหรับการอัปเดต ... นั่นเป็นคุณสมบัติที่ดีที่จะมีไม่ต้องใช้รหัส / ความพยายามมากนักในการมีสิ่งนี้ ...
Jugal Thakkar

+1 สำหรับ $ ("# container") data ('highchartsChart') เป็นดัชนี highcharts มีประโยชน์มากขอบคุณ!
Shahar

1
วิธีการที่คล้ายกันที่ฉันสามารถใช้สำหรับ highstock?
tnkh

45

คุณสามารถทำได้

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

ตรวจสอบตัวอย่างเกี่ยวกับ fiddler


มันไม่ได้ผลสำหรับฉันฉันต้องใช้คำตอบ @Frzy ฉันใช้เวอร์ชัน 4.1.4
David Torres

ไม่แน่ใจว่าทำไมมันถึงไม่ได้ผลสำหรับคุณตัวอย่างซอใช้ v4.2.3
Nerdroid

1
กำลังส่งคืนองค์ประกอบคอนเทนเนอร์แทนแผนภูมิและนั่นคือเหตุผลที่คำตอบของ @Frzy ใช้งานได้ นอกจากนี้ฉันพบวิธีแก้ปัญหาอื่น:$("#testDivId").highcharts({...}, function(chart) {...});
David Torres

แน่นอนมันส่งคืนวัตถุjsfiddle.net/abbasmhd/86hLvc5sตรวจสอบเอาต์พุตคอนโซลหลังจากที่คุณคลิกปุ่ม
Nerdroid

1
ใช่ใน jsfiddle กำลังทำเช่นนั้นฉันเห็นด้วย แต่ไม่ใช่สำหรับทุกคนที่ทำงานเหมือนกันอย่างที่คุณเห็นจาก 11 upvotes ของคำตอบ @Frzy
David Torres

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

chartCont เป็นวัตถุ jQuery chartObj คือ Highchart Chart Object

นี่คือการใช้ Highcharts 3.01


10

เพียงแค่ใช้ JS บริสุทธิ์:

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

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

หวังว่ามันจะช่วยคุณได้!


5

ไม่มี jQuery (วานิลลา js):

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 เป็นแบบโกลบอลดังนั้นคุณจึงสามารถใช้เพื่อเข้าถึงออบเจ็กต์ de highchart ได้ไม่ว่าจะเป็นคอนเทนเนอร์

chart1.redraw();

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 :

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.